Полоса: возможно ли создать прямой заряд с идемпотентностью - PullRequest
1 голос
/ 03 ноября 2019

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

const charge = {
  amount,
  currency,
  source} ;

return stripe.charges.create(
  charge ,
  {stripe_account: stripeVendorAccount});

Вопрос: есть ли способ включить опцию идемпотентности в объект заряда? Если нет, каков наилучший способ избежать дублирования платежей?

Я пробовал это, но это не работает

const charge = {
  amount,
  currency,
  source} ;

return stripe.charges.create(
  charge ,
  {stripe_account: stripeVendorAccount},
  {idempotency_key });

РЕДАКТИРОВАТЬ : это моя функция

exports.stripeCharge = functions.database
                                .ref('/payments/{userId}/{paymentId}')
                                .onWrite( (change,context) => {
const payment = change.after.val();
const userId = context.params.userId;
const paymentId = context.params.paymentId;
const stripeVendorAccount = 'xx'
// checks if payment exists or if it has already been charged
if (!payment || payment.charge) return;
return admin.database()
              .ref(`/users/${userId}`)
              .once('value')
              .then(snapshot => {
return snapshot.val();
               })
               .then(async customer => {
const amount = payment.amount;
const idempotency_key = paymentId;  // prevent duplicate charges
const source = payment.token.id;
const currency = payment.currency;
const application_fee = payment.application_fee;
const description = payment.description;



//-------- destination charges
// const transfer_data = {destination: stripeVendorAccount};
// const charge = {
//   amount,
//   currency,
//   description,
//   transfer_data,
//   source};
// return stripe.charges.create(charge , { idempotency_key });
//                })
//                .then(charge => {
// admin.database()
//                         .ref(`/payments/${userId}/${paymentId}/charge`)
//                         .set(charge);
//                         return true;
//                   })
//-------- destination charges

//-------- DIRECT charges
const charge = {
  amount,
  currency,
  description,
  application_fee,
  source} ;

return stripe.charges.create(charge ,{stripe_account: stripeVendorAccount});
               })
               .then(charge => {
admin.database()
                        .ref(`/payments/${userId}/${paymentId}/charge`)
                        .set(charge);
                        return true;
                  })

});

1 Ответ

1 голос
/ 03 ноября 2019

Ну, я думаю, что создание заряда не идемпотентно по определению, так как заряд обычно связан с одной покупкой. (Если пользователь инициирует покупку одного и того же товара три раза подряд, это приведет к трем различным заказам / расходам). Я не знаю, как вы сейчас реализуете бизнес-логику, стоящую за интеграцией в электронную коммерцию. Но если вы просто хотите избежать создания нескольких сборов для одного заказа, вы должны идентифицировать ваши заказы с уникальным идентификатором и сохранить его в базе данных. В вашем методе оплаты запрос из базы данных, если уже есть плата за эту покупку, если не создать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...