首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDS2 Stripe成功Webhook和其他问题

PDS2 Stripe成功Webhook和其他问题
EN

Stack Overflow用户
提问于 2019-09-05 14:56:03
回答 2查看 329关注 0票数 0

这是危险的TLDR -所以我的问题是:在成功的支付-条纹发送一个“成功”的有效负载到我的成功网钩。通过有效载荷,我无法看到任何我可以用来找出哪一笔付款是成功的。我应该把一些东西从我的条纹会话到我的等待付款吗?

更详细的情况:

为了遵守PSD2,我不得不重新调整我们的条纹支付。我们支持几个不同的支付选择,这影响了我的进程。

以前,用条纹,我们会得到一个象征性的-给它客户端.付款-订单保存到DB..。工作完成了。

现在,水流反转了..。

我有一个“条纹”按钮-客户点击它。向服务器发送一个帖子。在服务器上,我抓取客户购物车,并创建一个付款状态为挂起的订单。

然后创建一个条带会话-并将条带会话ID返回给客户端(代码被删减)

代码语言:javascript
复制
                  //creates order and returns Order ID
                  const orderid = await createOrder(cart); 

                  const stripeSession = await stripe.checkout.sessions.create({
                        customer_email: request.payload.billingEmail,
                        payment_method_types: ["card"],
                        line_items: [
                            {
                                name: "###",
                                description: "###" + orderid,
                                amount: cart.total.total,
                                currency: cart.total.currency,
                                quantity: 1
                            }
                        ],
                        success_url: "###" + orderid,
                        cancel_url: "###/checkout"
                    });

                    return {
                        stripeSessionID: stripeSession.id
                    };

在我的客户端上,我有这样一种方法,可以将帖子发送到服务器,并自动重定向到外部条签出页面:

代码语言:javascript
复制
        stripeCheckout: function () {
           ...
            axios.post('/pay/get-stripe-session', data)
                .then(function (response) {
                    var checkoutSessionID = response.data.stripeSessionID
                    stripe.redirectToCheckout({
                        sessionId: checkoutSessionID
                    }) ...

在成功的支付,条纹发送一个“成功”有效负载到我的成功网钩。我检查条形码-然后收到消息.这一切都有效..。但是,我在有效负载中看不到任何数据,可以用来将付款与订单相匹配(以便更新订单支付状态)。

当我创建我的条纹会话时,有什么可以使用的吗?

**编辑**

  1. 创建条带会话时,可以将client_reference_id.作为惟一键传递到create方法中。然而,条纹成功的web钩子不会在其有效负载中返回这个键-所以这不能用来协调一个成功的付款与一个订单。
  2. 我们有自己的客户帐户系统。根据旧的空气污染指数,我们可以设立一个收费: const要价=等待stripe.charges.create({ amount: const,orderid :orderid,const: token,// const Stripe.js description: orderid })

而且描述会出现在条纹仪表板上,这样就可以很容易地找到付款(以退款或其他方式)。我们不使用条纹‘客户’。我们存储订单,客户在我们的系统中(stripe不是一个客户管理系统)。如果客户在结帐时登录,我们将其链接到他们的订单。客人的订单和任何人都没有联系。

但是,在新的api中,您必须创建一个stripeSession,每个会话都会在条形仪表板中创建一个客户。我们能阻止这一切吗?

而且,没有办法像使用旧的收费api那样向整个会话/收费添加描述--因此,在Stripes支付仪表板中,我们以无法使用的垃圾来处理每个支付描述.

有人知道怎么解决这个问题吗?我希望stripe不会为了遵守PDS2而牺牲他们出色的开发经验

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-06 10:59:57

解决了:

诀窍是在条带会话上设置元数据:

代码语言:javascript
复制
                        const stripeSession = await stripe.checkout.sessions.create({
                        customer_email: billingEmail,
                        client_reference_id: orderid,
                        payment_method_types: ["card"],
                        line_items: [
                            {
                                name: "My charge",
                                description: "Lorem ipsum",
                                amount: total,
                                currency: currency,
                                quantity: 1
                            }
                        ],
                        payment_intent_data: {
                            description: `orderID: ${orderid}`,
                            metadata: {
                                orderid : orderid
                            }
                        },
                        success_url: "https://example.com/thankyou/",
                        cancel_url: "https://example.com/checkout"
                    });

元数据在charge.success事件(web钩子)中返回。使用此元数据,我能够在数据库中找到顺序并更新它。在本例中,我从transaction.id事件中获取charge.success、卡片类型和最后4个卡位,并将支付状态更新为已支付。

如果您不需要这些信息,您可以简单地设置Web钩子以接收包含checkout.session.complete的client_reference_id事件(我认为这是确认事务的条带首选事件)。

因为我们没有在Stripe中使用Customers帐户,所以我也从stripe中删除了该客户:

代码语言:javascript
复制
        // Delete the customer from Stripes Dashboard (we don't use it - its clutter)
        const customerID = event.data.object.customer

        stripe.customers.del(
            customerID,
            function(err, confirmation) {
                // asynchronously called
            }
        );

基本上就是这样。使用元-它似乎被发送到每一个事件。

票数 0
EN

Stack Overflow用户

发布于 2019-09-05 15:36:06

创建CheckoutSession时,可以传递给它一个id。该值稍后将出现在对象上,供您在您自己的系统中引用一个顺序。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57808146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档