未收到Apple In-App Purchase Auto-Renewable subscription取消通知的技术问询
我之前也碰到过几乎一模一样的问题,折腾了好几天才解决,结合我的踩坑经验,分享几个你可能没覆盖到的排查方向:
确认通知类型是否正确配置
Apple针对用户主动关闭自动续期的场景,发送的是DID_CHANGE_RENEWAL_STATUS类型的通知,而非单独的"取消"通知。你需要确保在App Store Connect的「App Store Server Notifications」设置里勾选了该类型,同时服务器端点要能处理所有通知类型,不要只过滤特定类型的请求。检查服务器的HTTP/2支持与网络拦截
Apple现在要求服务器必须支持HTTP/2来接收通知,如果你的服务器仅支持HTTP/1.1,大概率收不到请求。另外,很多云服务商的WAF、防火墙或负载均衡规则会误判Apple的通知请求为恶意流量,建议暂时关闭WAF测试,或者查看服务器访问日志,确认是否有Apple官方IP段发起的请求被拦截——我当时就是因为WAF规则拦截了请求,查了三天日志才发现问题。验证通知签名的逻辑是否覆盖所有场景
不少开发者会在签名验证时只处理成功订阅的通知,忽略了取消类通知的验证逻辑。比如是否正确获取了Apple的根证书、完整验证了证书链,有没有处理通知中latest_receipt_info字段里的auto_renew_status(值为0表示已取消自动续期)。如果验证逻辑有漏洞,服务器可能收到了通知但因为验证失败直接丢弃了。沙箱环境的特殊测试注意事项
如果你在沙箱环境测试,注意两点:一是沙箱通知可能存在延迟,有时候需要等待30分钟甚至更久才会发送;二是必须在沙箱测试账号的「订阅管理」里操作取消,而非直接删除测试账号。另外,可以尝试修改设备时间到续期前5分钟触发模拟续期,有时候能强制触发通知发送。检查App Store Connect的通知发送日志
在App Store Connect的「App信息」→「App Store Server Notifications」里,你可以查看Apple发送通知的状态记录,包括是否发送成功、服务器返回的状态码等。如果这里显示「发送失败」,问题肯定在你的服务器端(比如返回了非200的状态码);如果显示「发送成功」,那你需要检查服务器日志,看是否有接收记录但处理逻辑出错了。
如果以上都排查过还是不行,建议用ngrok把本地开发服务器暴露到公网,直接在沙箱环境测试,这样能排除生产服务器的网络配置问题。另外,Apple的通知重试机制是指数退避的,如果第一次没收到,会在后续几小时内重试多次,别着急,多等一段时间看看。
内容的提问来源于stack exchange,提问作者Neeraj Joshi




