首先我们用 js-api 完成支付下单,拿到 prepay_id 之后,接下来就是拉起支付界面。拉起支付界面有 2 种方式:
wx.chooseWXPay(options)
;WeixinJSBridge.invoke('getBrandWCPayRequest',options, callback)
;第一种方法需要引入公众号网页开发的 jssdk,需要拿到 ticket、签名之后,再 wx.config()
,通过 wx.config()
指定获取哪些权限。而第二种方法不需要以上步骤,只需要判断 WeixinJSBridge 这个对象在 window 是否存在,存在了就直接 invoke 某个功能,例如 getBrandWCPayRequest、、getUserConfig、imagePreview 等。
在小程序的技术发展史上,微信解释了 js-sdk 和 WeixinJSBridge 的关系:
实际上,微信官方是没有对外暴露过
WeixinJSBridge.invoke
这种调用方法,此类 API 最初是提供给腾讯内部一些业务使用,很多外部开发者发现了之后,依葫芦画瓢地使用了,逐渐成为微信中网页的事实标准。2015 年初,微信发布了一整套网页开发工具包,称之为 JS-SDK,开放了拍摄、录音、语音识别、二维码、地图、支付、分享、卡券等几十个 API。给所有的 Web 开发者打开了一扇全新的窗户,让所有开发者都可以使用到微信的原生能力,去完成一些之前做不到或者难以做到的事情。
在微信支付 api v3 的开发文档中,微信官方给出了使用 WeixinJSBridge 在前端唤起微信支付界面的代码示例,即上述第二种方法。在这个页面中,微信表示:
WeixinJSBridge.invoke
前需要先判断 window 对象是否有 WeixinJSBridge;网友发现 WeixinJSBridge 在安卓不稳定,可能无法唤起微信支付。
注意
chooseWXPay
、getBrandWCPayRequest
所接收的 options
参数有两个细微区别:
timestamp
(公众号 js-sdk 的所有时间戳都是 timestamp
),而后者是 timeStamp
;以下是代码示例:
WeixinJSBridge.invoke(
"getBrandWCPayRequest",
{
appId: "",
timeStamp: "1395712654", //时间戳,自1970年以来的秒数
nonceStr: "xxxxx", //随机串
package: "prepay_id=xxxx",
signType: "RSA", //微信签名方式:
paySign: "xxxx", //微信签名
},
function (res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 使用以上方式判断前端返回,微信团队郑重提示:
//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
}
}
);
wx.chooseWXPay({
timestamp: "", // 秒数,支付签名时间戳,微信jssdk中的所有使用timestamp字段均为小写
nonceStr: "", // 支付签名随机串,不长于 32 位
package: "", // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: "", // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: "", // 支付签名
success: function (res) {
// 支付成功后的回调函数
},
});