iOS应用如何处理App Store取消订阅事件 是否需要存储用户Apple ID
处理iOS订阅取消事件的NodeJS实现指引
苹果官方提供了App Store Server Notifications服务来推送订阅状态变更事件,你可以通过以下步骤完成对接:
- 第一步:登录App Store Connect,进入你的应用配置页,在「App 信息」-「服务端通知」板块配置你的NodeJS服务回调地址,勾选需要接收的事件类型,其中
DID_REVOKE对应主动取消订阅、SUBSCRIPTION_EXPIRED对应到期未续费取消两类核心场景。 - 第二步:NodeJS侧建议使用苹果官方提供的
@apple/app-store-server-librarySDK完成回调处理,避免自行实现签名校验出现安全问题。
首先安装依赖:npm install @apple/app-store-server-library
基础回调接口示例:const express = require('express'); const { SignedDataVerifier, Environment } = require('@apple/app-store-server-library'); const app = express(); app.use(express.json()); // 初始化签名校验器 const verifier = new SignedDataVerifier({ // 填入苹果官方根证书内容 appleRootCertificates: [readFileSync('./AppleRootCA-G3.cer')], bundleId: '你的应用Bundle ID', environment: Environment.Production, // 沙箱测试时改为Environment.Sandbox enableOnlineChecks: true }); // 订阅状态回调接口 app.post('/apple/subscription/callback', async (req, res) => { try { // 解析并验证苹果推送的签名数据 const notification = await verifier.verifyAndDecodeNotification(req.body.signedPayload); // 匹配取消订阅相关事件 if (['DID_REVOKE', 'EXPIRED'].includes(notification.notificationType)) { // 解析交易信息,获取用户标识 const transaction = await verifier.verifyAndDecodeTransaction(notification.data.signedTransactionInfo); const userToken = transaction.appAccountToken; // 你自行传入的用户唯一标识 // 此处更新对应用户的订阅状态 } res.sendStatus(200); } catch (error) { console.error('回调处理失败', error); res.sendStatus(500); } }); app.listen(3000);
用户身份匹配问题说明
- 仅存储手机号无法直接定位取消订阅的用户:苹果的回调通知不会返回手机号、Apple ID这类用户隐私信息,无法直接做匹配。
- 不需要额外登记用户的Apple ID:苹果不允许强制收集用户Apple ID,且回调数据中也不会返回Apple ID字段,收集后无法用于匹配,没有实际意义。
- 正确的匹配方案:用户在应用内发起订阅请求时,生成和当前用户手机号绑定的UUID作为
appAccountToken参数传入苹果支付接口,苹果会在后续所有该用户的订阅状态回调中带回该字段,你只需在数据库中存储appAccountToken和用户手机号的绑定关系,即可通过回调返回的appAccountToken准确定位到对应取消订阅的用户。
内容的提问来源于stack exchange,提问作者user13296944
相关产品推荐
相关产品推荐

