使用nodeJS条纹创建付款意图

Posted

技术标签:

【中文标题】使用nodeJS条纹创建付款意图【英文标题】:stripe create payment intent with nodeJS 【发布时间】:2020-12-01 11:06:12 【问题描述】:

我正在尝试使用条纹付款。我付款后可以在浏览器上看到成功响应,但是当我在仪表板中签入时,它没有添加到那里。

const express = require("express");
const stripe = require("stripe")("enter your API sk_test");

const app = express();
const port = 8000;

app.post("/charge", async (req, res, next) => 
  try 
    await stripe.paymentIntents.create(
      
        amount: 200,
        currency: "gbp",
        payment_method_types: ["card"],
        receipt_email: "hadeklte@gmail.com",
      ,
      function (err, paymentIntent) 
        if (err) 
          throw new Error("failed to charge");
        
        res.status(200).send(paymentIntent);
      
    );
   catch (err) 
    console.log(err, "error occure");
  
);

app.listen(port, () => 
  console.log(`Server is up at $port`);
);

上面的一些类似的反应


    "id": "pi_1HF19PGz03sGbVedIHyeBeLq",
    "object": "payment_intent",
    "amount": 200,
    "amount_capturable": 0,
    "amount_received": 0,
    "application": null,
    "application_fee_amount": null,
    "canceled_at": null,
    "cancellation_reason": null,
    "capture_method": "automatic",
    "charges": 
        "object": "list",
        "data": [],
        "has_more": false,
        "total_count": 0,
        "url": "/v1/charges?payment_intent=pi_1HF19PGz03sGbVedIHyeBeLq"
    ,
    ...

在检查了我看到的文档后,要继续我应该附上付款方式并确认付款here。然后确认我使用这行代码

app.post("/charge", async (req, res, next) => 
  let charged;
  try 
    await stripe.paymentIntents.create(
      
        amount: 200,
        currency: "gbp",
        payment_method_types: ["card"],
        receipt_email: "hadeklte@gmail.com",
      ,
      function (err, paymentIntent) 
        if (err) 
          console.log(err, "failed payment");
        
        charged = paymentIntent.id;
      
    );
   catch (err) 
    return res.status(500).send(err);
  

  console.log(charged);
  try 
    await stripe.paymentIntents.confirm(
   // "pi_1HF19PGz03sGbVedIHyeBeLq",
        charged
       payment_method: "pm_card_visa" ,
      function (err, paymentIntent) 
        if (err) 
          console.log(err, "failed confirmation");
        
        res.status(200).send(paymentIntent);
      
    );
   catch (err) 
    return res.status(500).send(err);
  
);

如果我将参数作为字符串传递给 stripe.paymentIntent.confirm,它会响应成功,就像我评论的那样,它确实有效,但是当我将 Id 作为收费传递时,它确实会给我一个错误

undefined
Error: Stripe: Argument "intent" must be a string, but got: undefined (on API request to `POST /payment_intents/intent/confirm`)
    at urlParams.reduce (E:\projects\Stripe\Stripe_API_Docs\node_modules\stripe\lib\makeRequest.js:21:13)
    at Array.reduce (<anonymous>)
    at getRequestOpts (E:\projects\Stripe\Stripe_API_Docs\node_modules\stripe\lib\makeRequest.js:18:29)
    at Promise (E:\projects\Stripe\Stripe_API_Docs\node_modules\stripe\lib\makeRequest.js:69:14)
    at new Promise (<anonymous>)
    at makeRequest (E:\projects\Stripe\Stripe_API_Docs\node_modules\stripe\lib\makeRequest.js:66:10)
    at Constructor.confirm (E:\projects\Stripe\Stripe_API_Docs\node_modules\stripe\lib\StripeMethod.js:31:7)
    at app.post (E:\projects\Stripe\Stripe_API_Docs\app.js:70:33)
    at processTicksAndRejections (internal/process/task_queues.js:86:5) 'failed confirmation'

现在我如何将在创建函数中创建的 paymentIntent.id 传递给未定义的确认函数。

【问题讨论】:

您想在回调函数 function (err, paymentIntent) 内运行第二个函数 stripe.paymentIntents.confirm(,您遇到了范围问题,这就是它未定义的原因 为了将来参考,从现在到永远,永远不要在任何地方发布您的client_secret。既然你这样做了,你就必须撤销那个秘密并生成一个新的。 嗨 Ermias,为了让这更简单,而不是有两个单独的调用;一个是创建付款意图,另一个是在确认付款意图之后。您可以在一个呼叫中创建并确认付款意图,如下面的示例所示:stripe.com/docs/payments/…。基本上,您在创建付款意图时提供payment_method,并指定设置为trueconfirm 参数:stripe.com/docs/api/payment_intents/… 【参考方案1】:

最后我发现问题出在@JimithyPicker 的范围内 声明

app.post("/charge", async (req, res, next) => 
  var charged;
  try 
    charged = await stripe.paymentIntents.create(
      amount: 200,
      currency: "gbp",
      payment_method_types: ["card"],
      receipt_email: "hadeklte@gmail.com",
    );
   catch (err) 
    return res.status(500).send(err);
  

  console.log(charged);
  try 
    const paymentConfirm = await stripe.paymentIntents.confirm(
      charged.id,
       payment_method: "pm_card_visa" 
    );
    res.status(200).send(paymentConfirm);
   catch (err) 
    return res.status(500).send(err);
  

);

【讨论】:

以上是关于使用nodeJS条纹创建付款意图的主要内容,如果未能解决你的问题,请参考以下文章

Stripe 取消 url 不会取消付款,因此 Stripe 不会发送取消付款意图

条纹设置意图

带条纹和 SCA 的 Ionic 4 Cordova 付款

付款意图 Sirikit 仍然无法正常工作

带有付款意图的 Stripe Refund

React Paypal 按钮意图