You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询expiration_intent作用及沙箱环境下订阅到期/取消的标识处理

iOS应用内订阅收据验证实操解答

问题1:expiration_intent的作用是什么?

简单说,expiration_intent就是苹果给你的「订阅到期原因说明书」——它不只是告诉你“订阅到期了”,还明确告诉你为什么到期,帮你针对性处理后续逻辑。

这个字段的不同值对应不同触发原因:

  • 1:用户主动取消了自动续订(比如在App Store设置里关掉了订阅)
  • 2:付款失败(比如用户银行卡余额不足、支付方式失效)
  • 3:对应的订阅产品已从App Store下架,无法继续续订
  • 4:用户的账单信息存在问题(比如地址不匹配、需要验证身份)
  • 5:其他未明确归类的原因

你可以根据这个字段的值做差异化处理:比如用户主动取消时推送挽留通知,付款失败时提示更新支付方式。

问题2:结合pending_renewal_info处理订阅到期/取消场景

先看你给出的这段pending_renewal_info数据:

"pending_renewal_info": [
  {
    "expiration_intent": "1",
    "auto_renew_product_id": "product_name",
    "original_transaction_id": "11111111111111111",
    "is_in_billing_retry_period": "0",
    "product_id": "product_name",
    "auto_renew_status": "0"
  }
]

我给你拆解不同场景的处理逻辑:

一、订阅取消场景(用户主动关闭自动续订)

当你看到expiration_intent: "1" + auto_renew_status: "0"的组合时,这是最明确的用户主动取消场景:

  • 划重点:用户只是取消了后续的自动续订,当前订阅周期内的服务依然有效!不要立即停掉用户权限,要等到当前订阅的到期日期之后再处理。
  • 服务器端可以给该用户的订阅记录标记「已取消自动续订」,同时保留original_transaction_id——用户之后重新订阅时,这个ID会保持不变,方便你关联历史订阅数据。
  • 可以在APP内给用户友好提示,比如“你的订阅将在XXXX年XX月XX日到期,到期后将无法继续使用会员服务哦”。

二、订阅到期场景

到期场景要分情况,结合expiration_intent和is_in_billing_retry_period判断:

  1. 用户主动取消导致到期:就是上面的情况,当当前订阅周期结束后,检查到expiration_intent: "1"且auto_renew_status: "0",直接将用户订阅状态改为「已到期」,停止提供订阅服务即可。
  2. 付款失败导致到期:如果expiration_intent: "2",同时is_in_billing_retry_period: "1",说明苹果正在重试给用户扣款(一般会重试几次,持续几天)。建议暂时保留用户订阅权限,避免体验变差;如果之后重试失败(is_in_billing_retry_period变为0),再标记为「已到期」,并提示用户更新支付方式。
  3. 其他原因到期:
    • expiration_intent: "3":订阅产品已下架,需引导用户切换到其他可用订阅产品;
    • expiration_intent: "4":提示用户检查并更新App Store账单信息;
    • expiration_intent: "5":统一按“未知原因到期”处理,给用户提供客服入口排查问题。

额外提醒

  • 所有操作都要以original_transaction_id为核心关联用户订阅记录,同一个用户订阅同一产品,无论续订多少次,这个ID都不变,是识别用户订阅的唯一标识。
  • 沙箱环境测试时,苹果会模拟各种场景(比如自动触发付款失败、重试周期),建议多测试不同expiration_intent值,确保逻辑覆盖所有情况。

内容的提问来源于stack exchange,提问作者Jeff Bootsholz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:51:29