uni-app 安卓离线打包微信支付问题
uni-app 安卓离线打包微信支付问题
开发环境 | 版本号 | 项目创建方式 |
---|---|---|
Mac | 15.3.2 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Mac
PC开发环境操作系统版本号:15.3.2
HBuilderX类型:正式
HBuilderX版本号:4.57
手机系统:Android
手机系统版本号:Android 10
手机厂商:OPPO
手机机型:OPPO R11
页面类型:vue
vue版本:vue3
打包方式:离线
App下载地址或H5网址:https://www.pgyer.com/Ci65K3
示例代码:
async function weixinAppPay(option) {
loadingPay.value = true
let orderInfo = await getOrderInfoMini(option.entryNum)
if (!orderInfo) {
option.fail && option.fail('获取支付信息失败')
return
}
console.log('--------orderInfo--------')
console.log(orderInfo)
uni.requestPayment({
provider: 'wxpay',
orderInfo: {
"appid" : orderInfo.appid,
"partnerid": orderInfo.partnerid,
"prepayid": orderInfo.prepayid,
"package" : orderInfo.package,
"noncestr": orderInfo.noncestr,
"timestamp" : orderInfo.timestamp,
"sign": orderInfo.sign
},
success: e => {
option.success && option.success(e)
},
fail: res => {
option.fail && option.fail(res.errMsg || '支付失败!')
},
complete: () => {
loadingPay.value = false
}
})
}
操作步骤:
- 如代码中,组织app支付参数,
- 调用uni.requestPayment统一支付API
- 此方法直接回调结果,success: e => { option.success && option.success(e) },
- 在3的步骤中我还没在手机上选择微信(因为微信有分身),便直接回调结果了
预期结果:
当我选择完具体的微信,并输入密码后才应该走成功回调
实际结果:
还没有选择微信,只是调用uni.requestPayment 此方法,成功回调已经执行
bug描述:
安卓端微信支付调用uni.requestPayment后,直接走了支付成功回调,回调结果如下:
{'channel":{"id":"wxpay","description":"微信","serviceReady":true}), errMsg:"requestPayment:ok"}
此时因为本身安卓机有微信分身,还没有选择具体使用哪个微信支付,也没输入支付密码,怎么就直接走支付成功回调呢?
使用环境:
- 离线打包,
- JDK17,
- compileSdk 35,
- buildToolsVersion ‘35.0.0’
附件有视频,操作过程,没有选择微信支付,但支付统一接口uni.requestPayment 就有成功回调。
更多关于uni-app 安卓离线打包微信支付问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
苹果下支付没问题,安卓下不同机型有不同表现,比如OPPO下没调起微信的时候就显示支付成功。问了技术:云打包没问题,离线打包有此问题。但是还不能用云打包,之前我们云打包会有其他问题,所以只能离线打包。
根据描述,这是典型的微信支付回调过早触发问题,常见于安卓离线打包环境。以下是关键分析:
- 问题本质:
- 回调过早触发表明微信支付SDK检测到可用支付环境就直接返回成功
- 这种情况通常发生在未正确处理微信多实例(分身)场景
- 可能原因:
- 离线打包时未正确配置微信支付SDK的多实例支持
- AndroidManifest.xml中微信支付相关配置不完整
- 微信SDK版本与当前系统兼容性问题
- 解决方案: 检查以下配置项:
<!-- AndroidManifest.xml -->
<activity
android:name=".wxapi.WXPayEntryActivity"
android:exported="true"
android:launchMode="singleTop"/>
<meta-data
android:name="WX_APPID"
android:value="你的微信APPID"/>
- 代码调整建议: 在支付回调中增加状态验证:
uni.requestPayment({
success: e => {
if(e.channel.serviceReady) {
// 真实支付成功处理
}
}
})