import wx from 'weixin-js-sdk' import axios from './axios' import store from '../store.js' import $qxueyou from '@/config/qxueyou.js' import utilsUA from '@/plugins/utilsUA' import { getUUID, qxyResImg } from '@/plugins/utils' let newFeature = false let oldShare = ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareQZone'] let newShare = ['updateTimelineShareData', 'updateAppMessageShareData'] let weixinFlag = utilsUA.isWeixin let mobileFlag = utilsUA.isMobile let channel = weixinFlag && mobileFlag ? 'wx_pub' : 'wx_pub_qr' let isWxpub = 'wx_pub'.includes(channel) /** * 微信获取签名 * @param {*} toRoute 目标路由 */ function getWxSignature(toRoute) { if (!weixinFlag) { return false } axios.get('/wx/js/signature', { params: { url: location.href } }).then(res => { if (!res || !res.data) { return false } let result = res.data.data || {} wx.config({ // 微信配置 debug: false, appId: result.appId, timestamp: result.timestamp, nonceStr: result.nonceStr, signature: result.signature, jsApiList: [ ...(newFeature ? newShare : oldShare), 'chooseWXPay', 'chooseImage', 'getLocalImgData' ], openTagList: ['wx-open-launch-app'] }) wx.ready(function () { initShareOption(toRoute) }) wx.error(function (res) { console.log(res) }) }) } /** * 初始化分享数据 * @param {*} toRoute */ function initShareOption(toRoute) { if (!weixinFlag) { return false } let uuid = getUUID() let shareOptions = getShareOptions(uuid,toRoute) shareOptions.success = function () { shareSuccess(uuid,toRoute) } shareOptions.cancel = function () { console.log('取消分享') } shareOptions.trigger = function () { console.log('用户点击发送给朋友') } // 向下兼容旧版分享接口 if (!newFeature) { wx.onMenuShareTimeline(shareOptions) wx.onMenuShareAppMessage(shareOptions) } else { wx.updateAppMessageShareData(shareOptions) wx.updateTimelineShareData(shareOptions) } } /** * 获取分享数据 * @param {*} list */ function getShareOptions(uuid,toRoute) { let result = {} let customShare = store.state.share.custom if (customShare.title) { result.title = customShare.title result.desc = customShare.desc } else { result.title = toRoute.name result.desc = toRoute.name } if (customShare.imgUrl) { if (customShare.imgUrl.includes('http')) { result.imgUrl = customShare.imgUrl } else { result.imgUrl = qxyResImg(customShare.imgUrl) } } if (customShare.uuidLink) { let pageUrl = customShare.pageUrl || toRoute.fullPath let encode = encodeURI(`${uuid},${$qxueyou.htmlRoot + pageUrl}`) result.link = customShare.uuidLink + btoa(encode) // result.link = customShare.uuidLink + uuid } else if (customShare.link) { result.link = customShare.link } else { result.link = location.href } return result } /** * 分享成功回调 */ function shareSuccess(uuid,toRoute) { let customShare = store.state.share.custom if (customShare.targetId) { let pageUrl = customShare.pageUrl || toRoute.fullPath axios.post('/wx/share/callback', { urlId: uuid, pageUrl: $qxueyou.htmlRoot + pageUrl, targetId: customShare.targetId, planIds: customShare.planIds }).then(() => { initShareOption(toRoute) }) } // 当分享有方案Id,触发是否关注公众号 if (customShare.planIds) { store.commit('wxh5/subscribe', '及时获取奖励提醒') } let mask = store.state.share.mask if (mask.show) { let text = mask.type === 'plan' ? '分享成功,继续助力' : '邀请成功,继续邀请' let newMask = { show: true, type: mask.type, text: text, codeText: mask.codeText } store.commit("share/maskText", newMask) } } /** * 统一支付接口处理 * @param {*} orderId * @param {*} successCallback // 支付成功回调 * @param {*} showCodeCallback // 显示二维码回调 */ function unipayPay(orderId, successCallback, showCodeCallback) { axios.post('/wx/pay/createOrder', { orderId: orderId, channel: channel, redirectUrl: weixinFlag ? store.state.order.paySuccessUrl : undefined, }).then(res => { if (!res.data.data) { return false } let params = res.data.data.param if (isWxpub) { // 公众号支付 chooseWXPay(params, successCallback) } else { // 扫码支付 store.commit('timer/paying', true) showCodeCallback && showCodeCallback(params.codeUrl) checkIsPay(orderId, successCallback) } }) } function chooseWXPay(result, successCallback) { //调用微信支付接口 wx.chooseWXPay({ timestamp: result.timeStamp, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符 nonceStr: result.nonceStr, // 支付签名随机串,不长于 32 位 package: result.packageValue, // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*) signType: result.signType, // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: result.paySign, // 支付签名 success: () => { successCallback && successCallback() }, fail: (e) => { store.commit('snack/error', '请联系技术客服解决' + e.errMsg) } }) } /** * 扫码支付成功的回调 * @param {} orderId * @returns {} */ function checkIsPay(orderId, successCallback) { if (!store.state.timer.paying) { return false } setTimeout(function () { axios.get('/transact/order/payResult', { params: { orderId: orderId } }).then(res => { if (res.data.success) { successCallback && successCallback() store.commit('timer/paying', false) } else { checkIsPay(orderId, successCallback) } }) }, 2000) } /** * 获取定位 * @param {*} locationCallback */ function getPosition(locationCallback){ wx.getLocation({ success: function (res) { locationCallback(res) } }) } function chooseImage(){ return new Promise((resolve) => { wx.chooseImage({ count: 1, sizeType: ['compressed'], sourceType: ['camera'], success: (res) => { if (res && res.localIds) { getLocalImgData(res.localIds[0]).then((localData) => { resolve(localData) }) } else { store.commit('snack/error', `微信上传图片失败:${res}`) } }, fail:function(e) { store.commit('snack/error', `微信上传图片异常:${JSON.stringify(e)}`) } }) }) } function getLocalImgData(localId){ return new Promise((resolve) => { wx.getLocalImgData({ localId: localId, success: function (res) { resolve(res.localData) }, fail:function(e) { store.commit('snack/error', `微信获取图片异常:${JSON.stringify(e)}`) } }) }) } /** * 预览图片 * @param {*} url * @param {*} urlList */ function previewImage(current, urls){ wx.previewImage({ current: current, // 当前显示图片的http链接 urls: urls ? urls : [current] // 需要预览的图片http链接列表 }) } /** * 返回小程序页面 * @param {*} mpRouter // 小程序的路由 * @param {*} otherCallback // 其他回调操作 */ function redirectToMp(mpRouter) { return new Promise(resolve => { // 非微信 或 人社局活动入口 if (!weixinFlag || store.state.course.isRsjActivity) { resolve(true) return false } wx.miniProgram.getEnv(function(res) { if (res.miniprogram) { // 小程序 wx.miniProgram.redirectTo({ url: mpRouter, success: function(){ console.log('跳转成功') setTimeout(() => { // 处理其他机构的小程序跳转场景 resolve(true); }, 3000) }, fail: function(){ resolve(true) } }) } else { // 非小程序 resolve(true) } }) }) } /** * 向小程序发送消息 */ function postMessage(data) { // 非微信 if (!weixinFlag) { return false } wx.miniProgram.getEnv(function(res) { if (res.miniprogram) { // 小程序 wx.miniProgram.postMessage({ data: data }) } }) } export { getWxSignature, initShareOption, unipayPay, getPosition, previewImage, chooseImage, redirectToMp, postMessage }