import wx from 'weixin-js-sdk' import { Toast } from 'vant' import { getTimestamp, randomString, getSignature } from './utils.ts' class AuthWechat { /** * 获取浏览器地址 * */ signLink() { if (typeof window.entryUrl === 'undefined' || window.entryUrl === '') { window.entryUrl = document.location.href } let url = /(Android)/i.test(navigator.userAgent) ? document.location.href : window.entryUrl; return url.split('#')[0] } /** * 当前是否是微信环境 * */ isWeixin() { return navigator.userAgent.toLowerCase().indexOf("micromessenger") !== -1; } /** * 初始化 * */ wechat(ticket) { if (!this.isWeixin()) { return Toast.fail('当前不是微信环境'); } return new Promise((resolve, reject) => { let url = this.signLink() let timestamp = getTimestamp() let nonceStr = randomString() let signature = getSignature(ticket, nonceStr, timestamp, url) wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: process.env.VUE_APP_APPID, // 必填,公众号的唯一标识 timestamp, // 必填,生成签名的时间戳 nonceStr, // 必填,生成签名的随机串 signature, // 必填,签名 jsApiList: [ 'updateAppMessageShareData', // 自定义“分享给朋友”及“分享到QQ”按钮的分享内容 'updateTimelineShareData', // 自定义“分享到朋友圈”及“分享到QQ空间”按钮的分享内容(1.4.0) 'closeWindow', //关闭当前网页窗口接口 'chooseWXPay' ] }) wx.ready(res => { // 微信SDK准备就绪后执行的回调。 // console.log('wx.ready',res); resolve(wx, res) }) wx.error(err => { // console.log('wx.error',err) reject(wx, err) }) }) } /** * 微信分享 * @param {object} shareObj 分享内容对象 * */ wxShare(shareObj) { if (!this.isWeixin()) { return Toast.fail('当前不是微信环境'); } console.log('分享', shareObj) let norShare = new Promise((resolve, reject) => { wx.ready(() => { wx.updateAppMessageShareData({ title: shareObj.title, // 分享标题 desc: shareObj.desc, // 分享描述 link: shareObj.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致 imgUrl: shareObj.imgUrl, // 分享图标 success: function () { resolve('成功了') }, fail: function (res) { console.log('好友分享 失败', res); alert('fail:' + JSON.stringify(res)); reject(JSON.stringify(res)) } }) }) }) let friendShare = new Promise((resolve, reject) => { wx.ready(() => { wx.updateTimelineShareData({ title: shareObj.title, // 分享标题 desc: shareObj.desc, // 分享描述 link: shareObj.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号 JS 安全域名一致 imgUrl: shareObj.imgUrl, // 分享图标 success: function () { resolve('成功了') }, fail: function (res) { console.log('朋友圈分享 失败', res); alert('fail:' + JSON.stringify(res)); reject(JSON.stringify(res)) } }) }) }) return Promise.all([norShare, friendShare]) } wxPay(response) { if (!this.isWeixin()) { return Toast.fail('当前不是微信环境'); } console.log('支付', response); return new Promise((resolve, reject) => { wx.chooseWXPay({ appId: response.appId, timestamp: response.timeStamp, // 支付签名时间戳,注意微信 jssdk 中的所有使用 timestamp 字段均为小写。但最新版的支付后台生成签名使用的 timeStamp 字段名需大写其中的 S 字符 nonceStr: response.nonceStr, // 支付签名随机串,不长于 32 位 package: response.packageValue, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) signType: response.signType, // 微信支付V3的传入 RSA ,微信支付V2的传入格式与V2统一下单的签名格式保持一致 paySign: response.paySign, // 支付签名 complete: (res) => { console.log(res); reject(res) }, success: function (res) { // 支付成功后的回调函数 console.log(res); resolve(res) }, // cancel: function (err) { // reject(err) // } }) }) } } export default new AuthWechat();