App端支付成功后唯一可靠入口是uni.onAppShow,必须在App.vue中注册且避免覆盖;需支付前存订单号到本地缓存,唤回时通过uni.onAppShow调后端查状态,确认成功后跳转并清理缓存。

App端支付成功后,uni.onPaymentComplete根本不会触发——这个回调只在微信/支付宝小程序里有效,App端原生不支持。你写的监听函数再完整也没用,不是逻辑错,是平台能力缺失。
uni.onAppShow 是 App 端唯一可靠的唤回入口
iOS 和 Android 支付完成后切回 App,不走页面级 onShow,而是触发全局 uni.onAppShow。很多人在子页面注册它,或者被多次覆盖,结果监听直接失效。
- 必须在
App.vue的onLaunch或onShow中注册,且只注册一次 - 避免在多个页面重复调用
uni.onAppShow,否则后注册的会覆盖前一个 - Android 部分机型(华为、OPPO)有延迟,建议加
setTimeout100ms 后再查状态 - iOS 下
uni.getLaunchOptionsSync()在支付唤回时经常返回空对象,别依赖它传参
怎么安全判断“这次回来是支付成功”
不能靠 URL 参数或临时缓存标记,因为 App 唤回时页面栈可能已重置,或冷启动导致数据丢失。
- 支付前写入持久化缓存:
uni.setStorageSync('pending_order_id', 'ORD123') - 在
uni.onAppShow回调里立刻读取该 key,并调后端接口查订单真实状态 - 服务端接口必须幂等,响应体明确含
status: 'success' | 'pending' | 'failed' - 确认成功后跳转并清理:
uni.navigateTo({ url: '/pages/pay/success?order_id=' + orderId }),然后uni.removeStorageSync('pending_order_id')
uni.requestPayment 的 success 回调不是“支付完成”,只是“调起成功”
这个回调在用户还没点确认付款时就执行了,仅表示 SDK 已正确拉起支付界面。但它是你前端能稳稳拿到的唯一时机,必须利用好。
- 在这里立即跳转到订单详情页:
uni.navigateTo({ url: '/pages/order/detail?order_id=' + orderId }) - 订单页
onLoad中立刻查支付状态,避免白屏等待 - 前端可做轻量轮询(1s×3次 → 5s×3次),但不可替代服务端 Webhook 主动通知
- Android 微信支付若收不到回调,90% 是
AndroidManifest.xml漏配WXPayEntryActivity或包名/签名不匹配微信开放平台
真机测试前务必检查 manifest.json 中的 URL Scheme 是否配置正确——这是唤回 App 的硬性前提,配错就等于没接通电话线,后面所有逻辑都无从谈起。


















