2014-11-18 19 views
10

sao chép trực tiếp từ hướng dẫn Braintree, bạn có thể tạo ra một mã thông báo cho khách hàng với một ID của khách hàng như thế này:Không thể tạo Braintree thẻ khách hàng với ID khách hàng

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

Tôi tuyên bố var aCustomerId = "customer" nhưng Node.js kết thúc với các lỗi

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

Khi tôi cố gắng tạo mã thông báo mà không có customerId, mọi thứ hoạt động tốt (mặc dù tôi không bao giờ nhận được mã thông báo khách hàng mới nhưng đó là một câu hỏi khác).

EDIT: Đây là mã thử nghiệm hoàn chỉnh theo yêu cầu:

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

bạn có thể cung cấp một chút bối cảnh nhiều hơn xung quanh mã bạn đang sử dụng? –

Trả lời

16

Disclaimer: Tôi làm việc cho Braintree :)

Tôi xin lỗi khi biết rằng bạn đang gặp rắc rối với thực hiện của bạn. Có một vài điều có thể xảy ra ở đây:

  1. Nếu bạn chỉ định customerId khi tạo mã thông báo khách hàng, mã này phải hợp lệ. Bạn không cần phải bao gồm id khách hàng khi tạo mã thông báo khách hàng cho khách hàng lần đầu tiên. Thông thường bạn sẽ tạo ra create a customer khi xử lý việc gửi biểu mẫu thanh toán của bạn và sau đó lưu trữ id khách hàng đó trong cơ sở dữ liệu để sử dụng sau này. Tôi sẽ nói chuyện với nhóm tài liệu của chúng tôi về việc làm rõ tài liệu về điều này.
  2. res.write lấy một chuỗi hoặc bộ đệm. Vì bạn đang viết response.clientToken, là undefined vì nó được tạo với id khách hàng không hợp lệ, bạn nhận được lỗi first argument must be a string or Buffer.

Một số lưu ý khác:

  • Nếu bạn tạo một mã thông báo với một hợp lệ customerId, hoặc có lỗi khác thực hiện yêu cầu của bạn, response.success sẽ là sai lầm, bạn có thể kiểm tra việc đáp ứng cho lý do tại sao nó đã thất bại.
  • Bạn nên tạo mã thông báo ứng dụng khách trong trình xử lý yêu cầu http, điều này sẽ cho phép bạn tạo các mã thông báo khác nhau cho các khách hàng khác nhau và xử lý tốt hơn mọi vấn đề phát sinh từ yêu cầu của bạn.

Các mã sau đây nên làm việc, với điều kiện bạn chỉ định một giá trị 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 chính xác. Thông thường đối với khách hàng lần đầu tiên bạn không có id (hoàn toàn tốt), nhưng đối với khách hàng quay lại, id sẽ được lưu trữ trong cơ sở dữ liệu của bạn cùng với chi tiết của khách hàng đó và bạn muốn sử dụng nó khi tạo mã thông báo khách hàng của mình. –

+2

Tôi gặp vấn đề tương tự cho khách hàng lần đầu tiên. Nhưng tôi muốn mã chỉ hoạt động cho cả khách hàng đầu tiên và khách hàng cũ! Nếu tôi bao gồm customerId, nó sẽ gửi lỗi cho khách hàng lần đầu tiên, nhưng nếu tôi không bao gồm nó, khách hàng trả lại sẽ không có thẻ tín dụng tiết kiệm. Vậy làm thế nào để tôi thực hiện điều này một cách chính xác ?! –

+0

@HughHou Thật không may là không có cách nào để làm điều này mà không cần thêm một số logic để xử lý cả khách hàng mới và hiện tại. Thông thường, bạn sẽ lưu trữ 'customerId' braintree trên một mô hình người dùng trong kho dữ liệu của ứng dụng của bạn.Sau đó bạn có thể kiểm tra xem một người dùng có một id khách hàng braintree trong bộ điều khiển của bạn hay không; nếu họ làm, bạn sẽ bao gồm trong các tùy chọn để 'clientToken.generate' nếu không bạn tạo khách hàng braintree, lưu nó vào kho dữ liệu của bạn, và sử dụng nó để tạo ra mã thông báo máy khách. –

Các vấn đề liên quan