2014-11-18 62 views
10

skopiowanymi prosto z samouczka Braintree, można utworzyć token klienta z identyfikatorem klienta tak:Nie można utworzyć Braintree żeton klienta z identyfikatorem klienta

gateway.clientToken.generate({ 
    customerId: aCustomerId 
}, function (err, response) { 
    clientToken = response.clientToken 
}); 

Oświadczam var aCustomerId = "customer" ale node.js zamyka z błędem

new TypeError('first argument must be a string or Buffer') 

Kiedy próbuję wygenerować token bez customerId, wszystko działa w porządku (chociaż nigdy nie dostać nowy klient żeton ale to inna kwestia).

EDIT: Oto kompletny kod testu na żądanie:

var http = require('http'), 
    url=require('url'), 
    fs=require('fs'), 
    braintree=require('braintree'); 

var clientToken; 
var gateway = braintree.connect({ 
    environment: braintree.Environment.Sandbox, 
    merchantId: "xxx", //Real ID and Keys removed 
    publicKey: "xxx", 
    privateKey: "xxx" 
}); 

gateway.clientToken.generate({ 
    customerId: "aCustomerId" //I've tried declaring this outside this block 
}, function (err, response) { 
    clientToken = response.clientToken 
}); 

http.createServer(function(req,res){ 
    res.writeHead(200, {'Content-Type': 'text/html'}); 
    res.write(clientToken); 
    res.end("<p>This is the end</p>"); 
}).listen(8000, '127.0.0.1'); 
+0

można podać trochę więcej kontekst wokół kodu używasz? –

Odpowiedz

16

Disclaimer: pracować dla Braintree :)

przykro mi słyszeć, że masz problemy z realizacji. Jest kilka rzeczy, które może być nie tak tutaj:

  1. Jeśli określisz customerId podczas generowania token klienta, musi być ważny jeden. Nie musisz podawać identyfikatora klienta podczas tworzenia tokena klienta po raz pierwszy. Zwykle tworzysz create a customer podczas obsługi składania formularza kasy, a następnie przechowujesz ten identyfikator klienta w bazie danych do późniejszego wykorzystania. Porozmawiam z naszym zespołem dokumentacyjnym o wyjaśnieniu dokumentacji na ten temat.
  2. res.write przyjmuje ciąg lub bufor. Ponieważ pisałeś response.clientToken, który był undefined, ponieważ został utworzony z nieprawidłowym identyfikatorem klienta, otrzymałeś błąd first argument must be a string or Buffer.

Niektóre inne uwagi:

  • Jeśli utworzysz żeton z nieprawidłowym customerId, czy istnieje inny błąd przetwarzania żądania, response.success będzie fałszywy, można następnie przejrzeć odpowiedź na powód nie powiodło się.
  • Powinieneś wygenerować swój token klienta w ramach procedury obsługi żądań HTTP, co pozwoli ci wygenerować różne tokeny dla różnych klientów i lepiej poradzić sobie z problemami wynikającymi z twojego żądania.

Poniższy kod powinien działać, pod warunkiem podać poprawny customerId

http.createServer(function(req,res){ 
    // a token needs to be generated on each request 
    // so we nest this inside the request handler 
    gateway.clientToken.generate({ 
    // this needs to be a valid customer id 
    // customerId: "aCustomerId" 
    }, function (err, response) { 
    // error handling for connection issues 
    if (err) { 
     throw new Error(err); 
    } 

    if (response.success) { 
     clientToken = response.clientToken 
     res.writeHead(200, {'Content-Type': 'text/html'}); 
     // you cannot pass an integer to res.write 
     // so we cooerce it to a string 
     res.write(clientToken); 
     res.end("<p>This is the end</p>"); 
    } else { 
     // handle any issues in response from the Braintree gateway 
     res.writeHead(500, {'Content-Type': 'text/html'}); 
     res.end('Something went wrong.'); 
    } 
    }); 

}).listen(8000, '127.0.0.1'); 
+0

@Rob correct. Zwykle dla klienta po raz pierwszy nie masz identyfikatora (co jest całkiem w porządku), ale dla klientów powracających identyfikator będzie przechowywany w bazie danych wraz z danymi klienta, a Ty będziesz chciał go użyć podczas generowania tokena klienta. –

+2

Mam ten sam problem dla pierwszego klienta. Ale chcę, aby kod działał po raz pierwszy i odbierał klientów! Jeśli dołączę identyfikator customerId, spowoduje to błąd dla pierwszego klienta, ale jeśli go nie uwzględnię, klient powrotny nie będzie miał karty kredytowej. Więc jak mogę to poprawnie wdrożyć ?! –

+0

@HughHou Niestety nie można tego zrobić bez dodania logiki do obsługi zarówno nowych, jak i dotychczasowych klientów. Zwykle można przechowywać braintree 'customerId' na modelu użytkownika w magazynie danych aplikacji.Następnie możesz sprawdzić, czy użytkownik ma w swoim kontrolerze identyfikator klienta o imieniu Braintree; jeśli tak, to włączysz opcję "clientToken.generate", w przeciwnym razie utworzysz klienta Braintree, zapiszesz go w swoim magazynie danych i użyjesz go do wygenerowania tokena klienta. –