Не удается создать токен клиента Braintree с идентификатором клиента

Скопированный непосредственно из учебника Braintree, вы можете создать клиентский токен с идентификатором клиента следующим образом:

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

Я объявляю var aCustomerId = "customer", но node.js закрывается с ошибкой

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

Когда я пытаюсь сгенерировать токен без идентификатора клиента, все работает нормально (хотя я никогда не получаю новый токен клиента, но это другой вопрос).

РЕДАКТИРОВАТЬ: Вот полный тестовый код по запросу:

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');

person Rob    schedule 18.11.2014    source источник
comment
Можете ли вы предоставить немного больше контекста вокруг кода, который вы используете?   -  person Nick Tomlin    schedule 18.11.2014


Ответы (1)


Отказ от ответственности: я работаю в Braintree :)

Мне жаль слышать, что у вас возникли проблемы с реализацией. Здесь есть несколько вещей, которые могут пойти не так:

  1. Если вы укажете customerId при создании токена клиента, он должен быть допустимым. Вам не нужно включать идентификатор клиента при создании токена клиента для новых клиентов. Обычно вы должны создать создать клиента при обработке отправка формы оформления заказа, а затем сохраните этот идентификатор клиента в базе данных для последующего использования. Я поговорю с нашей командой по документации, чтобы уточнить документацию по этому поводу.
  2. res.write принимает строку или буфер. Поскольку вы писали response.clientToken, который был undefined, потому что он был создан с недопустимым идентификатором клиента, вы получали ошибку first argument must be a string or Buffer.

Некоторые другие примечания:

  • Если вы создадите токен с недопустимым customerId или при обработке вашего запроса возникнет другая ошибка, response.success будет ложной, вы сможете затем проверить ответ на предмет причины, по которой он не удался.
  • Вы должны сгенерировать свой клиентский токен в обработчике HTTP-запросов, это позволит вам создавать разные токены для разных клиентов и лучше справляться с любыми проблемами, возникающими в результате вашего запроса.

Следующий код должен работать, если вы укажете действительный 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');
person Nick Tomlin    schedule 18.11.2014
comment
@Роб правильно. Как правило, для первого клиента у вас не будет идентификатора (что совершенно нормально), но для постоянных клиентов идентификатор будет храниться в вашей базе данных вместе с данными этого клиента, и вы захотите использовать его при создании токена клиента. - person Nick Tomlin; 18.11.2014
comment
У меня такая же проблема, первый клиент. Но я хочу, чтобы код работал как в первый раз, так и для постоянных клиентов! Если я включу идентификатор клиента, он выдаст ошибку для первого клиента, но если я его не включу, у повторного клиента не будет сохраненной кредитной карты. Итак, как мне правильно это реализовать?! - person Hugh Hou; 11.09.2015
comment
@HughHou К сожалению, это невозможно сделать без добавления некоторой логики для обработки как новых, так и существующих клиентов. Как правило, вы должны хранить дерево мозгов customerId в пользовательской модели в хранилище данных вашего приложения. Затем вы можете проверить, есть ли у пользователя идентификатор клиента Braintree в вашем контроллере; если это так, вы должны включить параметры в clientToken.generate, в противном случае вы создаете клиента Braintree, сохраняете его в своем хранилище данных и используете для создания токена клиента. - person Nick Tomlin; 11.09.2015
comment
@NickTomlin Это также не лучшая практика, потому что клиенты могут быть удалены на панели управления BT вручную. Я рекомендую сначала попытаться найти клиента (developers.braintreepayments.com/reference/ request/customer/) и действовать соответственно. (Включайте идентификатор клиента в генерацию только в том случае, если клиент действительно существует) - person xnagyg; 25.10.2015
comment
@NickTomlin, должен быть дополнительный параметр, спрашивающий пользователя, если пользователь не существует, должны ли мы просто создать его, если установлено значение true. Braintree должен автоматически создавать нового пользователя, а не выдавать ошибку. в любом случае, я собираюсь обойти это, но было бы неплохо, если бы у вас, ребята, была такая возможность. - person Basit; 02.12.2015
comment
Возможно, вы захотите добавить примечание о том, что закомментирование параметра customerId применимо ко всем технологиям на стороне сервера. - person Nagama Inamdar; 05.05.2016
comment
stackoverflow.com/ вопросы/39716674/ - person Vivek Shankar; 27.09.2016
comment
@Nick Tomlin Идентификатор клиента - это UID пользователя? - person user1872384; 23.03.2018
comment
@ user1872384 это типичный шаблон, но это может быть любой идентификатор в вашем домене. - person Nick Tomlin; 23.03.2018
comment
Это должно быть частью официальной документации, которая не очень ясна в этом отношении. - person deekay42; 15.11.2018