微信内置浏览器接入微信支付文档(前端)

477 阅读3分钟

一、配置公众号及商户平台

打开微信公众号后台-》公众号设置-》功能设置 里配置网页授权域名,域名为项目域名,目的是用户授权时获取code

打开微信商户平台-》支付配置-》公众号支付 配置项目授权域名,主要是为了让微信支付给我们的域名加上域名白名单,支付成功会跳转回我们的页面

二、通过拉起微信授权获取code

1.首先判断是否是微信浏览器,只有微信内置浏览器才能拉起鉴权

if (ua.match(/MicroMessenger/i) == "micromessenger") {   //微信浏览器} else {  //其他浏览器}

2.请求微信接口

open.weixin.qq.com/connect/oau…

参数含义

参数

是否必须

说明

appid

公众号唯一标识

redirect_uri

授权后重定向的回调链接地址,请使用

urlencode
对链接处理

response_type

返回类型,请填写

code

scope

应用授权作用域,

snsapi_base
(不弹出授权页面,直接跳转,只能获取用户
openid
),
snsapi_userinfo
(弹出授权页面,可通过
openid
拿到昵称、性别、所在地。并且, 即使在未关注的情况下,只要用户授权,也能获取其信息 )

state

重定向后会带上

state
参数,开发者可以填写
a-zA-Z0-9
的参数值,最多
128
字节

#wechat_redirect

无论直接打开还是做页面

302
重定向时候,必须带此参数
**用户授权同意后**
如果用户同意授权,页面将跳转至redirect_uri/?code=CODE&state=STATE。通过decodeURIComponents进行解析url中code参数,Vue项目中不能使用router获取
getUrlKey (name) {//获取url 参数    return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || ["", ""])[1].replace(/\+/g, '%20')) || null; }

三、根据code获取用户唯一标识openid

通过发送code给后台,然后获取openid

四、微信支付

1.通过微信内置浏览器内置对象WeixinJSBridge拉起支付

if (typeof window['WeixinJSBridge'] === 'undefined') {        if (document.addEventListener) {          document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);        } else if (document['attachEvent']) {          document['attachEvent']('WeixinJSBridgeReady', onBridgeReady);          document['attachEvent']('onWeixinJSBridgeReady', onBridgeReady);        }      } else {        onBridgeReady({          "appId": appid,     //公众号名称,由商户传入               "timeStamp": timeStamp,         //时间戳,自1970年以来的秒数               "nonceStr": nonce_str, //随机串               "package": "prepay_id=" + prepay_id,          "signType": signType,         //微信签名方式:               "paySign": paySign //微信签名         });      }

function onBridgeReady (params) {  WeixinJSBridge.invoke(    'getBrandWCPayRequest', {    "appId": params.appId,     //公众号名称,由商户传入         "timeStamp": params.timeStamp,         //时间戳,自1970年以来的秒数         "nonceStr": params.nonceStr, //随机串         "package": params.package,    "signType": params.signType,         //微信签名方式:         "paySign": params.paySign //微信签名   },    function (res) {      if (res.err_msg == "get_brand_wcpay_request:ok") {        // 使用以上方式判断前端返回,微信团队郑重提示:        //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。      }    });}

2. 通过微信JsSDK拉起支付

wx.config({        debug: false,        nonceStr: nonce_str,        appId: appid,        signature: sign,        timestamp: timeStamp,        order_id: params.order_id,        jsApiList: [          'chooseWXPay'        ]      })      wx.ready(() => {        wx.chooseWXPay({          timestamp: timeStamp,          nonceStr: nonce_str,          package: 'prepay_id=' + prepay_id, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)          signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'          paySign,          success: function (res) {            // 支付成功后的回调函数          }        });      })      wx.error(function (res) {        Toast(res)      });

五、踩坑记

1. code已经通过url返回,为啥获取不到Code

需要进行decodeURIComponent解析

2.拉起支付时报“支付验证签名失败”

paysign加密错误,要根据文档里写的参数进行加密,加密方式要和统一下单接口一致才可

3.拉起支付时报“当前url未注册”

没有在微信商户平台注册项目域名