uni-app uni.requestPayment提交给支付宝的报文多了一些不必要的参数且sign传参错误
uni-app uni.requestPayment提交给支付宝的报文多了一些不必要的参数且sign传参错误
示例代码:
uni.requestPayment({
provider: 'alipay',
orderInfo: this.str_pay,
success: function(res) {
console.log('success:' + JSON.stringify(res));
},
fail: function(err) {
console.log('fail:' + JSON.stringify(err));
}
});
操作步骤:
uni.requestPayment({
provider: 'alipay',
orderInfo: 'app_access_token=null&app_auth_token=null&app_id=2021002117687436&auth_token=null&biz_content={"body":"1","out_trade_no":"202403301100728","product_code":"QUICK_MSECURITY_PAY","seller_id":"","subject":"NIKEHOODLANDSUEDE","timeout_express":"30m","total_amount":"434.70"}&charset=utf-8&format=xml&method=alipay.trade.app.pay¬ify_url=null&return_url=null&sign_type=RSA2×tamp=2024-03-30 11:00:38&version=1.0&sign=dFfHFOMGN2xAMIR5n+CZ7qPx6DYXrIfKhi0sEbiyy22mlQo3uo2RSJmz37+bh4kzg6OwKgoY5visa7x/4mODpMyWFVLxyPn6Vs2pxNPZJXwD1BQJzNCPla0viiZgZ7nTaYTRjnBF8pRlOo9t81uqBggBvTlQduUMcr1HRLdyiiZ8r6x3vJR/LigfvJW3GBVoV1RWq/vEPkzg0qZmUDghsfsgXeoUTYlOFXwLzVf47gZHd5HZLFbJLpyF/w0Hy1YrTmUyxy2ziRF2vlg9CJ0LlaLB038KAjmH2rPgD5JC+1EuPcxfw/ZcCL0Ke0JqHiu/AByW/dYBON/Xxxl7jR9Z+A==',
success: function(res) {
console.log('success:' + JSON.stringify(res));
},
fail: function(err) {
console.log('fail:' + JSON.stringify(err));
}
});
预期结果:
正确发起支付
实际结果:
报错,提示商家订单参数异常
bug描述:
uni.requestPayment提交的支付宝orderInfo参数为:
app_id=202100211768&biz_content={"body":"1","out_trade_no":"202403301100728","product_code":"QUICK_MSECURITY_PAY","seller_id":"","subject":"NIKEHOODLANDSUEDE","timeout_express":"30m","total_amount":"434.70"}&charset=utf-8&format=json&method=alipay.trade.app.pay&sign_type=RSA2×tamp=2024-03-30 11:00:38&version=1.0&sign=dFfHFOMGN2xAMIR5n+CZ7qPx6DYXrIfKhi0sEbiyy22mlQo3uo2RSJmz37+bh4kzg6OwKgoY5visa7x/4mODpMyWFVLxyPn6Vs2pxNPZJXwD1BQJzNCPla0viiZgZ7nTaYTRjnBF8pRlOo9t81uqBggBvTlQduUMcr1HRLdyiiZ8r6x3vJR/LigfvJW3GBVoV1RWq/vEPkzg0qZmUDghsfsgXeoUTYlOFXwLzVf47gZHd5HZLFbJLpyF/w0Hy1YrTmUyxy2ziRF2vlg9CJ0LlaLB038KAjmH2rPgD5JC+1EuPcxfw/ZcCL0Ke0JqHiu/AByW/dYBON/Xxxl7jR9Z+A==
APP端发起支付请求,报错:商家订单参数异常,请重新发起支付 用支付宝诊断工具,报错:验签出错,建议检查签名字符串或签名私钥与应用公钥是否匹配 支付宝收到的报文是:
http://localhost:80?charset=utf-8&biz_content={"body":"1","out_trade_no":"202403301100728","product_code":"QUICK_MSECURITY_PAY","seller_id":"","subject":"NIKEHOODLANDSUEDE","timeout_express":"30m","total_amount":"434.70"}&method=alipay.trade.app.pay&app_access_token=null&sign=&format=xml¬ify_url=null&version=1.0&app_auth_token=null&encrypt_type=null&return_url=null&auth_token=null&app_id=2021002117687436&sign_type=RSA2×tamp=2024-03-30 11:00:38
比较之后发现:
- sign参数似乎变成了,没有正确发送提供的sign
- 多了app_auth_token、encrypt_type、return_url、auth_token、app_access_token这几个参数
- format原本是json,这里却变成了xml 综上,uni.requestPayment这个接口跟实际提供的orderInfo参数不一致,导致支付宝验签失败,无法发起支付。
更多关于uni-app uni.requestPayment提交给支付宝的报文多了一些不必要的参数且sign传参错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html
以下是可以跑通的demo,请对比一下orderinfo返回值
pay() {
uni.showLoading({
title: “请求中…”
})
uni.request({
url: ‘https://demo.dcloud.net.cn/payment/alipay/?total=0.01’,
method: ‘GET’,
timeout: 6000,
success: (res) => {
console.log(res.data)
uni.hideLoading()
uni.requestPayment({
provider: “alipay”,
orderInfo: res.data as string,
fail: (res : RequestPaymentFail) => {
console.log(JSON.stringify(res))
this.errorCode = res.errCode
uni.showToast({
icon: ‘error’,
title: ‘errorCode:’ + this.errorCode
});
},
success: (res : RequestPaymentSuccess) => {
console.log(JSON.stringify(res))
uni.showToast({
icon: ‘success’,
title: ‘支付成功’
});
}
} as RequestPaymentOptions)
},
fail: () => {
uni.hideLoading()
},
});
},
更多关于uni-app uni.requestPayment提交给支付宝的报文多了一些不必要的参数且sign传参错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这个确实可以调通啊,orderInfos是老接口的格式,现在支付宝官方是2.0接口了,而且加密算法也不支持rsa,而是rsa2。能不能搞个2.0接口alipay.trade.app.pay的demo呢?
我这边反复测试了,用老版本的方式也不行,因为密钥已经是rsa2格式的密钥,不是rsa,rsa格式的公钥和私钥支付宝后台不能设置了。用老版本参数传参,返回的是“系统繁忙”的错误,orderInfo示例值如下:_input_charset=“UTF-8”&body=“1”&it_b_pay=“1d”¬ify_url=“http://istock.goldbrantech.com”&out_trade_no=“202403302031625”&partner=“2021002117687436”&payment_type=“1”&service=“mobile.securitypay.pay”&show_url=“http://istock.goldbrantech.com”&sign_type=“RSA”&subject=“NIKEHOODLANDSUEDE”&total_fee=“434.70”&sign=“TxWhpshga1mlU5HvDy+HYkWHqPAlaX3XDVPrMUQ5SIXMLYulnWveBn4pd50NGCofXbCMEC1CRaYAxunPPlvwdpM0Dbt0XkGeHF+AAMF5+yMCx8R0slQ3Ppp/vY/MI08+jTHCpwMp1ia8LdPp6W6mL6S2hQnPlrPoq/yDqlcHKqPJjwbHBXUwSaT3eKqmS8Da7atqEbcJ75oNfrkhT/82NLiBMBToln4folbUFyYBojPrGUh45Wa8pTcqHU+F/usmPsi7aPuKg3/Z+28RZySMIOft2LB2Jvss7bAe6B1bl+OSanEy9Ik57tSak9TTnzbu7VfogpnPN1R9BdwFw8+hVg==”
因此还希望能够给出2.0版本的支付调用示例,或者进一步帮助分析下上老版本调用出错的原因,非常感谢
我们目前服务器端的代码是https://github.com/dcloudio/H5P.Server/blob/master/payment/alipay/index.php ,你那里可以参照一下
另外https://demo.dcloud.net.cn/payment/alipayrsa2/?total=0.01 这个接口对应的是支付宝官方的2.0接口,demo也是可以调通过的,对应的服务器端代码在https://github.com/dcloudio/H5P.Server/blob/master/payment/alipayrsa2/index.php 里面,您可以参照一下
在使用 uni-app
的 uni.requestPayment
进行支付宝支付时,如果发现提交的报文中包含不必要的参数,或者 sign
传参错误,可能是由于以下几个原因导致的:
1. 检查 uni.requestPayment
的参数
uni.requestPayment
的 provider
为 alipay
时,需要传递的参数包括:
orderInfo
: 支付宝的支付订单信息,通常是一个字符串,包含了支付宝需要的参数,如app_id
,method
,charset
,timestamp
,version
,biz_content
,sign_type
,sign
等。
确保传递给 orderInfo
的参数是必要的,并且没有多余的参数。
2. sign
参数错误
sign
是支付宝支付请求的签名,用于验证请求的合法性。如果 sign
传参错误,可能是以下原因:
- 签名生成错误:
sign
是通过对请求参数按照一定规则排序后,使用支付宝提供的私钥进行签名的结果。确保签名生成的过程正确,并且使用了正确的私钥。 - 参数顺序错误:支付宝要求参数按照字母顺序排序后再进行签名,确保参数顺序正确。
- 字符编码问题:确保在生成签名时,字符编码统一为
UTF-8
。
3. 检查支付宝开放平台的配置
- 确保在支付宝开放平台配置的应用信息(如
app_id
)与代码中使用的信息一致。 - 检查支付宝的公钥和私钥是否正确配置。
4. 示例代码
以下是一个简单的 uni.requestPayment
调用支付宝支付的示例:
uni.requestPayment({
provider: 'alipay',
orderInfo: 'app_id=2014072300007148&method=alipay.trade.app.pay&charset=utf-8×tamp=2014-07-24 03:07:50&version=1.0&biz_content={"body":"测试商品","subject":"App支付测试","out_trade_no":"2016072321001004370000000001","timeout_express":"30m","total_amount":"0.01","product_code":"QUICK_MSECURITY_PAY"}&sign_type=RSA2&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE',
success: function (res) {
console.log('支付成功:' + JSON.stringify(res));
},
fail: function (err) {
console.log('支付失败:' + JSON.stringify(err));
}
});