2014-11-18 21 views
10

ile Braintree istemcisi belirteci oluşturulamaz, böyle bir müşteri kimliğiyle bir istemci belirteci oluşturabilirsiniz:Braintree en öğretici doğrudan Kopyalanan müşteri kimliğiyle

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

Ben var aCustomerId = "customer" beyan ama node.js hata ile kapanır

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

Ben CustomerId olmadan bir belirteç oluşturmak için çalıştığınızda (yeni istemci simgesi asla olsa ama bu başka bir soru) her şey çalışıyor.

DÜZENLEME:

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

kullandığınız kod etrafında biraz daha fazla bağlam sağlayabilir belirtmek gerekir? –

cevap

16

Yasal Uyarı: Ben Braintree için çalışmak :)

ben size uygulanması ile sorun yaşıyorsanız duyduğuma üzüldüm İşte istendiği gibi komple bir test kodudur. Burada yanlış gidiyor olabilecek bir kaç şey vardır: Bir istemci belirteci oluştururken bir customerId belirtirseniz

  1. , bir geçerli olmak zorundadır. İlk kez müşteriler için müşteri belirteci oluştururken müşteri kimliğini eklemeniz gerekmez. Tipik olarak, ödeme formunuzun gönderimini işlerken create a customer'u oluşturacak ve daha sonra kullanmak için bu müşteri kimliğini bir veritabanında saklayacaksınız. Bu konuyla ilgili dokümantasyonu açıklamak için dokümantasyon ekibimizle konuşacağım.
  2. res.write bir dize veya arabelleğe alır. , undefined olan ve geçersiz bir müşteri kimliği ile oluşturulduğundan, first argument must be a string or Buffer hatasını alıyorsunuz.

Diğer bazı notlar:

  • Geçersiz bir customerId sahip bir belirteç oluşturabilir veya başka hata İsteğiniz işleme varsa, response.success yanlış olacaktır, daha sonra nedenle niçin yanıtını inceleyebilirsiniz başarısız oldu.
  • İstemci işleyicinizi http istek işleyicisinde oluşturmalısınız; bu, farklı müşteriler için farklı belirteçler oluşturmanıza ve isteğinizden kaynaklanan sorunları daha iyi ele almanıza olanak tanır.

Aşağıdaki kod çalışmak, verilen geçerli bir 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 doğru. Tipik olarak bir ilk kez müşteri için bir kimlik (tam olarak iyi) olmazdı, ancak geri dönen müşteriler için bu kimlik, müşterinin ayrıntılarıyla birlikte veritabanınızda saklanırdı ve bunu istemci belirtecinizi oluştururken kullanmak istersiniz. –

+2

İlk kez müşteri için aynı sorunu yaşıyorum. Ama kodun sadece ilk kez çalışmasını ve müşterilere dönüşmesini istiyorum! CustomerId'yi eklediysem, ilk kez müşteri için hata atardım, ancak eklediğimde, iade müşterisi tasarruf kredisine sahip olmayacaktır. Peki bunu doğru bir şekilde nasıl uygularım? –

+0

@HughHou Ne yazık ki, hem yeni hem de mevcut müşterileri işlemek için bir mantık eklemeden bunu yapmanın bir yolu yoktur. Tipik olarak, 'customerId' braintree'sini, uygulamanızın veri deposundaki bir kullanıcı modelinde depolarsınız.Daha sonra, bir kullanıcının denetleyicinizde braintree müşteri kimliğine sahip olup olmadığını kontrol edebilirsiniz; eğer yaparlarsa, 'clientToken.generate' seçeneklerine dahil edersiniz, aksi takdirde braintree müşterisini yaratır, veri mağazasına kaydedersiniz ve istemci belirtecini oluşturmak için kullanırsınız. –