必须走原生通道,H5无法调起支付宝App;App端需配置原生模块与SDK,先用uni.getProvider({service:'payment'})确认alipay可用,orderInfo须后端返回完整签名串且不可加工,支付结果须在onAppShow中主动查询。

uni-app 实现支付宝支付,必须走原生通道,H5 端无法调起支付宝 App 完成支付;App 端(iOS/Android)需配置原生支付模块并依赖支付宝 SDK,不能只靠前端 JS 拼接 URL 或 form 提交。
App 端调不起支付宝?先确认 uni.getProvider 是否返回 alipay
这是最常被跳过的前置检查。很多“支付没反应”的问题,根源是设备根本没识别到支付宝服务:
-
uni.getProvider必须在service: 'payment'下调用,不是'oauth'或其他 - 真机测试时,iOS 要求
Info.plist中已正确配置CFBundleURLSchemes为alipay{你的APPID}(注意无空格、全小写) - Android 端若返回空数组,检查
manifest.json → App模块配置 → Payment → 支付宝是否勾选且填了正确的 AppID(20 开头,非沙箱 AppID 混用于正式包) - 模拟器默认不支持,必须用真机;华为/小米等定制系统可能禁用第三方支付服务,需手动开启「应用自启动」「关联启动」权限
uni.requestPayment 的 provider 参数必须是 'alipay',且 orderInfo 是后端返回的完整签名串
前端不参与签名,也不拼接参数。所谓“orderStr”是支付宝服务端 alipay_trade_app_pay 接口返回的原始字符串,不是 JSON 对象:
- 后端返回字段名必须是
orderInfo(uni-app 文档硬编码要求),不能是data或payParams - 该字符串含换行符和空格,前端直接透传,不可
JSON.stringify或encodeURIComponent - 示例有效值开头类似:
app_id=2021000123456789&biz_content=%7B%22out_trade_no%22%3A%22...(注意不是 base64 或加密内容) - 若报错
invalid orderInfo,大概率是后端漏了sign字段,或用了 RSA 而非 RSA2 签名算法
沙箱环境调试失败?重点核对网关地址和证书是否匹配
沙箱和生产环境完全隔离,参数错一个就 400 或 20007 错误:
- 后端网关必须用
https://openapi-sandbox.dl.alipaydev.com/gateway.do,不是openapi.alipay.com - 沙箱应用的 AppID、商户私钥、支付宝公钥,三者必须来自同一沙箱应用控制台页面,不能混用正式环境密钥
- 沙箱环境不校验
notify_url域名备案,但必须是公网可访问地址(本地开发需用 ngrok / localtunnel 等穿透) - 调用
alipay_trade_app_pay时,product_code必须为QUICK_MSECURITY_PAY(App 支付固定值),不能写成FAST_INSTANT_TRADE_PAY(手机网站支付)
支付成功后没回调?uni.onAppShow 是唯一可靠监听点
支付宝 App 返回时,uni-app 生命周期中只有 onAppShow 能稳定捕获,onResume 或 onLaunch 不触发:
- 不要依赖
success回调判断支付结果——它只表示“唤起成功”,不代表用户付了钱 - 在
onAppShow里主动调用后端接口查订单状态(例如/api/pay/status?out_trade_no=xxx),避免轮询 - 若用户取消支付或网络中断,支付宝不会发任何通知,只能靠后端异步
notify_url或主动轮询 - 注意:iOS 14+ 后台限制更严,
onAppShow可能延迟数秒才触发,UI 上需有“正在确认支付结果…”提示
最容易被忽略的是包名一致性:Android APK 的 package name、支付宝开放平台应用配置里的「包名」、以及 manifest.json 中的「Android 包名」三者必须一字不差,大小写敏感。改错一个字母,uni.getProvider 就永远返回空数组。



















