文章内容

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.succeededpayment_intent.payment_failed 事件通知 Webhook 端点,从而让您能够了解付款的状态并进行相应的处理。


因此,Stripe Webhook 和 PaymentIntent 是密切相关的,Webhook 可以帮助您捕获 PaymentIntent 对象的状态,以便有效地处理付款。


黄兵个人博客原创。

转载请注明出处:黄兵个人博客 - stripe 支付的一些总结

分享到:

发表评论

评论列表