uni-app中无“取消微信支付后自动返回”行为:App端需在uni.onAppShow中手动查单跳转,H5端无法拦截微信强制关闭,仅能通过点金计划或redirect_url唤起独立成功页。

uni-app 里没有“取消微信支付后自动返回”这个行为——因为 App 端压根不会自动返回,H5 端则是微信强制关闭页面,你根本拦不住。
App 端所谓“自动返回”其实是错觉
很多开发者以为调用 uni.requestPayment 后,支付完成会自动触发 success 回调并跳转,其实不是:
-
uni.requestPayment的success只表示“支付界面成功拉起”,不是“用户付完了” - iOS/Android 支付完成后切回 App,不会触发页面级
onShow,只走全局uni.onAppShow - 如果你在页面里写了
onShow去查订单状态,那大概率查不到——监听位置错了 - 真正在支付后“跳转成功页”的逻辑,必须手动写在
uni.onAppShow里,靠读缓存 + 查服务端状态驱动
H5 端无法取消微信的强制关闭
微信 H5 支付完成后,会主动关闭当前 WebView 页面(iOS 更明显),这是微信 SDK 的硬性策略:
- 你无法拦截
beforeunload或覆盖返回逻辑 -
uni.navigateBack、history.pushState全部无效,页面生命周期已被微信接管 - 唯一可行路径是接入微信“点金计划”,开通自定义支付小票能力,才能保留页面并展示成功页
- 没开通点金计划?那就只能接受:支付后回到微信聊天窗口,靠 redirect_url 跳转到一个独立的成功页(但该页需用 URL Scheme 唤起 App,不能是普通 HTTPS)
为什么你看到“返回了”,其实是配置生效了
所谓“能返回”,99% 是因为你正确配置了原生层唤回机制,而不是 JS 层做了什么拦截:
- Android:manifest.json 中填对了
package name和WXPayEntryActivity,支付后系统能精准找到你的 Activity - iOS:URL Scheme(如
myapp://)已在manifest.json配置,并在 Xcode 中注册到CFBundleURLTypes,且打包生效 - 没打包就测?白忙活。模拟器也测不了 URL Scheme 唤起,必须真机 + 已安装的 IPA/APK
- 测试时用 Safari 手动输
myapp://test能拉起 App,才说明唤回链路通了
最易被忽略的一点:iOS 上 uni.getLaunchOptionsSync() 在支付唤回时大概率返回空对象,别依赖它取参数;要用 uni.setStorageSync('pending_order_id', orderId) 配合 uni.onAppShow 主动查单。这个缓存+轮询的组合,才是 App 端支付结果落地的真正支点。



















