真正原因多在原生侧:manifest.json未开启Payment模块或Alipay配置错位、iOS未配URL Scheme、Android包名/SHA1不匹配、未用自定义基座导致SDK未加载,orderInfo严禁任何前端加工。

uni.requestPayment 调用失败的真正原因
绝大多数“点不动”“静默失败”“Alipay not installed”的问题,根本不在前端代码里,而是原生侧缺失关键组件或配置错位。uni.requestPayment({ provider: 'alipay', orderInfo }) 这个调用本身非常轻量,它只是把字符串透传给原生 SDK —— 如果 SDK 没加载、没注册、没匹配上 APPID,它连错误都不会抛,直接返回 payment not supported 或卡住。
常见现象和对应排查点:
-
Alipay not installed:实际已装支付宝 App,但 manifest.json 中未开启支付模块,或 nativeplugins 下没放alipaySdk-*.jar/.aar - 控制台无报错、点击无响应:iOS 未在
ios/entitlements.plist添加 URL Scheme(格式为ap2021000123456789),或 Android 的包名+SHA1 与开放平台填写不一致 - 闪退(尤其 Android 12+):
targetSdkVersion> 30 时,H5PayActivity启动被系统拦截,需临时降级测试
manifest.json 必须填对的两个位置
很多人翻遍 manifest.json 都找不到“支付宝配置入口”,是因为它藏在两个不同层级,且名称极易混淆:
- 模块开关必须开:
"Payment": {"alipay": true},位于app-plus → modules下,不是mp-alipay(那是小程序端) - APPID 必须填对:
"Alipay": {"appid": "2021000123456789"},同样在app-plus → modules下,这个 ID 是你在支付宝开放平台创建“移动应用”后生成的 20 开头 ID,不是网页应用 ID - 云打包无效:以上修改只对「自定义基座」或「离线打包」生效;真机运行 HBuilderX 默认基座不带支付宝 SDK,必须自己配
orderInfo 字符串不能动、不能 decode、不能拼
后端返回的 orderInfo 是一段完整、已签名、URL-safe 编码过的原始字符串,例如:
app_id=2021000123456789&biz_content=%7B%22out_trade_no%22%3A%22xxx%22%7D&sign=xxx
前端唯一合法操作就是原样透传。任何加工都会导致验签失败:
- ❌ 不要
JSON.parse():它根本不是 JSON,是 query string 格式 - ❌ 不要
decodeURIComponent()或encodeURIComponent():支付宝客户端内部会自动 decode,多解一次就乱码,多编一次就签名失效 - ❌ 不要拆开改字段再拼:哪怕只改一个
out_trade_no,签名立刻失效,返回INVALID_PARAMETER - ✅ 正确做法:
console.log(orderInfo.length)看长度,正常应在 300–800 字符之间;太短说明后端根本没生成对
Android 和 iOS 的原生配置差异点
跨平台不是写一遍就能跑通,两套原生环境的验证逻辑完全不同:
- iOS 关键在 URL Scheme:
ios/entitlements.plist中必须添加ap{你的APPID}(如ap2021000123456789),且与支付宝开放平台后台填写的 iOS Bundle ID 和应用商店 ID 匹配 - Android 关键在签名一致性:包名(
applicationId)和 SHA1(用keytool -list -v -keystore your.keystore查)必须和开放平台“移动应用”页填写的完全一致;否则 SDK 初始化失败,uni.getProvider都查不到alipay - Android 还需手动集成:
nativeplugins/alipay/Android/libs/下放alipaySdk-*.jar或.aar,并在AndroidManifest.xml声明com.alipay.sdk.app.H5PayActivity及对应intent-filter
最常被忽略的是:这些配置全部生效的前提,是你用了自定义基座或离线打包 —— HBuilderX 默认基座里根本没有支付宝 SDK,连初始化都跳不过去。



















