Uniapp 内购漏单
Uniapp 内购漏单问题解决方案
问题描述
Uniapp 应用在接入苹果(Apple IAP)或谷歌(Google Play Billing)内购时,可能出现支付成功但未正常交付商品的情况(漏单)。常见原因包括网络波动、支付回调处理不当、服务端验证失败等。
客户端优化方案
确保支付回调监听
在应用启动时(如 App.vue 的 onLaunch 中)注册全局支付监听,避免因页面跳转导致回调丢失。示例代码(以苹果 IAP 为例):
uni.onIAPPaymentComplete(res => {
if (res.transactionState === 'purchased') {
// 调用服务端验证接口
this.verifyPayment(res.transactionReceipt);
}
});
处理网络中断场景
支付过程中若网络中断,需在应用恢复时主动查询未完成的订单。使用 uni.getIAPTransaction 获取本地未完成的交易记录。
服务端验证机制
双重校验流程
- 客户端支付成功后,立即将支付凭证(如苹果的
receipt-data)发送至服务端。 - 服务端向苹果/谷歌服务器发起二次验证,确认支付有效性。
- 验证通过后,再更新用户权益并返回结果给客户端。
订单状态标记
数据库设计时需包含订单状态字段(如 pending、completed、failed),通过定时任务补偿处理长时间处于 pending 的订单。

日志与监控
关键日志记录
- 客户端:记录支付发起、回调触发时间及原始数据。
- 服务端:保存验证请求和响应日志,便于追溯问题。
实时报警
监控支付成功但未完成交付的订单比例,超过阈值时触发报警,人工介入排查。
测试与模拟
沙箱环境测试

- 苹果 IAP 使用 Sandbox 账号测试,模拟网络延迟、中断等异常场景。
- 谷歌 Play 使用测试许可证和虚假卡号验证。
补单工具开发
提供管理后台手动补单功能,输入交易凭证后可强制重新验证并交付商品。
其他注意事项
避免重复发货
服务端验证时需检查订单是否已处理,防止因客户端重复提交导致多次发货。
用户引导
支付结果页提供「未到账反馈」入口,收集漏单案例辅助排查。
通过以上方法可显著降低漏单概率,需结合具体业务逻辑调整实现细节。

