标签


微信支付API的不一致性

2016年07月05日

简介

在集成微信支付中,遇到微信支付API的不一致性,一个很小的差别,导致调试起来难以发现。

一方面是自己粗心,没严格按照文档的数据格式发送请求;另外一方面是微信支付API不一致,并且对错误的数据没有任何提示。

过程

微信支付业务流程

微信支付业务流程

问题存在第5-7步中。

为了获取prepayid,需要发送相应的xml数据到微信统一支付URL中。例如:

<xml>
  <nonce_str>1487599986</nonce_str>
  <out_trade_no>1487599986909</out_trade_no>
  <openid>oW0jwjq6bz5lkOuc-FrLoEgzqFi0</openid>
  <appid>wx433752f4f2bb8af2</appid>
  <total_fee>1</total_fee>
  <sign>6BCA5610976DC2CD00E163C4AEB7078E</sign>
  <trade_type>JSAPI</trade_type>
  <mch_id>1357902202</mch_id>
  <body>good</body>
  <notify_url>http://www.example.com/goosee/pay/pay_notify</notify_url>
  <spbill_create_ip>221.178.200.20</spbill_create_ip>
</xml>

若一不小心将appid写成appId,那么你将无法获得任何数据,微信不会响应任何结果,不会说xml格式错误等,让人疑惑的是,在微信提供的签名校验响应的xml是能够通过校验的。

好,以下是成功获取prepareid

<xml>
  <return_code><![CDATA[SUCCESS]]></return_code>
  <return_msg><![CDATA[OK]]></return_msg>
  <appid><![CDATA[wx433752f4f2bb8af2]]></appid>
  <mch_id><![CDATA[1357902202]]></mch_id>
  <nonce_str><![CDATA[MPYqWjtpXZSEZztT]]></nonce_str>
  <sign><![CDATA[1296B5AF53F95C0A434DDA86DF76AC05]]></sign>
  <result_code><![CDATA[SUCCESS]]></result_code>
  <prepay_id><![CDATA[wx20170220221307c4effd6a1c0891519009]]></prepay_id>
  <trade_type><![CDATA[JSAPI]]></trade_type>
</xml>

接下来需要在H5页面中提供响应的参数,在后端传递给前端的Model数据中JS中字段为appId,而不是去获取prepay_id的appid

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId" : "wx2421b1c4370ec43b",     //公众号名称,由商户传入
           "timeStamp":" 1395712654",         //时间戳,自1970年以来的秒数
           "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
           "package" : "prepay_id=wx20170220221307c4effd6a1c0891519009",
           "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();
}

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1

总结:阅读文档细心,自己做设计也需要考虑全面,API友好,给出较为全面的错误码和错误描述。