背景:uniapp与Java实现的安卓端app支付宝支付,本想先在沙箱测试环境测支付,但一直提示“商家订单参数异常,请重新发起付款。”,接着报错信息就是:{
????"errMsg":?"requestPayment:fail?[payment支付宝:62009]未知错误",
????"errCode":?-100,
????"code":?-100
}
本以为是uni.requestPayment传参问题,但只有两个参数,下面是官网示例代码:
uni.requestPayment(OBJECT) | uni-app官网
uni.requestPayment({
provider: 'alipay',
orderInfo: 'orderInfo', //微信、支付宝订单数据 【注意微信的订单信息,键值应该全部是小写,不能采用驼峰命名】
success: function (res) {
console.log('success:' + JSON.stringify(res));
},
fail: function (err) {
console.log('fail:' + JSON.stringify(err));
}
});
其中,orderInfo是后端返回的字符串,本来一直以为是后端传来的参数不对,便使用客户端调试工具测试。
后端返回的值(支付宝客户端处理加密过后的字符串):
调试方法:(使用安卓手机)
1. 下载支付宝沙箱版
这个可以在支付宝开发者中心沙箱环境里面扫二维码进行下载
具体客户端使用请参照:?蚂蚁技术支持客户端调试工具使用教程
通过上面的方法测试后,使用那段长参数值是可以正常支付的。
可问题是,使用uni.requestPayment调用就是不行,继续翻支付宝官网文档,发现一重要注意事项。小程序文档 - 支付宝文档中心
解决:沙箱测试时需要添加一段代码:EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
知道问题在哪了,但这段代码怎么在uniapp中使用呢?
下面附上我的部分代码,作为参考:
// #ifdef APP-PLUS
// 获取后端返回的支付宝客户端处理加密过后的字符串
await API_Trade.initiatePay(paymentMethod, paymentClient, params).then(
(signXml) => {
//如果支付异常
if (!signXml.data.success) {
uni.showToast({
title: signXml.data.message,
duration: 2000
});
return;
}
let payForm = signXml.data.result;
// 由于测试阶段采用沙箱支付,下面两行代码需要配置
var EnvUtils = plus.android.importClass('com.alipay.sdk.app.EnvUtils');
EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);
uni.requestPayment({
provider: 'alipay',
orderInfo: payForm || '',
success: (e) => {
console.log('成功的返回值', e);
uni.showToast({
icon: "none",
title: "支付成功!",
});
this.callback(paymentMethod)
},
fail: (e) => {
console.log('失败的返回值', e);
this.exception = e;
uni.showModal({
content: "支付失败,如果您已支付,请勿反复支付",
showCancel: false,
});
},
});
}
);
// #endif
ok,沙箱环境下支付宝支付莫得问题了。
注意的是:关于EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX);的代码段在使用生产环境支付时就需要注释了。