uniapp 解决安卓App使用uni.requestPayment实现沙箱环境支付宝支付报错

背景: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. 下载支付宝沙箱版

这个可以在支付宝开发者中心沙箱环境里面扫二维码进行下载

2. 下载客户端调试工具

客户端调试工具下载

具体客户端使用请参照: 蚂蚁技术支持客户端调试工具使用教程

通过上面的方法测试后,使用那段长参数值是可以正常支付的。

可问题是,使用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);的代码段在使用生产环境支付时就需要注释了。

参考地址:学习记录:关于Uniapp与Java实现支付宝沙箱APP内支付_uniapp支付宝沙箱-CSDN博客

  • 10
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
要在Java中集成支付宝App支付的沙箱环境,您可以按照以下步骤进行具体实现: 1. 首先,确保您已经在支付宝开放平台注册并创建了应用,并获取到了应用的AppID、私钥等信息。同时,您还需要下载并导入支付宝SDK到您的Java项目中。 2. 创建一个Java类,并引入支付宝SDK相关的类和包。 3. 在该类中创建一个方法,用于生成支付宝App支付的订单信息字符串。您可以使用SDK提供的接口来生成订单信息。 ```java import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayConstants; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.response.AlipayTradeAppPayResponse; public String generateAlipayOrderInfo() { // 创建AlipayClient对象,设置沙箱环境的网关、AppID、私钥等参数 DefaultAlipayClient alipayClient = new DefaultAlipayClient( "https://openapi.alipaydev.com/gateway.do", "<Your AppID>", "<Your Private Key>", AlipayConstants.FORMAT_JSON, AlipayConstants.CHARSET_UTF8, "<Your Alipay Public Key>", AlipayConstants.SIGN_TYPE_RSA2 ); // 创建AlipayTradeAppPayRequest对象,设置业务参数 AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); request.setBizContent("<Your Biz Content>"); try { // 调用SDK的SDKExecute方法,发送支付宝App支付请求 AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); // 获取订单信息字符串 String orderInfo = response.getBody(); return orderInfo; } catch (AlipayApiException e) { e.printStackTrace(); } return null; } ``` 4. 在`<Your AppID>`、`<Your Private Key>`、`<Your Alipay Public Key>`和`<Your Biz Content>`等位置替换为您的实际值。`<Your Biz Content>`是订单信息的JSON字符串,其中包含了订单的详细信息。 5. 调用`generateAlipayOrderInfo`方法,得到支付宝App支付的订单信息字符串。 请注意,以上代码仅提供了生成支付宝App支付订单信息字符串的示例,实际使用时还需要根据您的业务需求进行相应的参数配置和处理。另外,为了确保安全性,建议将敏感信息(如私钥)存储在安全的位置,并使用适当的加密方式进行保护。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值