微信支付支付验证签名失败!

chenchen3872 2016-10-27 02:57:42
php代码结构如下:
if($msg == "OK"){
$result['appId'] = $this->appid;
$result["timeStamp"] = time();
$result["nonceStr"] = md5(time() . mt_rand(0,1000));;
$result["package"] = "prepay_id=".$postObj->prepay_id;
$result["signType"] = "MD5";

ksort($result);
$paySignStr = '';
foreach ($result as $k=>$v)
{
$paySignStr .= $k.'='.$v.'&';
}
$paySignStr = $paySignStr ."key=".$this->apikey;

$result["paySign"] = strtoupper(MD5($paySignStr));
$this->ajaxReturn(array(
'result' => $result,
'status' => 1
));
}

这个$msg自然是上边统一支付订单得到的数据,也就是说用同样方式的签名统一支付订单是没问题的.

js代码如下:
if(data.status==1){
wx.chooseWXPay({
timeStamp: data.result.timeStamp,
nonceStr: data.result.nonceStr,
package: data.result.package,
signType: data.result.signType,
paySign: data.result.paySign,

success: function (res) {
var str = JSON.stringify(res);
alert(str);
if(res.errMsg == "chooseWXPay:ok"){
alert("支付成功!");
}else{
alert("支付失败!");
}
}
});
}
这些都是写在ajax回调函数里的
然后一直返回"errMsg":"chooseWXPay:fail" 支付验证签名失败
用的是已认证的服务号,检查了目录,测试授权目录写的:www.xxx.com/pay/.我的实际支付目录写的是www.xxx.com/pay/pay/
也将自己的微信号添加上了白名单.
参数检查也没有错误,以上签名方式应该也不会错(和统一支付订单一种签名),
实在检查不出来到底哪里出了问题.求论坛的大神帮个忙.
...全文
16845 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
那些日子! 2018-11-08
  • 打赏
  • 举报
回复
我这是怎么回事啊
zeroIris1 2017-08-17
  • 打赏
  • 举报
回复
可能原因:调统一下单时采用的加密方式是HMACSHA256, 会导致JSAPI报这个错,必须根JSAPI用同一种(MD5)(坑b设计)
chenchen3872 2016-10-28
  • 打赏
  • 举报
回复
引用 7 楼 chinmo 的回复:
[quote=引用 6 楼 chenchen3872 的回复:] 有没有大神在啊?求解答啊,我用另外一种,不是jssdk里的方法,能够调起来,这两种虽然调用接口的方式不一样,但签名的参数是完全一样的.此外的设置也是完全一样的.我真的完全懵逼了. 代码如下: WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":'{$jssdk.appId}', //公众号名称,由商户传入 "timeStamp": data.result.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : data.result.nonceStr, //随机串 "package" : data.result.package, "signType" : "MD5", //微信签名方式: "paySign" : data.result.paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); 把ajax里的代码换成这样就立马调起来了,但听说这并不是微信官方的,有点不牢靠啊. 求解有没有大神知道二者的差别在哪里.我其他地方所有都没改,就这个方法一改.说明我的签名,授权目录什么的都是没问题的
我无语,你难道不知道JSapi里也有一个返回notify_url接受的?如果你不知道这个,说明你根本没有写,jsapi这个notify_url接受数据,是看不到,只微信跟服务器之间的一个通宵,用来接收处理微信返回信息的,并且用来处理网站订单信息的[/quote] 额,版主大大,是不是我们看的不是同一个jssdk文档啊 微信支付 发起一个微信支付请求 wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } }); 备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。 请注意该接口只能在你配置的支付目录下调用,同时需确保支付目录在JS接口安全域名下。 这个接口文档的内容就这么点儿,然后我还整个jssdk文档看了两遍,并没有那个jsapi的notify_url.版主大大能够说的详细点儿么?我是真找不到这个东西在哪里设置的,谢谢版主大大了.
  • 打赏
  • 举报
回复
引用 6 楼 chenchen3872 的回复:
有没有大神在啊?求解答啊,我用另外一种,不是jssdk里的方法,能够调起来,这两种虽然调用接口的方式不一样,但签名的参数是完全一样的.此外的设置也是完全一样的.我真的完全懵逼了. 代码如下: WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":'{$jssdk.appId}', //公众号名称,由商户传入 "timeStamp": data.result.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : data.result.nonceStr, //随机串 "package" : data.result.package, "signType" : "MD5", //微信签名方式: "paySign" : data.result.paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); 把ajax里的代码换成这样就立马调起来了,但听说这并不是微信官方的,有点不牢靠啊. 求解有没有大神知道二者的差别在哪里.我其他地方所有都没改,就这个方法一改.说明我的签名,授权目录什么的都是没问题的
我无语,你难道不知道JSapi里也有一个返回notify_url接受的?如果你不知道这个,说明你根本没有写,jsapi这个notify_url接受数据,是看不到,只微信跟服务器之间的一个通宵,用来接收处理微信返回信息的,并且用来处理网站订单信息的
chenchen3872 2016-10-28
  • 打赏
  • 举报
回复
引用 13 楼 chinmo 的回复:
[quote=引用 12 楼 chenchen3872 的回复:] [quote=引用 11 楼 chinmo 的回复:] 估计你现在用的是v2版本的
额,版主大大,又看了两篇文章,里面的说法是,两种接口都是v3可用的,但现在相较而言都推荐jsapi. 差别的是jsapi可以同其他js一起使用,需要wx.config验证,你贴的这种,也是我调用成功的这种是单独的微信支付,不需要jssdk验证. 然而,我jssdk验证成功了,却调不起jsapi.反而单独的WeixinJSBridge.invoke这个调起来了. 没办法了先不管了,这种能调先用着了.也没人能说出其中具体的优缺点,微信文档里也还是这个. 感谢版主大大了,帖子沉三天.三天后结贴.
  • 打赏
  • 举报
回复
引用 12 楼 chenchen3872 的回复:
[quote=引用 11 楼 chinmo 的回复:] 估计你现在用的是v2版本的
版主大大,你贴的那个方法,我可以调用成功的. 但是jssdk里面的那个jsapi我调不起来,jssdk里面的jsapi文档太简单了,给了个具体链接文档,但具体链接里的却不是同一个方法,而是你贴的那个方法. 我被文档绕糊涂了.我也担心过是不是版本问题,但是我公司是今年刚刚成立的,公众号也是才申请的,不可能是v2的,刚刚也确定了下,密钥也是自己设置的,不是v2版本里微信发给来的,确认为v3版本无误. 按我现在的理解是,大大你贴的那个方法是V2版本的,而我的微信可以调用这个方法,v3版本的wx.chooseWXPay我却调不起来,但我的公众号支付版本,确实又是v3的,所以,我真的有点懵了.还是我理解错误,其实这个方法才是v3的,jssdk的支付api是v2的,额,想想也不可能.ps:微信文档更新也太慢了,v3版本14年9月份就出了,两年了还没更新文档.[/quote] 我贴的方法是v3的,绝不是v2的,你的那个才是v2的写法
chenchen3872 2016-10-28
  • 打赏
  • 举报
回复
引用 11 楼 chinmo 的回复:
估计你现在用的是v2版本的
版主大大,你贴的那个方法,我可以调用成功的. 但是jssdk里面的那个jsapi我调不起来,jssdk里面的jsapi文档太简单了,给了个具体链接文档,但具体链接里的却不是同一个方法,而是你贴的那个方法. 我被文档绕糊涂了.我也担心过是不是版本问题,但是我公司是今年刚刚成立的,公众号也是才申请的,不可能是v2的,刚刚也确定了下,密钥也是自己设置的,不是v2版本里微信发给来的,确认为v3版本无误. 按我现在的理解是,大大你贴的那个方法是V2版本的,而我的微信可以调用这个方法,v3版本的wx.chooseWXPay我却调不起来,但我的公众号支付版本,确实又是v3的,所以,我真的有点懵了.还是我理解错误,其实这个方法才是v3的,jssdk的支付api是v2的,额,想想也不可能.ps:微信文档更新也太慢了,v3版本14年9月份就出了,两年了还没更新文档.
  • 打赏
  • 举报
回复
估计你现在用的是v2版本的
  • 打赏
  • 举报
回复
引用 8 楼 chenchen3872 的回复:
[quote=引用 7 楼 chinmo 的回复:] [quote=引用 6 楼 chenchen3872 的回复:] 有没有大神在啊?求解答啊,我用另外一种,不是jssdk里的方法,能够调起来,这两种虽然调用接口的方式不一样,但签名的参数是完全一样的.此外的设置也是完全一样的.我真的完全懵逼了. 代码如下: WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":'{$jssdk.appId}', //公众号名称,由商户传入 "timeStamp": data.result.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : data.result.nonceStr, //随机串 "package" : data.result.package, "signType" : "MD5", //微信签名方式: "paySign" : data.result.paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); 把ajax里的代码换成这样就立马调起来了,但听说这并不是微信官方的,有点不牢靠啊. 求解有没有大神知道二者的差别在哪里.我其他地方所有都没改,就这个方法一改.说明我的签名,授权目录什么的都是没问题的
我无语,你难道不知道JSapi里也有一个返回notify_url接受的?如果你不知道这个,说明你根本没有写,jsapi这个notify_url接受数据,是看不到,只微信跟服务器之间的一个通宵,用来接收处理微信返回信息的,并且用来处理网站订单信息的[/quote] 额,版主大大,是不是我们看的不是同一个jssdk文档啊 微信支付 发起一个微信支付请求 wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***) signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } }); 备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。 请注意该接口只能在你配置的支付目录下调用,同时需确保支付目录在JS接口安全域名下。 这个接口文档的内容就这么点儿,然后我还整个jssdk文档看了两遍,并没有那个jsapi的notify_url.版主大大能够说的详细点儿么?我是真找不到这个东西在哪里设置的,谢谢版主大大了. [/quote] https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 这里下载回来的SDK例子中自己看吧
  • 打赏
  • 举报
回复
获取 $code 以后
<?php
 $code = $_GET['code'];
		$jsApi->setCode($code);
		$openid = $jsApi->getOpenId();
	//使用统一支付接口
	$unifiedOrder = new UnifiedOrder_pub();
	
	//设置统一支付接口参数
	//设置必填参数
	//appid已填,商户无需重复填写
	//mch_id已填,商户无需重复填写
	//noncestr已填,商户无需重复填写
	//spbill_create_ip已填,商户无需重复填写
	//sign已填,商户无需重复填写
	$unifiedOrder->setParameter("openid","$openid");//商品描述
	$unifiedOrder->setParameter("body",$bmshow['realname']." 报名 ".$meetshow['name']);//商品描述
	//自定义订单号,此处仅作举例
	$timeStamp = time();
	$out_trade_no = WxPayConf_pub::APPID."$timeStamp";
	$unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
	$unifiedOrder->setParameter("total_fee",$sfshow['price']*100);//总金额
	$unifiedOrder->setParameter("attach",$id);//商户支付日志
	$unifiedOrder->setParameter("notify_url",'http://www.aoyou0898.com/js_api_call.php');//通知地址 
	$unifiedOrder->setParameter("trade_type","JSAPI");//交易类型
	$prepay_id = $unifiedOrder->getPrepayId();
	//=========步骤3:使用jsapi调起支付============
	$jsApi->setPrepayId($prepay_id);
	$jsApiParameters = $jsApi->getParameters();
?>
<script type="text/javascript">

		//调用微信JS api 支付
		function jsApiCall()
		{
			WeixinJSBridge.invoke(
				'getBrandWCPayRequest',
				<?php echo $jsApiParameters; ?>,
				function(res){
					WeixinJSBridge.log(res.err_msg);
					//alert(res.err_code+res.err_desc+res.err_msg);
				}
			);
		}

		function callpay()
		{
			if (typeof WeixinJSBridge == "undefined"){
			    if( document.addEventListener ){
			        document.addEventListener('WeixinJSBridgeReady', jsApiCall, false);
			    }else if (document.attachEvent){
			        document.attachEvent('WeixinJSBridgeReady', jsApiCall); 
			        document.attachEvent('onWeixinJSBridgeReady', jsApiCall);
			    }
			}else{
			    jsApiCall();
			}
		}
		callpay();
	</script>
估计你用的不是这个方法了
chenchen3872 2016-10-27
  • 打赏
  • 举报
回复
有没有大神在啊?求解答啊,我用另外一种,不是jssdk里的方法,能够调起来,这两种虽然调用接口的方式不一样,但签名的参数是完全一样的.此外的设置也是完全一样的.我真的完全懵逼了. 代码如下: WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId":'{$jssdk.appId}', //公众号名称,由商户传入 "timeStamp": data.result.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr" : data.result.nonceStr, //随机串 "package" : data.result.package, "signType" : "MD5", //微信签名方式: "paySign" : data.result.paySign //微信签名 }, function(res){ if(res.err_msg == "get_brand_wcpay_request:ok" ) {} // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。 } ); 把ajax里的代码换成这样就立马调起来了,但听说这并不是微信官方的,有点不牢靠啊. 求解有没有大神知道二者的差别在哪里.我其他地方所有都没改,就这个方法一改.说明我的签名,授权目录什么的都是没问题的
chenchen3872 2016-10-27
  • 打赏
  • 举报
回复
引用 3 楼 chinmo 的回复:
[quote=引用 2 楼 chenchen3872 的回复:] [quote=引用 1 楼 chinmo 的回复:] 签名失败原因: 自己在回调程序写一个日志记录程序,得到微信返回的参数,还有sing的值,然后把返回的参数做一次签名加密,看看得到的值是否跟微信返回的sing的值相同,如果不相同,说明参数里有问题
可是,微信不返回数据给我啊0.0 它返回的只有这个:"errMsg":"chooseWXPay:fail" 支付验证签名失败 我把参数全都写死(prepay_id有效期2小时),然后组成签名,再把签名写死进去,还是提示签名验证失败.[/quote] 晕死,微信肯定返回数据的了,有一个回调地址,设置的notify_url就是接受微信返回的参数,你上面这个JS,是另外的JSapi返回的[/quote] 版主大神,我感觉你说的那个还是统一支付订单里的返回参数.那个xml返回的数值我是拿到了的,签名也是正确的,里面的prepay_id也拿到了,现在我是调jsapi出了问题,虽然二者的签名方式几乎一模一样,规则完全相同,但是我怎么弄还是签名错误. 我有调了一次,notify_url里只有验证统一支付订单的时候给我通知了.
chenchen3872 2016-10-27
  • 打赏
  • 举报
回复
引用 3 楼 chinmo 的回复:
[quote=引用 2 楼 chenchen3872 的回复:] [quote=引用 1 楼 chinmo 的回复:] 签名失败原因: 自己在回调程序写一个日志记录程序,得到微信返回的参数,还有sing的值,然后把返回的参数做一次签名加密,看看得到的值是否跟微信返回的sing的值相同,如果不相同,说明参数里有问题
可是,微信不返回数据给我啊0.0 它返回的只有这个:"errMsg":"chooseWXPay:fail" 支付验证签名失败 我把参数全都写死(prepay_id有效期2小时),然后组成签名,再把签名写死进去,还是提示签名验证失败.[/quote] 晕死,微信肯定返回数据的了,有一个回调地址,设置的notify_url就是接受微信返回的参数,你上面这个JS,是另外的JSapi返回的[/quote] 你指的是统一支付订单里设置的notify_url么? 可是我统一支付订单里是正确得到prepay_id的,难道我调wx.chooseWXPay的时候它也会把数据返回到这个地址,那我先去看看下.
  • 打赏
  • 举报
回复
引用 2 楼 chenchen3872 的回复:
[quote=引用 1 楼 chinmo 的回复:] 签名失败原因: 自己在回调程序写一个日志记录程序,得到微信返回的参数,还有sing的值,然后把返回的参数做一次签名加密,看看得到的值是否跟微信返回的sing的值相同,如果不相同,说明参数里有问题
可是,微信不返回数据给我啊0.0 它返回的只有这个:"errMsg":"chooseWXPay:fail" 支付验证签名失败 我把参数全都写死(prepay_id有效期2小时),然后组成签名,再把签名写死进去,还是提示签名验证失败.[/quote] 晕死,微信肯定返回数据的了,有一个回调地址,设置的notify_url就是接受微信返回的参数,你上面这个JS,是另外的JSapi返回的
chenchen3872 2016-10-27
  • 打赏
  • 举报
回复
引用 1 楼 chinmo 的回复:
签名失败原因: 自己在回调程序写一个日志记录程序,得到微信返回的参数,还有sing的值,然后把返回的参数做一次签名加密,看看得到的值是否跟微信返回的sing的值相同,如果不相同,说明参数里有问题
可是,微信不返回数据给我啊0.0 它返回的只有这个:"errMsg":"chooseWXPay:fail" 支付验证签名失败 我把参数全都写死(prepay_id有效期2小时),然后组成签名,再把签名写死进去,还是提示签名验证失败.
  • 打赏
  • 举报
回复
签名失败原因: 自己在回调程序写一个日志记录程序,得到微信返回的参数,还有sing的值,然后把返回的参数做一次签名加密,看看得到的值是否跟微信返回的sing的值相同,如果不相同,说明参数里有问题

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧