uni-app app端收不到success事件是因为uni.pay不监听原生支付回调,必须启用原生插件并用uni.requestpayment,在onshow中读取启动参数或缓存路径实现跳转。

uni-app App端支付回调为什么收不到 success 事件
因为 uni-app 的 uni.pay 在 App 端(iOS/Android)调起原生支付后,**不会自动监听支付结果回调**,更不会触发 success 或 fail 回调函数——这是最常被忽略的前提。App 端支付是跳转到原生支付界面(微信/支付宝 SDK),支付完成后系统会把控制权交还给你的 App,但 uni-app 默认不接管这个“返回时机”,必须手动处理。
常见错误现象:uni.pay 调用后无论支付成功或取消,都只进 complete,且 res.errMsg 恒为 "pay:ok",根本无法区分真实结果。
- Android:支付完成后 Activity 返回,需在原生层重写
onActivityResult并透传结果给 JS - iOS:支付完成后通过 URL Scheme 或 Universal Links 触发回调,需配置白名单并监听
uni.getLaunchOptionsSync()或plus.runtime.getProperty() - uni-app 官方 HBuilderX 3.9.12+ 已内置部分支持,但仅限使用
uni.getProvider+uni.requestPayment(注意不是uni.pay)且需开启「原生插件」
必须启用 uni-app 原生支付插件(非可选)
如果不启用原生插件,uni.requestPayment 在 App 端实际走的是 webview 内嵌 H5 支付,无法获得原生 SDK 的回调能力,也就不可能实现真正的“支付成功页返回逻辑”。
实操步骤:
- 在 HBuilderX 中打开项目 → manifest.json → “App 模块配置” → 勾选“支付”模块(微信支付、支付宝支付)
- 对应平台还需额外配置:Android 需填入
package name和WXPayEntryActivity;iOS 需填入URL Scheme(如wx1234567890abcdef)并在 Xcode 中配置LSApplicationQueriesSchemes和CFBundleURLTypes - 确保使用
uni.requestPayment替代已废弃的uni.pay(后者在 App 端已无实际回调能力)
支付成功后如何准确跳转到指定页面
不能依赖 requestPayment 的 JS 回调,而要靠原生层主动触发 JS 事件或读取启动参数。推荐方案是:在支付发起前,把目标页面路径存在本地(如 uni.setStorageSync('pay_redirect', '/pages/order/success?id=123')),然后在 App 全局生命周期中监听返回动作。
关键代码位置:
- 在
App.vue的onShow生命周期里检查:const opts = uni.getLaunchOptionsSync(); if (opts && opts.path) { /* 处理 scheme 回调 */ } - 同时检查本地缓存:
const redirect = uni.getStorageSync('pay_redirect');,若存在则uni.navigateTo({ url: redirect })并立即uni.removeStorageSync('pay_redirect') - 注意:iOS 上
getLaunchOptionsSync只在冷启动时有效;热启动需监听plus.runtime.getProperty('launchUrl')(HBuilderX 3.9.12+ 支持)
Android 微信支付回调丢失的典型原因
即使启用了插件,Android 端仍常出现“支付完成但没跳转”,本质是微信 SDK 的 WXPayEntryActivity 没正确回调到 uni-app 的桥接层。
排查要点:
- 确认 AndroidManifest.xml 中声明的
WXPayEntryActivity的android:name与实际类名一致(应为io.dcloud.feature.payment.wxapi.WXPayEntryActivity) - 检查该 Activity 的
exported属性是否为true(Android 12+ 强制要求显式声明) - 确保微信开放平台配置的包名、签名证书 SHA1 与当前打包环境完全一致(调试版和正式版签名不同会导致回调失效)
- 不要在
onCreate中调用finish()—— 这会让 Activity 提前销毁,导致回调丢失
真正可靠的支付成功页跳转,依赖的是原生层对支付结果的捕获和透传,而不是 JS 层的“等待回调”。很多团队卡在这里,是因为误以为 uni.requestPayment 的 success 回调在 App 端可用,实际上它只是个空壳。











