微信公众号支付
一、获取用户openid
1.进入授权页面,获取code
2.授权后,回调页面通过code获取access_token
3.用access_token获取openid等用户基本信息
以上(2,3步在后台执行)
二、用openid获取调用JSAPI支付的参数
1.调用统一下单API,取得预支付id(prepay_id)
2.用prepay_id等其他必要参数构造JSAPI支付所需参数
三、用上一步取得的参数,前台调起支付
var code = getUrlParam("code"); $.ajax({ url: "用户授权回调页面,用code取token、openid", data: { code: code }, success: function(data) { if (data.result) { console.log(JSON.stringify(data)); $.ajax({ url: "/xxx/pay/wechat/jsapiParam", //取参数 data: { orderNo: orderNo, openId: data.data.oAuthId, }, success: function(data) { if (data) { console.log(JSON.stringify(data)) paramData = data; if (data.errorCode == 0) { callpay();//调起支付控件 } else { var dia = $.dialog({ title: '错误提示', content: data.msg, button: ["确认"] }); } } } }) }else{ if (data.errCode == 1) { var dia = $.dialog({ title: '错误提示', content: "链接无效", button: ["确认"] }); dia.on("dialog:action", function(e) { if (e.index == 0) { location.replace("http://order-pay.html?orderNo="+orderNo); } }); } } } }) //调用微信JS api 支付 function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId": paramData.appId, //公众号名称,由商户传入 "timeStamp": paramData.timeStamp, //时间戳,自1970年以来的秒数 "nonceStr": paramData.nonceStr, //随机串 "package": paramData.package, "signType": "MD5", //微信签名方式: "paySign": paramData.paySign //微信签名 }, function(res) { WeixinJSBridge.log(res.err_msg); if (res.err_msg == "get_brand_wcpay_request:ok") {//支付成功处理 location.replace("/pay-success.html"); } if(res.err_msg == "get_brand_wcpay_request:cancel" || res.err_msg == "get_brand_wcpay_request:fail"){
//支付失败或取消支付处理 location.replace("http://order-pay.html?orderNo="+orderNo); } else { var dia = $.dialog({ title: '错误提示', content: JSON.stringify(res), button: ["确认"] }); } //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(); } }
要做到在订单支付页面调起支付(用户无感知授权),需要在进入订单支付前取得code并保存openid,进入订单支付页面后,直接通过已经保存的openid获取相应参数调起JSAPI支付
附:
接口调试工具:https://pay.weixin.qq.com/wiki/tools/signverify/
文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
注意:
1.商户号在公众号中申请的,申请成功后商户号与公众号的appid相关联的
2.需要在商户号的"api安全"中设置一个32位的key,该key与商户号对应,没设置或key不正确会导致报签名错误
3.调用jsapi的方式支付,需要在公众号中设置支付安全目录
4.用户登录授权的公众号应该是收款商户号所关联的公众号,不能是其他公众号,否则会报签名错误,因为不同公众号取得的用户openid不一样(unionid是一样的)