参考文档
应用内支付 IAP支付流程 自动续期订阅 丢单处理 问题 流程详解 https://www.jianshu.com/p/9e64449807ff
iOS内购(IAP)自动续订订阅类型总结 https://www.jianshu.com/p/9531a85ba165
iOS 自动订阅开发 https://www.jianshu.com/p/687c34c11002
iOS自动续订订阅开发----验证收据和状态回调JSON解析 https://www.jianshu.com/p/aba2edbb7871
商品类型说明
- 消耗型商品
- 非消耗型商品
- 非续期订阅
- 自动续期订阅
非续订支付验证流程
订阅续费流程
后端流程
这里详细说下后端验证流程
用户第一次购买订阅,server需要把票据存储(过期时间也记录一下,字段record_expires_date),苹果会通知server,其中notification_type 对应值为 INITIAL_BUY。之后续订开始需要做好两件事:
1.server 轮询
服务器需要做个定期(每天)检测,检测目前已有的所有订阅订单是否过期,如果发现过期了,就去苹果服务器验证receipt,其中苹果返回的latest_receipt_info 字段,会告诉最新的订阅订单情况,你可以校验expires-date与当前时间比较,判断该订阅有没有续订成功,并同时更新上述让记录的record_expires_date字段.
我们为什么做上述的处理?苹果服务器会在订阅过期的前一天,对用户进行自动扣费,如果扣费成功了,苹果服务器并不会通知我们的服务器,这是重点。不过有个特例,如果苹果订阅过期前一天扣费失败了,苹果服务器后面几天还会尝试对用户自动扣费,如果后面扣费成功了(这时候用户实际状态是没有续订成功),苹果会通知server,其中notification_type 对应值为 RENEWAL,对于RENEWAL我们还是需要给用户更新为正在订阅的状态。
2.接收苹果回调
正式环境下,用户主动取消订阅,苹果会通知server,其中notification_type 对应值为 CANCEL,我们需要更新用户订阅的状态为取消。
对于自动续订订阅,服务器完全可以与apple server交互应对用户的订阅状态,只需要确定客户端传来的用户第一次购买, user id 对应 original-transaction-id的关系。后面的续订,取消,变更套餐,完全不依赖于客户端传来的信息。
服务器验证 receipt
在轮询和购买物品时需要验证 receipt
苹果内购IAP服务端验证-java篇 https://www.jianshu.com/p/976fc6090cfa
苹果内购:
只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开
验证模式有两种:
Validating Receipts With the App Store 通过访问苹果接口进行验证。验证响应参数官方详解:https://developer.apple.com/documentation/appstorereceipts/responsebody
示例:
{
"status":0,
"environment":"Sandbox",
"receipt":{
"receipt_type":"ProductionSandbox",
"adam_id":0,
"app_item_id":0,
"bundle_id":"tataera.edushu",
"application_version":"39",
"download_id":0,
"version_external_identifier":0,
"receipt_creation_date":"2020-04-22 07:00:15 Etc/GMT",
"receipt_creation_date_ms":"1587538815000",
"receipt_creation_date_pst":"2020-04-22 00:00:15 America/Los_Angeles",
"request_date":"2020-04-22 07:57:22 Etc/GMT",
"request_date_ms":"1587542242818"