2014-11-18 12 views
10

copiato direttamente dal tutorial di Braintree, è possibile creare un token di client con un ID cliente come questo:Impossibile creare token di client Braintree con ID cliente

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

Dichiaro var aCustomerId = "customer" ma node.js si chiude con l'errore

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

Quando provo a generare un token senza il customerId, tutto funziona bene (anche se non ho mai ottenere un nuovo cliente pedina ma questa è un'altra questione).

EDIT: Ecco il codice completo di prova, come richiesto:

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

può fornire un po 'più di contesto attorno al codice che si sta utilizzando? –

risposta

16

Disclaimer: io lavoro per Braintree :)

Mi dispiace di sentire che si stanno avendo problemi con l'implementazione. Ci sono alcune cose che potrebbero andare male qui:

  1. Se si specifica un customerId quando si genera un token di cliente, deve essere uno valido. Non è necessario includere un ID cliente quando si crea un token client per i nuovi clienti. Generalmente si crea create a customer quando si gestisce l'invio del modulo di checkout e quindi si memorizza quell'ID cliente in un database per utilizzarlo in un secondo momento. Parlerò con il nostro team di documentazione per chiarire la documentazione intorno a questo.
  2. res.write prende una stringa o un buffer. Poiché stavi scrivendo response.clientToken, che era undefined perché è stato creato con un ID cliente non valido, hai ricevuto l'errore first argument must be a string or Buffer.

Alcune altre note:

  • Se si crea un token con un invalido customerId, o c'è un altro errore durante l'elaborazione della richiesta, response.success sarà falso, è possibile ispezionare la risposta per il motivo per cui E 'fallito.
  • Dovresti generare il tuo token client all'interno del gestore di richieste http, questo ti consentirà di generare diversi token per diversi clienti e di gestire meglio eventuali problemi derivanti dalla tua richiesta.

Il seguente codice dovrebbe funzionare, a patto di specificare una valida 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 corretto. In genere per un cliente per la prima volta non si dispone di un ID (che è perfettamente valido), ma per i clienti che ritornano l'ID verrà archiviato nel database accanto ai dettagli del cliente e si vorrà utilizzarlo durante la generazione del token del client. –

+2

Ho lo stesso problema per il cliente prima volta. Ma voglio che il codice funzioni solo sia per la prima volta che per i clienti di ritorno! Se includo l'ID cliente, genera un errore per il cliente prima volta, ma se non lo includo, il cliente di ritorno non avrà la carta di credito salvata. Quindi come faccio a implementarlo correttamente ?! –

+0

@HughHou Sfortunatamente non c'è modo di farlo senza aggiungere qualche logica per gestire sia i clienti nuovi che quelli esistenti. In genere si memorizza il concetto di cliente su un modello utente nel datastore dell'applicazione.Potresti quindi verificare se un utente ha un ID cliente braintree nel tuo controller; se lo fanno, includeresti le opzioni su "clientToken.generate" altrimenti creerai il cliente braintree, lo salverà nel tuo archivio dati e lo userai per generare il token client. –

Problemi correlati