最近有在做一个网站业务,业务包括支付流程,原先只接了支付宝的支付。但是这样在微信的浏览器会给用户带来较差的体验(不能正常跳转,需要用户自行复制链接到外部打开)。
然后就开始了接微信支付的踩坑之路。
首先我找到了这个文档
https://github.com/Tencent/weui/wiki/%E5%BE%AE%E4%BF%A1JSAPI 然后按照提示,跳转到了
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 前面的引入 JS 和 通过 config 接口注入权限验证配置都没有问题,很顺利的就 ok 了。
紧接着到了发起支付请求的步骤。
愿文档的说明是这样的

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

然后坑就出现了。根本找不到支付的返回值的结构。

这个时候看到了下面的提示

app内嵌H5 ios微信支付完会跳转到浏览器_时间戳


链接在此 点开,在找到 JSAPI支付,找到微信内H5调起支付

???

这跟前面说的不一样啊

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();
}

文档说明这是个微信浏览器的内置对象
仔细看看觉得很眼熟,于是回到开头 github 的链接地址一看,发现这是旧版的文档里的说明。

好吧文档里没有说明就自己打印调试看微信支付接口的返回值吧
打印出来发现格式基本和旧版的差不多,返回的
{‘errMsg’:‘chooseWXPay:ok’}
这就走完了支付成功的流程。

然后准备写支付取消的判断,发现判断 {‘errMsg’:‘chooseWXPay:cancel’} 并不对(黑人问号)
然后尝试着写

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
cancle: function() {
}
});

哇咔咔okk了终于。
(愿天堂所有程序员都喜欢写好看的文档)