我正在将Stripe Webhooks集成到Web应用程序中,以使用Stripe Billing实现订阅。该Web应用程序具有前端和后端。
启动或取消订阅时,前端直接与后端进行通信,并且通过同步调用Stripe API进行所有操作。
例如,要取消订阅,流程如下:
这里是“问题”:几秒钟后,在我的后端出现了customer.subscription.deleted
webhook呼叫,告诉我更新刚刚保存的订阅。 出于性能原因,我想避免两次保存,并且想知道这些条带对象是否具有某种签名或更新计数,以检查它们是否相对于先前版本有所更改。
我认为仅将Webhooks用于带外更新非常普遍,因此应支持此用例。
对于订阅的每个状态,没有“更新”计数或签名。一种替代方法是在处理从您自己的前端到后端的请求时直接跳过更新数据库中的Subscription对象。相反,您可以主要依靠Stripe的事件通知来更新数据库。这样,您只需更新一次数据库,并且由于某种原因如果您需要直接从Stripe仪表板进行更改,这些更改仍将传播到您的后端。
[我还想指出,您应该通过在处理之前检查事件的ID来将webhook事件处理程序构建为幂等的,因为即使成功确认,Stripe偶尔也会多次发送同一事件。
https://stripe.com/docs/webhooks/best-practices#event-handling