Полосовой заряд не проходит - PullRequest
0 голосов
/ 17 апреля 2019

Я использую Stripe API для тестирования платежей, и заряд не проходит.Я токенизирую кредитную карту, а затем использую токен в качестве параметра «источника».Я сделал то же самое в Python, и он работал нормально, но когда я попытался использовать это с Node.js, он не работал.

Вот мой код:

var stripe = require("stripe")(<key>);

var pay = stripe.tokens.create({
  card: {
   number: '<number>',    // note, for now I'm just using the stripe test credentials
   exp_month: <exp>,
   exp_year: <year>,
   cvc: '<cvc>'
}
}, function(err, token) {
  console.log(err); // null
  console.log(token); // token information (works fine)
  return token;
});

stripe.charges.create({
  amount: 500,
  currency: "usd",
  source: pay, 
  description: "Test charge"
  }, function(err, charge) {
   console.log(err); // error message 400, missing parameter
   console.log(charge); //  still null
 });

Чтоя делаю не так?Как я уже сказал, когда я делал это, используя Python, он работал нормально.

Обновление: Я перепробовал все решения, опубликованные ниже, и все они по-прежнему возвращают код ошибки 400.Если у кого-то есть другое решение, оно будет оценено.

_____________________________________________________________________________ Обновление 2: Для всех, кто ищет ответ, я разобрался с ним и разместил его ниже.

Ответы [ 4 ]

1 голос
/ 17 апреля 2019

Несколько вещей:

  1. stripe.tokens.create возвращает Обещание, а не значение. Вы должны присвоить token чему-то в нужной области видимости, чтобы использовать его в другом месте, или просто передать его функции, которая его использует:
stripe.tokens.create({
  card: {
    number: '<number>',    // note, for now I'm just using the stripe test credentials
    exp_month: <exp>,
    exp_year: <year>,
    cvc: '<cvc>'
  }
}, function(err, token) {
  console.log(err); // null
  console.log(token); // token information (works fine)

  // call a function which in turn calls stripe.charges.create
  makeCharge(token);
});
  1. Вы не должны генерировать токены на своем бэкэнде, это подвергает вас самой широкой области соответствия PCI https://stripe.com/docs/security#validating-pci-compliance. Вместо этого используйте Stripe Elements или устаревшую Checkout на вашем внешнем интерфейсе для токенизации карт.
  2. JavaScript является асинхронным, а не синхронным, посмотрите, как использовать async / await , если вам нужны синхронные операции.
1 голос
/ 17 апреля 2019

Вы можете подумать, просто используя источник по умолчанию из идентификатора клиента полосы, созданного пользователем.

return stripe.customers.retrieve(stripeCustomerId)
                .then((customer) => customer.default_source)

Вы получите клиентский источник по умолчанию, если он доступен, и после этого просто создайте плату, используя этот источник.

const strpChrg = {
            customer: stripeCustomerId,
            amount: _.round(amount * 100), // convert to cents
            currency: _.toLower(currency), // usd
            source: sourceId
 };
 // create stripe charge using customer token
 return stripe.charges.create(strpChrg).then((charge) => {
            // add charge to data
            return charge;
 });

Вы не должны создавать токен в бэкэнде, вместо этого используйте источник по умолчанию в полосе, добавленный клиентом.

1 голос
/ 17 апреля 2019

Методы create работают асинхронно. Если вы хотите использовать только что созданный токен, то вы должны сделать это в обратном вызове. Чтобы лучше понять это, проверьте этот код:

var stripe = require("stripe")(<key>);

var pay = stripe.tokens.create({
  card: {
   number: '<number>',    // note, for now I'm just using the stripe test credentials
   exp_month: <exp>,
   exp_year: <year>,
   cvc: '<cvc>'
}, function(err, token) {
  console.log(err); // null
  console.log(token); // token information (works fine)
  return token;
});

console.log(pay); // This will not be what you expected.

pay не будет значением token, поскольку запрос еще не завершен.

Вместо этого вам нужно создать свой заряд внутри обратного вызова для токена. Эта функция обратного вызова выполняется после завершения веб-запроса на создание токена.

var stripe = require("stripe")(<key>);

stripe.tokens.create({
  card: {
   number: '<number>',    // note, for now I'm just using the stripe test credentials
   exp_month: <exp>,
   exp_year: <year>,
   cvc: '<cvc>'
}, function(err, token) {
  console.log(err); // null
  console.log(token); // token information (works fine)
  stripe.charges.create({
    amount: 500,
    currency: "usd",
    source: token, // note I changed this to token 
    description: "Test charge"
  }, function(err, charge) {
    console.log(err); // hopefully null now 
    console.log(charge); // hopefully has charge info now
    // add code to display a confirmation message or whatever you want to do with the successful charge here
  });
});

Отказ от ответственности: я не знаком с кодом Stripe. Я просто понимаю, как работает асинхронный JS. Создание токена каждый раз может быть или не быть наилучшей практикой.

0 голосов
/ 18 апреля 2019

Для тех, кто хочет создавать обвинения таким образом, вот как я понял это с Node.js (для таких как я, которые пришли из python, это будет очень полезно):

stripe.tokens.create({
card: {
    number: '<card number>',
    exp_month: <exp>,
    exp_year: <year>,
    cvc: '<cvc>'
}
}, function(err, token) {
   console.log(token.id); // you can log the entire token, or you can just check for the piece you need
   stripe.charges.create({
      amount: 800,
      currency: "usd",
      source: token.id,  // instead of in python where you can use a variable, in node you have to use specifically the id
      description: "Test charge"
  }, function(err, charge) {
      console.log(err);  // if it does not work, make sure to print the error
      console.log(charge) // print the charge to make sure it went through
   });
});

Надеюсь, это поможет кому-нибудь по дороге!

Примечание: Как уже упоминалось, для производства это, вероятно, не то, что вы хотите делать, это решение больше подходит для ознакомления с Stripe API или тестирования быстрых платежей.

...