文章目录
- stripe订阅模式与普通支付模式的区别
- 支付成功回调
- 支付失败回调
- 订阅生命周期
一、区别
创建stripe订单时(支付接口)的区别:
1.普通订阅模式创建session前需要先创建价格对象,订阅需要在价格对象中多添加一个recurringParams,主要用于设置订阅周期(stripe支持年月日,如果设置订阅周期单位为月则不能超过十二个月,如果设置周期单位天则不能超过三十天),以及订阅周期数量。
如果interval设置为month,interv_count设置为1,代表订阅创建生效之后每一个月自动扣一次款。设置这个对象在stripe的官方api文档里没有说,参考具体的对象参数文档Stripe API reference – The price object – curl
2.在通过SessionCreateParams创建session去调用stripe api时,需要把mode设置为SessionCreateParams.Mode.SUBSCRIPTION.
Build a subscriptions integration | Stripe Documentation
3.普通支付模式下,通过SessionCreateParams创建session调用stripe后,session对象里会返回一个paymentintent,但是订阅首次支付时session中不会有这个paymentintent,并且paymentintent创建以及支付成功的回调都是在用户已经成功付款之后一起回调回来。普通支付模式是session创建完之后stripe就会发起一起paymentintent.created回调,用户付款成功后再发起一起paymentintent.success回调。上述逻辑是在stripe21.0.0版本之前,21版本之后,普通支付模式在创建session调用stripe时也不会创建paymentintent对象,支付意向的创建和成功的回调都是在用户付款成功之后一起回调的。
4.订阅模式中用户付款成功之后的paymentintent.success回调中是会带一个invoice id(订阅模式在创建paymentintent(支付意向)对象前总是会先创建一个invoice对象,原因参考Stripe API reference – Invoice Items – curl),普通支付模式的paymentintent.success回调是没有这个invoice的。
二、支付成功回调
官方参考文档中使用的回调为‘checkout.session.completed’,'invoice.paid','invoice.payment_failed',意思分别为(创建session调用stripe的回调,订阅支付成功的回调(包括首次手动支付和后续的自动扣款),订阅支付失败的回调(包括首次手动支付和后续的自动扣款))。根据上述区别中说的,订阅的paymentintent创建之前一定会创建一个invoice对象,并且支付成功回调后会带一个invoice id,所以说回调的时候只捕捉paymentintent.success回调的效果是一样的。这样普通支付模式和订阅模式就都可以使用paymentintent.success的回调,也可以根据具体业务具体调整。
三、支付失败回调(包括自动扣款失败)
订阅的自动扣款失败后,stripe会有一个重试策略(smart retries),这个策略利用机器学习根据你付款的方式,付款时间、国家、时区等自动评估什么时候去重试向用户收款。详情参考文档https://stripe.com/docs/billing/revenue-recovery/smart-retries
这个重试策略包含两个参数,smart_retry[max_retry_count] 重试次数,smart_retry[retries_end_after_days] 重试周期,默认是会在21天内重试四次,可以自己修改这个重试策略,最大值是在六十天之内重试八次。
在stripe控制台也可以自定义自己的重试策略,包括失败后是否给客户发送相关邮件,失败后对订阅的处理方式、账单状态等等。
四、订阅生命周期
1.订阅创建,订阅状态处于incomplete
2.stripe创建invoice对象,invoice对象处于open状态。在变成open状态之前,invoice会处于一个draft状态,保持大概一个小时,一个小时之后invoice才会进入open状态,这一个小时是提供给商家去对这一笔订单做一些定制化的处理,如果不需要处理,可以直接通过捕捉invoice的创建回调,捕捉之后直接使用invoice.finalize,invoice会直接进入open状态,在自动扣款时也就会直接尝试向用户去收款,不然还得多处理这一个小时左右的权限问题。
3.用户手动支付,开启订阅
4.支付成功之后,订阅状态处于active,invoice状态处于paid(并且回调)。
5.如果第一次支付失败,订阅会返回到incomplete状态,也就是等于没创建此订阅。如果是后续的自动扣款失败,订阅状态还是会处于past_due(stripe会不断尝试charge用户,例如邮件推送,短信推送,具体参考Stripe Login | Sign in to the Stripe Dashboard,也可以自定义重试规则尝试向用户收款)
5.回调中处理业务逻辑