很坑阿
在vue里面使用jssdk
根据业务场景 "根据业务场景")根据业务场景
- 首先拿到code
- 把code发给后端,解析出openId和accessToken
- 接着把当前页面网址发给后端,申请jsSDK的配置签名
- 拿到之后再前端配置wx.config
- 再调用jssdk相关方法
安装jssdk: npm install weixin-js-sdk --save-dev
只展示部分重要代码
在permission.js文件里 跳转路由的钩子事件里 router.beforeEach
1.首先拿到code
const openCode = getQueryString('code') ? getQueryString('code') : ''
2.把code发给后端,解析出openId和accessToken
const tokenPromisr = new Promise((resolve, reject) => {
checkOpenId({ openCode }).then(res => {
resolve()
}).catch(error => {
reject(error)
})
})
3.接着把当前页面网址发给后端,申请jsSDK的配置签名
**用Promise是因为要等拿到accessToken了再继续**
tokenPromisr.then(() => {
jsSDK({
url
}).then(res => {
wechatConfig(res.data)
})
})
4. 拿到之后再前端配置wx.config
**暂时只用了分享和支付的权限**
export function wechatConfig(config) {
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: config.appId, // 必填,公众号的唯一标识
timestamp: config.timeStamp, // 必填,生成签名的时间戳
nonceStr: config.nonceStr, // 必填,生成签名的随机串
signature: config.signature, // 必填,签名,见附录1
jsApiList: ['onMenuShareAppMessage', 'onMenuShareTimeline', 'chooseWXPay'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
})
}
5. 接着需要的页面里面去使用 我在首页用了分享 还有在支付页面用了支付
分享
export function groupWechatShare(data, cb, errorCb) {
const img = data.pictureKeys ? data.pictureKeys[0] : ''
const wechatState = store.getters.wechatState
const SHARE_URL = process.env.SHARE_URL
const IMG_URL = process.env.IMG_URL
wx.ready(function() {
// 分享到朋友圈
wx.onMenuShareTimeline({
title: data.goodsName, // 分享标题
link: SHARE_URL, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: IMG_URL + img, // 分享图标
success: function(res) {
// 用户确认分享后执行的回调函数
// cb(res)
},
cancel: function(res) {
// 用户取消分享后执行的回调函数
// errorCb(res)
}
})
// 分享给朋友
wx.onMenuShareAppMessage({
title: data.goodsName, // 分享标题
desc: '邀请您一起拼团啊', // 分享描述
link: SHARE_URL, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: IMG_URL + img, // 分享图标
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
success: function(res) {
// 用户确认分享后执行的回调函数
// cb(res)
},
cancel: function(res) {
// 用户取消分享后执行的回调函数
// errorCb(res)
}
})
})
}
支付
export function wexinPay(data, cb, errorCb) {
wx.ready(function() {
wx.chooseWXPay({
timestamp: parseInt(data.timeStamp), // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: data.nonce_str, // 支付签名随机串,不长于 32 位
package: 'prepay_id=' + data.prepay_id, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=***)
signType: 'MD5', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: data.paySign, // 支付签名
success: function(res) {
// 支付成功后的回调函数
cb(res)
},
fail: function(res) {
errorCb(res)
}
})
})
wx.error(function(res) {
// config信息验证失败会执行error函数,如签名过期导致验证失败,具体错误信息可以打开config的debug模式查看,也可以在返回的res参数中查看,对于SPA可以在这里更新签名。
/* alert("config信息验证失败");*/
})
}
坑的地方
========================
- 注意大小写参数 timestamp类似这种写成timeStamp 曾经卡了好几个小时都没检查出来
- 获取jssdk配置的url 一定要写成
const url = window.location.href.split('#')[0]
- 配置要配置好 支付目录 js安全目录什么的 杂七杂八的
- timestamp一定是int类型,后端如果反的string类型的,前端就会报错 调用支付JSAPI缺少参数:sign
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。