无法获得条带支付意图成功元数据

Posted

技术标签:

【中文标题】无法获得条带支付意图成功元数据【英文标题】:Can't get stripe payment Intent success metadata 【发布时间】:2020-10-08 20:29:53 【问题描述】:

我是使用条带支付的新手,所以我决定让它变得简单,并从条带文档中实现了 redirectToCheckout 和条带 webhook,我按照步骤操作,首先我从条带的仪表板创建了一个产品,然后我添加了一些元数据键和价值,最后我在 Angular 上编写了我的代码,一切都很好,直到我意识到我没有得到预期的元数据,实际上它是空的。

我使用 Firebase 云函数作为后端,使用 Angular 框架作为前端,这是我的代码:

角度

stripe.redirectToCheckout(
  lineItems: [ price: itemSku, quantity: 1],
  mode: 'payment',
  customerEmail: this.userEmail,
  successUrl: 'http://localhost:4200/purchase/success',
  cancelUrl: 'http://localhost:4200/purchase/failed'
)

Firebase 云功能

app.post('/webhook', bodyParser.raw(type: 'application/json'), (request, response) => 
    const sig = request.headers['stripe-signature'];
    let event;
    try 
        event = stripe.webhooks.constructEvent(request.rawBody, sig, endpointSecret);
     catch (err) 
        response.status(404).end()
    

    const intent = event.data.object
    switch (event.type) 
        case constants.INTENT_SUCCESS:
            // it prints the object with empty metadata
            console.log('Success object:', intent);  <- metadata:
            break;
        case constants.INTENT_FAILED:
            console.log('Failed:', intent.id);
            break;
    
    response.json(received: true);
    response.sendStatus(200)
);

【问题讨论】:

您在条带控制台中看到了什么?是否调用了 webhook? 感谢您的回答。是的,但元数据在付款意图成功对象处是 metadata:,我需要它以及我已经在产品仪表板中设置的元数据 你看到意图对象的其他属性还是完全为空? 是的,我可以看到对象的其他属性的值,但看不到这个的值:( 【参考方案1】:

Stripe 中的每个对象都有不同的元数据。听起来元数据已添加到 Product 对象,不会复制到 PaymentIntent

我会监听 checkout.session.completed webhook 通知事件类型,然后获取 Checkout Session 和 expanding 它与 line_itemspriceproduct 相关。

  const session = await stripe.checkout.sessions.retrieve(
    "cs_test_xxx", 
      expand: ["line_items.data.price.product"]
    
  )
  console.log(res.line_items.data[0].price.product);

【讨论】:

感谢您的回答!!我要试试看,我会告诉你的;) 我有一个问题,我应该在哪里做这个?在 webhook 调用之外?对不起,我是新手 我会添加另一个常量,并在您的 webhook 开关中添加一行: switch (event.type) case constants.CHECKOUT_SUCCESS: const session... Stripe 不会将元数据从 Product 复制到 PaymentIntent 对我来说是直观的,因为这两个对象之间可能存在各种不规则的多对多关系。但是,对我来说非常不直观,如果您将元数据传递给 checkout.session 对象,它仍然不会传递给 PaymentIntent 对象,即使已完成的会话和已完成的付款之间存在一对一的关系. Stripe 的文档中目前没有提到这一点。你的解决方案,听checkout.session.completed event,似乎对我有用。 @cazort,您可以在技术上创建一个结帐会话,其中元数据直接附加到***会话,如果您通过payment_intent_data.metadata,则附加到付款意图范围。 stripe.com/docs/api/checkout/sessions/…

以上是关于无法获得条带支付意图成功元数据的主要内容,如果未能解决你的问题,请参考以下文章

未处理的承诺拒绝条带支付意图示例

Bluesnap 托管支付页面自定义元数据

在 Stripe Customer 对象 C# 中访问元数据时遇到问题

Code=50 “No such payment_intent” 当确认条带的支付意图时

重定向到条带后丢失会话数据

付款成功后迅速获取条带费用ID