django 使用Stripe的服务器/数据库的客户结账业务逻辑

frebpwbc  于 12个月前  发布在  Go
关注(0)|答案(1)|浏览(92)

我做了一个简单的应用程序,允许用户发布广告的网站收费,如在支付每一个职位。不需要帐户,默认情况下,它本质上是客人结账。
我处理的问题是在服务器端实现业务逻辑的顺序和最佳方式。
我的流程如下:
1.(前端)用户填写一个表格与广告详细信息
1.(前端)用户点击提交
1.(后端)处理发布请求,创建新的数据库条目
1.(后端)用户被重定向到Stripe checkout
1.支付失败或成功
请注意,在这个流中,我是如何在支付之前在数据库中创建一个对象/条目的。这已经感觉错了,因为我觉得条目不应该存在,除非它已经支付。因为垃圾邮件发送者可以在理论上填补我的数据库与无尽的条目填写表格,而不是完成付款。所以,如果Stripe付款在第5步失败,我有一个选择:删除该条目,或将用户返回到预先填写的表单。显然,后者是更好的选择,但是如果用户从未完成或修复付款,我的数据库中仍然会有一个悬空条目。处理这种情况的最佳方式是什么?如果我想实现稍后付款选项(通过将付款URL发送到电子邮件),我应该如何处理该条目?
此外,如果付款成功,一切正常。然而,我想使用webhooks,因为它似乎更可靠的付款状态。但是Stripe结帐也使用“success_url”。因此,在这种情况下,结帐成功,但付款被拒绝。我仍然会将用户转发到success_url,这似乎很奇怪,因为用户可能会觉得一切都很顺利。那么,这个案子会怎么处理呢?
我觉得很多麻烦源于Stripe checkout 让我离开我的服务器环境,因此我无法控制如何更改我的数据库的每一个情况下,它应该出现。

nx7onnlm

nx7onnlm1#

第一部分的一个选项可能是在支付之后才创建数据库记录。例如,您可以在创建的CheckoutSession的metadata中有效地存储一些状态,例如客户选择了什么以及创建记录所需的信息。然后,当您为已付款的客户处理checkout.session.completed webhook事件时,您可以检查客户购买的内容(https://dev.to/stripe/purchase-fulfilment-with-checkout-or-wait-what-was-i-paid-for-335d)和您之前设置的元数据,并在数据库中创建内容。
https://stripe.com/docs/api/checkout/sessions/create#create_checkout_session-metadata
因此,在这种情况下,结帐成功,但付款被拒绝。我还是会把用户转发到一个success_url,这看起来很奇怪
我不知道你在这里指的是什么,因为这并没有真正发生。在结账页面上,如果客户的付款失败,就像他们的卡被拒绝一样,他们只是在页面上收到一条错误消息,可以重试多次并更改他们的详细信息等等,他们不会失败并被重定向。您可以通过使用测试模式和测试卡来了解它的工作原理。https://stripe.com/docs/testing#declined-payments
如果您收到checkout.session.completed webhook事件,则付款成功。如果success_url被访问,你可以让你的后端检索CheckoutSession ID并检查它是否已经支付(因为任何人都可以直接访问该URL),但通常只有在客户支付后才会重定向到该URL(Stripe在重定向之前会等待长达10秒的时间让你接收并确认checkout.session.completed webhook事件)。
https://stripe.com/docs/payments/checkout/custom-success-page

相关问题