Cordova:如何检测iOS应用是否为苹果商店付费购买的旧版本
如何用Cordova检测iOS老用户是否购买过旧付费版本
我之前帮朋友处理过几乎一模一样的场景——把付费iOS App转免费后给老用户留专属权益,踩过不少插件的坑,给你几个实际验证过的可行思路:
方案一:利用cordova-plugin-purchase验证历史购买记录
你提到试过AlexDislers的插件,大概率就是这个,但可能是配置没到位。这个插件其实可以查询用户的历史非消耗型购买记录,关键是要保留旧的付费产品ID,并且正确初始化:
- 保留旧付费产品ID:在App Store Connect里不要删除你之前的付费App对应的内购产品ID(比如
com.yourapp.original-full),哪怕现在转免费了,这个ID是查询历史的关键。 - 正确配置插件:
安装插件后,在代码里注册旧产品ID并监听所有权状态:// 初始化插件 document.addEventListener('deviceready', () => { const oldProductId = 'com.yourapp.original-full'; // 注册旧付费产品(非消耗型) store.register({ id: oldProductId, type: store.NON_CONSUMABLE }); // 等待插件就绪 store.ready(() => { // 刷新本地购买记录并同步Apple服务器 store.refresh(); // 监听产品所有权状态 store.when(oldProductId).owned(() => { // 确认是老付费用户,解锁专属功能 enableLegacyExclusiveFeatures(); }); store.when(oldProductId).error((err) => { console.log('验证失败:', err.message); // 这里可以触发备用方案,比如提示用户联系客服 }); }); // 启动插件的购买流程监听 store.refresh(); }, false); - 关键配置检查:确保你在App Store Connect里开启了内购的共享密钥,并且插件初始化时传入了正确的密钥(如果需要的话)。测试时要用沙盒测试账号,并且提前用该账号购买过旧产品。
方案二:手动获取Receipt并自行验证
如果插件的自动验证不稳定,你可以手动获取用户的App Store购买凭证(Receipt),传给自己的后端服务器去调用Apple的官方验证API:
- 安装
cordova-plugin-apple-receipt:这个插件可以直接获取设备上的Receipt数据 - 前端获取并上传Receipt:
document.addEventListener('deviceready', () => { cordova.plugins.appleReceipt.getReceipt((receiptRaw) => { // 将原始Receipt转成Base64格式传给后端 const receiptBase64 = btoa(String.fromCharCode(...new Uint8Array(receiptRaw))); // 发送到你的后端验证 fetch('https://your-api-domain.com/verify-legacy-purchase', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ receipt: receiptBase64, bundleId: 'com.yourapp.current' }) }) .then(res => res.json()) .then(data => { if (data.isLegacyUser) { enableLegacyExclusiveFeatures(); } }) .catch(err => { console.error('验证请求失败:', err); }); }, (err) => { console.log('获取Receipt失败:', err); }); }, false); - 后端验证逻辑:你的服务器需要调用Apple的Receipt验证接口(生产环境用
https://buy.itunes.apple.com/verifyReceipt,沙盒用https://sandbox.itunes.apple.com/verifyReceipt),解析返回的JSON,检查in_app数组中是否存在旧付费产品ID的购买记录,并且确保订单状态有效。
方案三:手动验证的备用方案
总有一些极端情况(比如用户换了设备、Receipt丢失)会导致自动验证失败,这时候可以给用户提供一个手动验证入口:
- 在App里加一个“我是老用户”的按钮,引导用户上传App Store购买订单的截图(订单里会包含旧App的名称和购买日期)
- 你的客服团队核实后,通过你的用户系统给该用户标记为老用户,解锁专属功能
重要注意事项
- 不要删除旧产品ID:一旦删除,Apple服务器就无法返回该产品的历史购买记录,所有自动验证都会失效
- 沙盒测试要到位:用沙盒账号测试时,要确保该账号已经购买过旧产品,并且插件能正确识别
- 处理离线场景:如果用户离线,先缓存验证状态,等联网后再重新验证,避免影响用户体验
- 遵守Apple条款:不要将Receipt数据用于购买验证以外的用途,避免违反App Store审核规则
我当时用方案一就顺利解决了问题,重点是确保旧产品ID的存在和插件的正确配置。如果还是有问题,检查一下App Store Connect里的内购项目状态是不是“已批准”,以及插件的版本是否是最新的。
内容的提问来源于stack exchange,提问作者Aleksey Dobro
相关产品推荐
相关产品推荐

