uni-app 苹果内购失败主因是 manifest.json、基座包、App Store Connect 三处配置未对齐:manifest 需显式启用 IAP entitlement;基座包须用开发证书+含 IAP 的 Profile;App Store Connect 商品状态需为 Ready to Submit 或 Approved 且 ID 完全匹配。

uni-app 项目要跑通苹果内购(IAP),80% 的失败不是代码写错,而是 manifest.json、基座包、App Store Connect 三处配置没对齐。真机上 uni.getProvider 返回空数组、requestProduct 拿不到商品、支付面板根本唤不起——基本都卡在这三环里。
manifest.json 必须显式开启 IAP 能力,且 entitlemets 写法不能抄错
很多人只在 HBuilderX 的图形界面勾了「Apple 应用内支付」,但实际生效靠的是 manifest.json 里的底层配置。漏掉或写错 com.apple.developer.in-app-payments entitlement,基座包就无法通过苹果沙盒校验。
- 必须确保
app-plus.distribute.ios.capabilities.entitlements下有完整条目:"com.apple.developer.in-app-payments": ["*"](测试阶段用*;上线前建议替换为具体 App ID 前缀,如["com.yourcompany.app"]) -
privacyDescription.NSUserTrackingUsageDescription不是可选——2026 年起 iOS 15+ 强制要求,哪怕不涉及广告追踪,也得填一句说明,否则打包后启动闪退 - 如果用的是
uni-app x,注意deploymentTarget至少设为15.0,否则StoreKit2API 不可用,uni.requestVirtualPayment会静默失败
自定义调试基座必须用开发证书 + 启用 IAP 的 Provisioning Profile
模拟器完全不支持 IAP,appleiap 在 providers 列表里直接消失;而用发布证书(Distribution)打的基座包,哪怕装在真机上,plus.payment.getChannels 也大概率拿不到 appleiap 通道。
- HBuilderX 中制作基座包时,务必选择「开发模式」,勾选「开发证书」,不能选「发布证书」
- 对应 Provisioning Profile 必须在 Apple Developer Portal 里手动编辑,确认已勾选「In-App Purchase」能力,并绑定那个已开启该功能的 App ID
- 测试设备的 UDID 必须提前添加进开发者账号,且生成该 Profile 时已包含该设备——否则系统判定为“未授权设备”,拒绝加载 IAP 模块
App Store Connect 商品状态和 productId 必须严格匹配沙盒环境
就算前面全对,requestProduct(['com.example.premium']) 还是返回空数组?问题大概率出在商品没“活”在沙盒里。
-
productId必须和 App Store Connect 中创建的内购项目 ID 完全一致:大小写、连字符、点号都不能差一个字符 - 商品状态不能是
Draft,至少要是Ready to Submit;若想立即测试,可先提交审核(不用等通过),状态变为Approved后沙盒即可识别 - 对应 App 在 App Store Connect 中必须已创建版本(哪怕只是
Prepare for Submission),否则商品无归属上下文,IAP 沙盒拒绝加载 - 首次调试强烈推荐用
Consumable类型(如单次道具),它回调链最短、失败路径最明确;Auto-renewable Subscription涉及续订逻辑,容易掩盖基础配置问题
支付成功后收不到回调?别忘了监听全局 payment 事件
uni-app 的 IAP 封装把流程拆成两段:plus.payment.request 只负责唤起支付 UI,真正的支付结果通知靠的是事件监听,不是 request 的 success 回调。
- 必须在应用生命周期早期(比如
onLaunch)注册监听:plus.payment.addEventListener('payment', callback) - 回调中的
result.transactionId和result.receipt是服务端验签必需字段,前端不能丢弃 - 用户中途取消支付、网络中断、沙盒校验失败等情况,都会触发该事件,
result.code === 0才代表真正支付成功 - 千万别漏掉
restoreComplateRequest——用户换设备或重装 App 后,需主动恢复已购商品,否则非消耗型商品会丢失
最容易被忽略的其实是沙盒账号的绑定状态:测试用的 Apple ID 必须在 iPhone 的 App Store 设置里完成「沙盒测试员」身份激活(收到并接受邀请邮件),且设备语言和地区要和沙盒账号一致。否则即使所有配置正确,也会卡在“正在验证账户”无限转圈。


















