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

Cordova:如何检测iOS应用是否为苹果商店付费购买的旧版本

如何用Cordova检测iOS老用户是否购买过旧付费版本

我之前帮朋友处理过几乎一模一样的场景——把付费iOS App转免费后给老用户留专属权益,踩过不少插件的坑,给你几个实际验证过的可行思路:

方案一:利用cordova-plugin-purchase验证历史购买记录

你提到试过AlexDislers的插件,大概率就是这个,但可能是配置没到位。这个插件其实可以查询用户的历史非消耗型购买记录,关键是要保留旧的付费产品ID,并且正确初始化:

  1. 保留旧付费产品ID:在App Store Connect里不要删除你之前的付费App对应的内购产品ID(比如com.yourapp.original-full),哪怕现在转免费了,这个ID是查询历史的关键。
  2. 正确配置插件:
    安装插件后,在代码里注册旧产品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);
    
  3. 关键配置检查:确保你在App Store Connect里开启了内购的共享密钥,并且插件初始化时传入了正确的密钥(如果需要的话)。测试时要用沙盒测试账号,并且提前用该账号购买过旧产品。

方案二:手动获取Receipt并自行验证

如果插件的自动验证不稳定,你可以手动获取用户的App Store购买凭证(Receipt),传给自己的后端服务器去调用Apple的官方验证API:

  1. 安装cordova-plugin-apple-receipt:这个插件可以直接获取设备上的Receipt数据
  2. 前端获取并上传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);
    
  3. 后端验证逻辑:你的服务器需要调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:17:52