发现小程序的这个问题非常诡异
首先,我从服务器获取到了五个必须的字段,这五个字段,我如果直接在代码里面写死数据,可以直接调起支付,没有问题.
当我直接把拿到的数据赋值给wx . requestPayment,作为参数的时候,会出现错误,-1的情况就出现了.
我的具体代码如下
success : function ( res ) {
wx . showToast ({
title : '创建订单成功' ,
duration : 1000 ,
mask : true
})
console . log ( res );
var time = String ( res . data . data . timeStamp )
var nonce = String ( res . data . data . nonceStr )
var packageName = String ( res . data . data . packageValue )
var pay = String ( res . data . data . paySign )
var sign = String ( res . data . data . signType )
console . log ( time )
console . log ( nonce )
console . log ( packageName )
console . log ( pay )
console . log ( sign )
wx . requestPayment ({
'timeStamp' : time ,
'nonceStr' : nonce ,
'package' : packageName ,
'signType' : 'MD5' ,
'paySign' : sign ,
success : function ( res ) {
console . log ( "success" );
console . log ( res );
},
fail : function ( res ) {
console . log ( "fail" );
console . log ( res );
},
complete : function ( res ) {
console . log ( "complete" );
console . log ( res );
}
})
}
代码对应的控制台输出如下
{data: {…}, header: {…}, statusCode: 200, errMsg: "request:ok"}data: code: 0data: appId: "wxc3c8295cb8a9c3d8"nonceStr: "1530760287929"packageValue: "prepay_id=wx051111278716365a8b8d5f3e0644257598"paySign: "CE7713C270DF032CF76F34C7D67B08BA"signType: "MD5"timeStamp: "1530760287"__proto__: Objectdesc: "成功"__proto__: ObjecterrMsg: "request:ok"header: {Content-Type: "application/json;charset=UTF-8", Date: "Thu, 05 Jul 2018 03:11:27 GMT", Vary: "Accept-Encoding", Content-Length: "242"}statusCode: 200__proto__: Object
11:11:28.016 pay.js? [sm]:177 1530760287
11:11:28.017 pay.js? [sm]:178 1530760287929
11:11:28.018 pay.js? [sm]:179 prepay_id=wx051111278716365a8b8d5f3e0644257598
11:11:28.018 pay.js? [sm]:180 CE7713C270DF032CF76F34C7D67B08BA
11:11:28.019 pay.js? [sm]:181 MD5
11:11:37.733 pay.js? [sm]:196 fail
11:11:37.734 pay.js? [sm]:197 {err_code: "-1", err_desc: "支付验证签名失败", errMsg: "requestPayment:fail"}
但是控制台输出的数据,我直接把控制台参数写死代码就可以调用支付,这个微信的好奇怪啊,难道跟编码有关系么?
我如果直接复制控制台参数到代码里面,直接可以过,而且调用起来微信没有问题.
wx . requestPayment ({
'timeStamp' : '1530760287' ,
'nonceStr' : '1530760287929' ,
'package' : 'prepay_id=wx051111278716365a8b8d5f3e0644257598' ,
'signType' : 'MD5' ,
'paySign' : 'CE7713C270DF032CF76F34C7D67B08BA' ,
success : function ( res ) {
console . log ( "success" );
console . log ( res );
},
fail : function ( res ) {
console . log ( "fail" );
console . log ( res );
},
complete : function ( res ) {
console . log ( "complete" );
console . log ( res );
}
})
小程序的bug?我已经实验过好多次了,就是这样的.不知道原因.
希望小程序的开发人员看看这个问题原因,我从接口获取数据,传递给wx.requestPayment就无法通过,我如果把数据直接写死就没问题,而且我已经对参数做了字符串处理,依然错误,希望尽快给个解决办法.目前我无法解决这个问题了.
问题出在paySign
,要么是你的签名有问题,要么是你返回签名的方式有问题。还有,尽量用官方支付包,尽量少自己写支付后台包,很容易出问题。
用的就是官方的,同样的值,只要接口传递,赋值给wx.requestPayment就出错,但是从控制台拷贝出来,写死在代码里面就不出错,这个诡异的问题,paySign没有任何问题.
你的随机字符串怎么不是三十二位的?
实例亲测成功,除了随机字符串,其他基本差不多
文档里面说了,小于等于32位的就可以,不一定非要是32位的,我现在的问题是,所有的参数都没问题,但是我直接赋值给requestPayment,就报错,但是我如果把参数在控制台打出来,然后直接字符串写死在代码里面就能通过,同样的东西,什么都没变,就会出现这样的错误,特别奇怪
生成签名数据时也是三十二位随机字符串,况且明确提示你签名有问题。我们当时对支付后台做了小改动,你检查一下后台吧。不必太纠结。这是很成熟的技术。总会调试ok的。
你在js中的sign的值传错了,实际传入的是signType的值
感谢,问题已经解决了.
你可以试试去空格,有些时候它莫名的就会多一个空格出来