uniapp 公众号支付(hash模式)
- 根据Uniapp官网,集成jweixin-module
npm install jweixin-module --save
- 需要在微信公众平台,设置-公众号设置-功能设置-网页授权域名,配置自己的H5域名,作用网页授权获取openId(支付签名需要用到,此处是后台需要做的功能),同时,因为公众号和微信商户号是两个账号,所以需要绑定到微信商户账号上。
- 微信商户平台 绑定支付授权目录,直接用顶级域名即可,不用详细的
4.下订单、通过订单获取后台生成的签名、时间戳之类的数据,这些需要后台在微信官网参考
5. 获取签名之后,就是前端的工作了,在需要支付的页面的script里引入第一步的库
js-sdk参考文档
[微信支付开发文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)
var jweixin = require('jweixin-module');
- 调用方法里依次实现config方法、ready方法,包含checkJsApi方法、chooseWXPay方法,把相应参数传进去就可以了。如下所示:
weChatPayment(obj) {
if (location.href.indexOf("?#") < 0) {
location.href = location.href.replace("#", "?#");
this.weChatPayment(obj)
}
let _self = this;
miniPay(obj).then(res => {
let { appId,nonceStr, paySign,signType, timeStamp } = res.returnMsg.prepay;
let packageName = res.returnMsg.prepay.package;
jweixin.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: appId, // 必填,公众号的唯一标识
timestamp: timeStamp.toString(), // 必填,生成签名的时间戳
nonceStr: nonceStr, // 必填,生成签名的随机串
signature: paySign, // 必填,签名
jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表
})
// 方法一开始: 我现在使用的第一种
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":appId, //公众号名称,由商户传入
"timeStamp":timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":nonceStr, //随机串
"package":packageName,
"signType":signType, //微信签名方式:
"paySign":paySign //微信签名
},
(res) =>{
if(res.err_msg == "get_brand_wcpay_request:ok" ){
this.payMaskHide = true; // 隐藏当前支付方式选择
uni.showToast({
title: '支付成功!',
duration: 2000,
mask: true
});
} else{
uni.showToast({
title: '支付失败!',
icon: 'none'
});
}
});
return false;
// 方法一结束: 我现在使用的第一种
// 方法二开始:第二种方式我没有测试,这里只是将第二种方式贴出来
jweixin.ready((result) => {
jweixin.checkJsApi({
jsApiList: ['chooseWXPay'], // 需要检测的JS接口列表,所有JS接口列表见附录2,
success: function(res) {
console.log('checkjsapi Success')
console.log(res);
},
fail:function(res) {
console.log('res')
console.log(res);
}
});
jweixin.chooseWXPay({
debug: true,
appId: appId,
timestamp: timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: nonceStr, // 支付签名随机串,不长于 32 位
package: packageName, // 统一支付接口返回的prepay_id参数值
signType: signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: paySign, // 支付签名
success: function (res) {
// 支付成功后的回调函数
console.log(res)
},
fail: function(err) {
console.log(err)
alert('支付失败', JSON.stringify(err))
}
});
})
})
return false;
// 方法二结束:第二种方式我没有测试,这里只是将第二种方式贴出来
},
注意:如提示当前页面未注册,参考第三步
如还是不能正常支付,则将下面代码放入 weChatPayment方法中,或者放在onload中,根据自己的实际情况决定,
if (location.href.indexOf("?#") < 0) {
location.href = location.href.replace("#", "?#");
this.weChatPayment(obj)
}
支付成功
注意:前面我们进页面(onload 或者 在weChatPayment 方法中)我们将location.href中的 #
改成了?#
,这时页面中的地址(之前#后面的路由)被当做了参数,当我们在离开页面的时候将他的地址改回来
if (location.href.indexOf("?#") > 0) {
location.href = location.href.replace("?#", "#");
}