关于微信公众号支付接口开发遇到的奇葩问题,始终返回get_brand_wcpay_request:fail。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ycj1982/article/details/86590105

最近公司开发网站针对微信公众号的支付功能。

由于公司目前的这个项目网站是使用asp代码开发的,但是微信官方给出的demo中是没有asp版本的,所以楼主只有下载demo的php版本作为参考写了一个asp版本的代码。

阅读官方的提供的公众号支付文档理清支付发起到调用微信完成付款功能(吐槽下微信的官方文档写的太tmkd了,有些写的模糊了就靠你去猜去实验才能得出结果)。

楼主的产品想实现的功能场景:支付页面显示(购买的产品名称、价格、一个”微信支付“按钮)用户点击支付按钮即发起支付请求--> 支付界面-->输入密码完成支付-->支付接口。

以下是具体的实施步骤:

第一步:https://open.weixin.qq.com/connect/oauth2/authorize?appid="& APPID &"&redirect_uri="& server.URLEncode(sq_redirect_uri) &"&response_type=code&scope=snsapi_base&state="&zdy_Scope_rnd &"#wechat_redirect" 准备参数appid、redirect_uri(回调地址,这里强调的是域名必须是开发-->接口权限-->网页服务-->网页帐号中设置的”授权回调页面域名“ 一致)、state(自定义的一个随机数会在回调地址返回)。这一步主要是为了获取到下一步所需的code参数。


第二步:获取到用户的openid 值, 使用第一步获取到的code值向链接"https://api.weixin.qq.com/sns/oauth2/access_token?appid="&APPID &"&secret="& APPSECRET &"&code="& code &"&grant_type=authorization_code " 发起请求,获取到openid并返回。

第三步:发起统一下单请求楼主订单中发起请求的参数具体如下:

<xml>
<appid><![CDATA[wxd0e0c464757a7115]]></appid>
<attach><![CDATA[http://www.xxx.com/]]></attach>
<body><![CDATA[VIP]]></body>
<device_info><![CDATA[WEB]]></device_info>
<mch_id>1243421302</mch_id>
<nonce_str><![CDATA[u7js179v7n89l6qqawdfk92fopcuv215]]></nonce_str>
<notify_url><![CDATA[http://www.xxx.com/pay/weixin/notify_url.asp]]></notify_url>
<openid><![CDATA[oTzVMt-kSBMKl_lJ4Ae6oiXuw_9k]]></openid>
<out_trade_no>1243321302201608291503546252</out_trade_no>
<product_id><![CDATA[vip]]></product_id>
<spbill_create_ip><![CDATA[171.221.108.70]]></spbill_create_ip>
<time_start>1472454234</time_start>
<total_fee>200</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<sign><![CDATA[A2E1EC2F1B27A2FDA4CD320F8A1DEA5D]]></sign>
</xml>
注意:

1、参数openid 是由第一、二步获取到的。微信公众号支付是必须要传递此参数的。

2、参数中的sign 等于 除sign值以外的参数的键值对经过排序后再使用MD5加密后的值(具体的签名规则请看官方签名文档)

楼主出错的地方就是下面这步,这一步的参数和统一下单成功后返回的参数容易混淆。(汗,不知道是不是只有我才这样)

统一下单成功后返回的参数如下:

<span style="color:#ff0000;"><xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxd0e0c464757a7115]]></appid>
<mch_id><![CDATA[<span style="font-family: Arial, Helvetica, sans-serif;">1243421302</span><span style="font-family: Arial, Helvetica, sans-serif;">]]></mch_id></span>
<device_info><![CDATA[WEB]]></device_info>
<nonce_str><![CDATA[gVP5zlIpYsbLtfz6]]></nonce_str>
<sign><![CDATA[F4ED8A586E771F260D7D1642BEF4ACFC]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx20160829150354e78e2929360536214673]]></prepay_id>
<trade_type><![CDATA[JSAPI]]></trade_type>
</xml></span>
以下是发起网页端调起支付API的官方代码:
<span style="color:#3333ff;">function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package" : "prepay_id=u802345jgfjsdfgsdg888",     
           "signType" : "MD5",         //微信签名方式:     
           "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();

</span>

下单成功返回结果中有nonce_str、prepay_id、sign 这三个参数值和发起调用时要传递三个参数也一样,所以楼主就认为把这三个值作为发起调用支付API的参数来操作。悲催的是测试支付时始终返回的结果是:get_brand_wcpay_request:fail 。
最开始楼主一直没发现是传递的参数出现了问题,仔细检查步骤方法等没错的嘛,求助度娘,各种搜索引擎查找类似的情况都说可能是支付授权目录,但是修改了很多个目录还是不行。最后没办法了又去仔细研究官方给出的文档发现了只有prepay_id值才是明确指出是统一下单获取到的值,猜想那其他参数都是重新设置的,sign签名参数是由要传递的参数(appId、timeStamp、nonceStr、package、signType)键值对md5后的结果么,然后果断修改代码测试成功调起支付api。

以上是我在开发中遇到的问题,有时不知道怎么的就在一个问题上会给卡在哪儿,不过最终还是会找到原因或者处理办法的,再此记录以便有其他人遇到同样的问题。


--------------------- 
作者:永恒的微笑 
来源:CSDN 
原文:https://blog.csdn.net/ycj1982/article/details/52352809 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/ycj1982/article/details/86590105