苹果 IAP 支付服务端处理完整流程及注意事项(包含订阅商品处理)

本文详细介绍了苹果IAP支付服务端处理流程,包括非续订支付和订阅续费的验证,特别是订阅续费的后端处理,如server轮询和苹果回调的接收。强调了苹果服务器在订阅过期前一天不会通知续费成功,以及验证receipt时可能出现的各种Status值。此外,还提醒了在处理iOS订阅支付时的注意事项,如验签问题和环境测试差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文档

应用内支付 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

商品类型说明

  • 消耗型商品
  • 非消耗型商品
  • 非续期订阅
  • 自动续期订阅

非续订支付验证流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U3AjijNq-1605164322725)(/images/25ab8fc4-6b54-4307-51f2-e50803261cf7.png)]

订阅续费流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lfE5Sm1z-1605164366027)(/images/cbdd0c24-e8c3-41d1-6406-85bbd66de01e.png)]

后端流程

这里详细说下后端验证流程
用户第一次购买订阅,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"
### 微信小程序 iOS 平台虚拟商品实现方法 对于微信小程序中的iOS平台,当涉及到虚拟商品交易时存在特定的规定和实现方式。在iOS平台上,针对非实物内容的商品销售,微信支付功能受到一定限制[^1]。 #### 处理方案 为了满足苹果公司关于应用内购(IAP, In-app Purchase)的要求并遵循其政策规定,在iOS版微信小程序里售卖虚拟物品应当采用Apple IAP机制而非直接集成微信支付接口完成付款操作。具体流程如下: - **注册成为开发者**:加入Apple Developer Program获取必要的权限和支持文档。 - **设置产品ID**:通过iTunes Connect定义好要出售的产品及其对应的唯一标识符(Product ID),这些信息将在后续用于发起IAP请求。 - **修改前端逻辑**:调整小程序前端代码以便能够识别当前设备操作系统类型(iOS/Android), 对于iOS端触发相应的IAP API调用来代替原有的微信JSAPI pay()函数。 ```javascript if (wx.getSystemInfoSync().platform === 'ios') { // 发起 Apple IAP 请求... } else { wx.requestPayment({ timeStamp: '', nonceStr: '', package: '', signType: 'MD5', paySign: '' }) } ``` - **服务器验证收据**:每次成功完成后都会返回给客户端一个Base64编码后的数据字符串即“Receipt”,将其发送到自己的服务端进行解码校验真实性以及更新用户的账户状态等业务处理动作;注意这里推荐使用官方提供的最新版本的验证URL来确保安全性。 #### 注意事项 - 需严格遵守App Store Review Guidelines有关条款以免造成不必要的审核风险; - 应该充分测试整个购买过程包括但不限于正常下单、取消订单、恢复历史记录等功能点以保障用户体验良好度; - 若涉及订阅型服务则还需额外关注续费提醒通知推送等相关细节问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dying 搁浅

两杯酒,一杯敬你余生多欢喜。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值