在node中使用webhooks时如何实现原子性?

问题描述 投票:0回答:1

我正在开发 MERN 应用程序。我正在尝试在其中实现条带订阅。

每当用户尝试使用 stripe checkout 会话付款时,就会调用 webhooks 路由并根据事件类型更新数据库。

这是我的 webhook 控制器代码:

export const postStripeWebhook = async (req: ExtendedRequest, res: Response) => {
    
    //code to determine the eventype from the stripe signature.

    switch (eventType) {
        case "checkout.session.completed":
            subscription = event.data.object;
            
            await prisma.users.update({
            where: {
                id: subscription.metadata.userId,
            },
            data: {
                stripeUserId: subscription.customer,
                subscriptionStatus: true,
            },
        });

        break;

        //other events type

    }

    res.sendStatus(200);
};

正如我们所见,当客户为产品付款时,stripe 会发送一个

checkout.session.complete
事件。收到此事件后,客户的
subscriptionStatus
将在数据库中更新,并向用户提供产品。

但是如果更新数据库时出现错误怎么办?现在,用户将面临这样的情况:他的帐户已扣除订阅费用,但由于数据库未更新,他尚未配置产品。

据我所知,如果整个过程是原子的,即如果数据库没有更改,则将扣除的金额发送给用户,则可以消除这种情况。

但我不知道这是否是解决这个问题的正确方法。另外我不知道如何在node.js中执行原子操作。

请指导我解决问题。

node.js express stripe-payments webhooks atomic
1个回答
0
投票

解决方案非常简单:由于 webhook 仍然是一个请求,如果处理失败,您应该返回状态 5xx。在这种情况下,Stripe 将在一段时间内重试 Webhook,您将有另一次机会正确处理它

© www.soinside.com 2019 - 2024. All rights reserved.