微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

考虑到 GET 请求应该是安全的,如何处理 Stripe 上的成功 URL?

如何解决考虑到 GET 请求应该是安全的,如何处理 Stripe 上的成功 URL?

当我们进行条带结账会话时,我们会包含一个成功网址:

 session = await this.stripe.checkout.sessions.create({
payment_method_types: ['card'],line_items: lineItems,payment_intent_data: {
transfer_data: {
amount: 9999999,destination: someaccountId,},success_url: `http://localhost:4000/api/checkout/success?true&session_id={CHECKOUT_SESSION_ID}&alias_id=${aliasId}`,cancel_url: `http://localhost:4000/api/checkout/canceled?session_id={CHECKOUT_SESSION_ID}`,});

成功 URL 是 Stripe 在成功支付后发送给用户的地方。这是一个 GET 请求,因为 stripe 正在重定向用户。许多使用 Stripe 的应用程序在成功结账后需要采取行动——发送电子邮件收据、通知、发送付费内容、更新数据库中的订单等。但建议不要在 GET 请求中执行这些操作,因为 GET 请求应该是 idempotentsafe

例如,电子邮件中的取消订阅链接不应取消订阅用户,而是“取消订阅链接的正确方法是引导到用户可以单击按钮取消订阅页面(单击按钮会触发POST 请求。”src 这是因为“很多很多工具、实用程序、网络爬虫和其他东西都认为 GET 永远不会是破坏性的操作(这是正确的,因为它是以这种方式指定。如果您现在通过破坏该规范来破坏您的应用程序,您将保留应用程序的两个部分。” src

所以我想知道处理条带成功网址的正确方法是什么?如果我们遵循上面建议的建议,那么成功 url 将链接一个页面,在该页面用户单击更新订单的按钮、通过电子邮件发送收据等。但是我们依赖客户来完成已经支付的订单为了。如果他们不按下那个按钮,那么重要的动作就不会完成。这样做的正确方法是什么?或者,在 GET 请求中不更改数据库的建议是否因某种原因不适用于这些类型的操作?

解决方法

使处理结帐会话代码的那部分页面具有幂等性 - 即首先检查它的步骤是否已经被处理(在这种情况下跳过),否则无论它做什么处理都可以重复多次,第一次运行后没有任何额外效果。

对于“工具、实用程序、网络爬虫和其他东西”,使用有效的结帐会话 ID 访问您的 URL 几乎是不可能的,因此无论您使用什么代码来处理“错误的会话 ID”,都可以很好地处理.

您还应该有一个用于此的 webhook - 它会收到一个 POST 请求。 https://stripe.com/docs/payments/checkout/fulfill-orders#handle-the---event

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。