咨询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判断:
- 用户主动取消导致到期:就是上面的情况,当当前订阅周期结束后,检查到
expiration_intent: "1"且auto_renew_status: "0",直接将用户订阅状态改为「已到期」,停止提供订阅服务即可。 - 付款失败导致到期:如果
expiration_intent: "2",同时is_in_billing_retry_period: "1",说明苹果正在重试给用户扣款(一般会重试几次,持续几天)。建议暂时保留用户订阅权限,避免体验变差;如果之后重试失败(is_in_billing_retry_period变为0),再标记为「已到期」,并提示用户更新支付方式。 - 其他原因到期:
expiration_intent: "3":订阅产品已下架,需引导用户切换到其他可用订阅产品;expiration_intent: "4":提示用户检查并更新App Store账单信息;expiration_intent: "5":统一按“未知原因到期”处理,给用户提供客服入口排查问题。
额外提醒
- 所有操作都要以
original_transaction_id为核心关联用户订阅记录,同一个用户订阅同一产品,无论续订多少次,这个ID都不变,是识别用户订阅的唯一标识。 - 沙箱环境测试时,苹果会模拟各种场景(比如自动触发付款失败、重试周期),建议多测试不同
expiration_intent值,确保逻辑覆盖所有情况。
内容的提问来源于stack exchange,提问作者Jeff Bootsholz
相关产品推荐
相关产品推荐

