对条带付款使用付款方式意图

2022-02-25 00:00:00 node.js javascript stripe-payments

我有这个:

const stripe = require('stripe')('sk_test', {
        stripeAccount: 'acct_...'
    });
const paymentIntent = await stripe.paymentIntents.create({
    amount: 1900,
    currency: 'cad',
    customer: 'cus_...',
    // confirm: true,
  }, {
    stripeAccount: 'acct_...',
});
console.log(paymentIntent)
然后我运行这个paymentIntent,它可以工作,但不会实际向客户收费,因为它显示没有存档的付款方式。然后我使用这个客户id,并查看我的条纹仪表板,它显示了那里的支付方式,并且该方法与id相匹配。所以现在我相信我在创建paymentIntent时做错了什么,但是付款正在进行,只是没有确认,因为它说没有附加付款方式!那么,为什么这不起作用呢?

错误:UnhandledPromiseRejectionWarning: Error: You cannot confirm this PaymentIntent because it's missing a payment method. You can either update the PaymentIntent with a payment method and then confirm it again, or confirm it again directly with a payment method.


解决方案

PaymentIntent需要支付方式对象,如;

   payment_method_types: [card],

PaymentIntent对象

   const {
  error: backendError,
  clientSecret,
  paymentIntentId,
  transfer_group,
} = await fetch('/create-payment-intent', {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    paymentMethodType: 'card',
    currency: 'cad',
    customerEmail: billingDetails.email,
    description: 'Basket_Order_Id',
  }),
}).then((r) => r.json());
 and when you created the paymentintent on your backend you should return 

  app.post('/create-payment-intent', async (req, res) => {
  const {paymentMethodType, currency, customerEmail, description, 
   suppliers} =
  req.body;
  console.log('paymentIntent Create requ body', req.body);

  req.session.suppliers = suppliers;
  suppliersArray = suppliers;

 const idEmpotency = nanoid();
 // Each payment method type has support for different currencies. In order 
 to
 // support many payment method types and several currencies, this server
 // endpoint accepts both the payment method type and the currency as
// parameters
//
 // Some example payment method types include `card`, `ideal`, and 
`alipay`.
 const params = {
payment_method_types: [paymentMethodType], 'CARD'
amount: 20000,
currency: currency,
description: description,
receipt_email: customerEmail,
statement_descriptor_suffix: 'Your Bank Descriptor on Customer Account',
transfer_group: idEmpotency,
// confirm: true,
// capture_method: 'manual',
 };
   try {
   const paymentIntent = await stripe.paymentIntents.create(params);

// Send publishable key and PaymentIntent details to client
console.log('paymentIntent', paymentIntent);

res.send({
  clientSecret: paymentIntent.client_secret, - SENDING YOUR CLIENTSECRET
  paymentIntentId: paymentIntent.id,
  transfer_group: paymentIntent.transfer_group,
});
   }   catch (e) {
  return res.status(400).send({
  error: {
    message: e.message,
   },
   });
   }
  });

  client_secret and use it on your front-end 



 const {error: stripeError, paymentIntent} = await stripe.confirmCardPayment(
  clientSecret, USE YOUR CLIENT SECRET THAT RETURNED FROM YOUR BACKEND FROM  PAYMENT INTENT OBJECT
  {
    payment_method: {
      card: elements.getElement(CardElement),
      billing_details: {
        name: 'Michael',
      },
    },
  }
);


 Before confirming the client_secret that returned from payment_intent you can not succesfully confirm the payment.

 You can use stripe elements to start with their own card payment component.

 I recommend you to check here https://stripe.com/docs/payments/quickstart, you will get more idea...

相关文章