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&notify_url=null&return_url=null&sign_type=RSA2&timestamp=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&timestamp=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&notify_url=null&version=1.0&app_auth_token=null&encrypt_type=null&return_url=null&auth_token=null&app_id=2021002117687436&sign_type=RSA2&timestamp=2024-03-30 11:00:38

比较之后发现:

  1. sign参数似乎变成了,没有正确发送提供的sign
  2. 多了app_auth_token、encrypt_type、return_url、auth_token、app_access_token这几个参数
  3. format原本是json,这里却变成了xml 综上,uni.requestPayment这个接口跟实际提供的orderInfo参数不一致,导致支付宝验签失败,无法发起支付。

更多关于uni-app uni.requestPayment提交给支付宝的报文多了一些不必要的参数且sign传参错误的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

以下是可以跑通的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”&notify_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-appuni.requestPayment 进行支付宝支付时,如果发现提交的报文中包含不必要的参数,或者 sign 传参错误,可能是由于以下几个原因导致的:

1. 检查 uni.requestPayment 的参数

uni.requestPaymentprovideralipay 时,需要传递的参数包括:

  • 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&timestamp=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));
    }
});
回到顶部