简体   繁体   English

使用支付方式进行条带支付意图

[英]use payment method for stripe paymentintent

I have this:我有这个:

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)

so then I go to run this paymentIntent, and it works, but doesn't actaully charge the customer because it says that it has no payment method on file.所以然后我 go 来运行这个 paymentIntent,它可以工作,但实际上并没有向客户收费,因为它说它没有存档的付款方式。 So then I take this customers id, and look at my stripe dashboard, and it shows the payment method there, and the method matches with the id.然后我拿这个客户 ID,查看我的条纹仪表板,它在那里显示了付款方式,并且该方法与 ID 匹配。 so now I believe I am doing something wrong creating the paymentIntent , but the payment is going through, just not confirmed because it says no payment method attached?所以现在我相信我在创建paymentIntent时做错了,但是付款正在进行中,只是没有确认,因为它说没有附加付款方式? So why is this not working?那么为什么这不起作用呢?

error: 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.错误: 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. 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 requires a Payment Method Object such as; PaymentIntent 需要付款方式 Object,例如;

   payment_method_types: [card],

PaymentIntent object PaymentIntent object

   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...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM