文章内容
2023/4/3 18:14:12,作 者: 黄兵
stripe 支付的一些总结
最近使用 stripe 支付,这个平台相对于国内的聚合支付与 paypal 来说更复杂一些,主要体现在它的 webhook 会返回多个状态,而另外两个平台来说一般会反返回两个或者一个状态,所以需要对于多个状态进行处理。
首先是参考快速开始,使用的是自定义支付流程,之后按照范例开始编写代码。
但是按照官方文档编写代码,存在一个问题,webhook 返回的数据没有我们支付的产品编号,这个时候我们虽然能够知道用户支付了多少钱,但是不知道用户购买的是那个东西,所以我们还需要参考:Payment Intents API - 在元数据内储存信息,示例代码:
# Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys import stripe stripe.api_key = "sk_test_51MmBdZJC1InZ9N63NBgKtcsf8gSzO9EG14njcdChGQRlKiv8S5irrxzu7Eoif5Oj4mCRlECJtDneYOANos7f3rdq00IRP9dpx7" stripe.PaymentIntent.create( amount=1099, currency="usd", payment_method_types=["card"], metadata={"skuId": "2"}, )
这里 order_id 就是我们的订单 ID,至于如何通过 webhook 获取 order_id 值,下面是我获取到的 webhook 值:
{ "api_version": "2022-11-15", "created": 1680576884, "data": { "object": { "amount": 500, "amount_capturable": 0, "amount_details": { "tip": {} }, "amount_received": 0, "application": null, "application_fee_amount": null, "automatic_payment_methods": { "enabled": true }, "canceled_at": null, "cancellation_reason": null, "capture_method": "automatic", "client_secret": "pi_3Mt01AJC1InZ9N630OfUfeis_secret_xKtAsh5SJJxIGOwma4vBnM81C", "confirmation_method": "automatic", "created": 1680576884, "currency": "usd", "customer": null, "description": null, "id": "pi_3Mt01AJC1InZ9N630OfUfeis", "invoice": null, "last_payment_error": null, "latest_charge": null, "livemode": false, "metadata": { "skuId": "2" }, "next_action": null, "object": "payment_intent", "on_behalf_of": null, "payment_method": null, "payment_method_options": { "alipay": {}, "card": { "installments": null, "mandate_options": null, "network": null, "request_three_d_secure": "automatic" }, "cashapp": {}, "link": { "persistent_token": null }, "wechat_pay": { "app_id": null, "client": null } }, "payment_method_types": [ "card", "alipay", "link", "wechat_pay", "cashapp" ], "processing": null, "receipt_email": null, "review": null, "setup_future_usage": null, "shipping": null, "source": null, "statement_descriptor": null, "statement_descriptor_suffix": null, "status": "requires_payment_method", "transfer_data": null, "transfer_group": null } }, "id": "evt_3Mt01AJC1InZ9N630VdKiDmH", "livemode": false, "object": "event", "pending_webhooks": 2, "request": { "id": "req_68yBhu9CSdGmi1", "idempotency_key": "9b926f4f-df71-4f73-ae4f-2c21612edcb0" }, "type": "payment_intent.created" }
其中:
"metadata": { "skuId": "2" },
就是我这只的值。
同时我们需要参考:开始使用 Stripe CLI,设置 webhook,设置完成之后,我们在本地开始监听 stripe 事件。
之后使用下面的方式启动 webhook 本地监听:
stripe listen --forward-to http://127.0.0.1:5000/api/v1/payment/stripe/capture --skip-verify --events payment_intent.created,customer.created,payment_intent.succeeded,charge.succeeded,checkout.session.completed,charge.failed
下面是本地 Stripe CLI 已经上线的截图:
同时如果出现了任何错误,Stripe CLI 也能及时监听到,截图如下:
2023 年 7 月17 日更新:
Stripe CLI 版本更新之后,通过如下方式本地监听:
1、下载 CLI,并用 Strip 账户登录:
stripe login
2、将将事件转发到您的 Webhook:
stripe listen --forward-to http://127.0.0.1:5000/api/v1/payment/stripe/capture
3、用 CLI 触犯事件:
stripe trigger payment_intent.succeeded
这样只要测试环境中付款,webhook 就能监听到相关事件,利于本地调试。
同时我们由于取消订单,或者是支付失败,具体流程可以看这个页面:Intents 的运作机制,这个页面很好的解释了再支付过程中,不同支付结果对应的一个状态,我们可以根据查询 payment_indent 来确定是否支付成功还是关闭了支付页面。
同时我们可以通过Retrieve a PaymentIntent来确定状态,也就是我们检查是否支付成功、是否支付取消、是否支付失败等。
webhook 与 PaymentIntent 的一些关系:
Stripe Webhook 是一种钩子机制,可以将 Stripe 的事件(例如付款、退款、发票、客户端余额变更等)推送到您的服务器上。开发人员可以使用 Webhook 处理这些事件并更新商业逻辑,以确保这些活动对用户可见。
其中,PaymentIntent 是 Stripe API 中的一个对象,用于表示由客户端触发的付款意图。在创建 PaymentIntent 后,您可以使用其 ID 来处理付款,并且在执行付款时,Stripe 服务器将发送相关事件通知您的 Webhook 端点。
例如,当客户端触发付款并且 PaymentIntent 被创建时,您可以监听payment_intent.created
事件,在 Webhook 中进行处理。随后在付款成功或失败时,Stripe 将发送payment_intent.succeeded
或payment_intent.payment_failed
事件通知 Webhook 端点,从而让您能够了解付款的状态并进行相应的处理。
因此,Stripe Webhook 和 PaymentIntent 是密切相关的,Webhook 可以帮助您捕获 PaymentIntent 对象的状态,以便有效地处理付款。
黄兵个人博客原创。
转载请注明出处:黄兵个人博客 - stripe 支付的一些总结
评论列表