我正在开发 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中执行原子操作。
请指导我解决问题。
解决方案非常简单:由于 webhook 仍然是一个请求,如果处理失败,您应该返回状态 5xx。在这种情况下,Stripe 将在一段时间内重试 Webhook,您将有另一次机会正确处理它