import { subscribeMessage } from '@/libs/order' import { getProvider } from '@/utils' import WechatJSSDK from 'wechat-jssdk/dist/client.umd' import { getWechatConfig, wechatAuth } from '@/api/public' import { parseQuery } from '@/utils' import cookie from '@/utils/store/cookie' import store from '@/store' import dayjs from 'dayjs' // 支付模块 export const weappPay = option => { return new Promise((resolve, reject) => { if (store.state.$deviceType == 'weixinh5') { setTimeout(() => { location.href = option.mweb_url }, 100) resolve() return } if (store.state.$deviceType == 'weixin') { pay(option) .then(() => { uni.showToast({ title: '支付成功', icon: 'success', duration: 5000, }) resolve() }) .finally(res => { //if(typeof(res) == "undefined") return }) .catch(function() { uni.showToast({ title: '支付失败', icon: 'none', duration: 5000 }) reject() }) return } // 吊起微信支付 // getProvider('payment').then(provider => { let orderInfo = { appid: option.appid, noncestr: option.noncestr, package: option.package, partnerid: option.partnerid, prepayid: option.prepayid, sign: option.sign, timestamp: option.timestamp + '', } // 调用只接口 uni.requestPayment({ provider: 'wxpay', ...option, timestamp: orderInfo.timestamp, orderInfo, success: success => { console.log(success) uni.showToast({ title: '支付成功', icon: 'success', duration: 5000, }) let time = setTimeout(() => { clearTimeout(time) resolve(success) }, 3000) // #ifdef MP-WEIXIN subscribeMessage() // #endif }, fail: error => { console.log(error) if (error.errMsg == 'requestPayment:fail cancel') { uni.showToast({ title: '已取消支付', icon: 'none', duration: 5000 }) } else { uni.showToast({ title: error || error.msg, icon: 'none', duration: 5000 }) } reject(error) }, }) // }) }) } const STATE_KEY = 'wx_authorize_state' const WX_AUTH = 'wx_auth' const BACK_URL = 'login_back_url' const LOGINTYPE = 'loginType' let instance let wechatObj let appId let wechatLoading = false export function wechat() { console.log('初始化微信配置') wechatLoading = false return new Promise((resolve, reject) => { if (instance) return resolve(instance) getWechatConfig() .then(res => { console.log(res.data) const _wx = WechatJSSDK(res.data) console.log(_wx) appId = res.data.appId wechatObj = _wx _wx .initialize() .then(() => { instance = _wx.wx instance.initConfig = res.data resolve(instance) }) .catch(error => { console.log(error) uni.showToast({ title: error, icon: 'none', duration: 2000, }) reject() }) }) .catch(err => { console.log(err) reject() }) }) } export function clearAuthStatus() { cookie.remove(WX_AUTH) cookie.remove(STATE_KEY) } export async function oAuth() { console.log('处理微信授权') console.log(store) console.log(store.state) return new Promise((resolve, reject) => { // if (cookie.has(WX_AUTH)) { if (cookie.has(WX_AUTH) && store.state.token) { reject() return } const { code } = parseQuery() if (!code) { toAuth() return } else { auth(code) } resolve() }).catch(error => { console.log(error) }) } export async function auth(code) { console.log('获取微信授权') return new Promise((resolve, reject) => { let loginType = cookie.get(LOGINTYPE) let spread = cookie.get('spread') console.log('微信授权登录前获取spread', spread) wechatAuth(code, spread, loginType) .then(({ data }) => { console.log(data) const expires_time = dayjs(data.expires_time) const newTime = Math.round(new Date() / 1000) store.commit('login', data.token, expires_time - newTime) cookie.set(WX_AUTH, code, expires_time) cookie.remove(STATE_KEY) loginType && cookie.remove(LOGINTYPE) console.log('微信公众号授权登录,获取用户信息') store.dispatch('getUser').finally(() => { resolve() }) }) .catch(reject) }).catch(error => { console.log(error) }) } export async function toAuth() { if (wechatLoading) { return } wechatLoading = true wechat().then(wx => { location.href = getAuthUrl(appId) }) } function getAuthUrl(appId) { // const redirect_uri = encodeURIComponent(window.location.href); // const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`); // #ifdef H5 // #endif cookie.set('redirect', window.location.href) const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index`) // const redirect_uri = encodeURIComponent(`${location.origin}/pages/Loading/index?path=${encodeURIComponent(window.location.href)}`); // const redirect_uri = encodeURIComponent(`${window.location.origin}${window.location.pathname}`) // const redirect_uri = encodeURIComponent(`${location.origin}`) cookie.remove(BACK_URL) const state = 'STATE' // const state = encodeURIComponent(("" + Math.random()).split(".")[1] + "authorizestate"); cookie.set(STATE_KEY, state) return `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appId}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect` } function toPromise(fn, config = {}) { return new Promise((resolve, reject) => { fn({ ...config, success(res) { resolve(res) }, fail(err) { reject(err) }, complete(err) { reject(err) }, cancel(err) { reject(err) }, }) }) } export function pay(config) { console.log(instance) return toPromise(instance.chooseWXPay, config) } export function openAddress() { return new Promise((resolve, reject) => { wechatEvevt('openAddress', {}) .then(res => { resolve(res) }) .catch(res => { if (res.is_ready) { res.wx.openAddress({ fail(res) { reject(res) }, success(res) { resolve(res) }, }) } else { reject(res) } }) }) } export function openShareAll(config) { config || {} config.type = config.type == undefined ? 'link' : config.type return new Promise(resolve => { getWechatConfig().then(res => { wechatObj.signSignature({ nonceStr: res.data.nonceStr, signature: res.data.signature, timestamp: res.data.timestamp, }) instance = wechatObj.getOriginalWx() instance.ready(() => { instance.updateAppMessageShareData(config) instance.updateTimelineShareData(config) resolve() }) }) }) } export function openShareAppMessage(config) { instance.updateAppMessageShareData(config) instance.onMenuShareAppMessage && instance.onMenuShareAppMessage(config) } export function openShareTimeline(config) { instance.updateTimelineShareData(config) instance.onMenuShareTimeline && instance.onMenuShareTimeline(config) } export function wechatEvevt(name, config) { return new Promise((resolve, reject) => { let wx let configDefault = { fail(res) { if (wx) return reject({ is_ready: true, wx: wx }) getWechatConfig().then(res => { wechatObj.signSignature({ nonceStr: res.data.nonceStr, signature: res.data.signature, timestamp: res.data.timestamp, }) wx = wechatObj.getOriginalWx() reject({ is_ready: true, wx: wx }) }) }, success(res) { resolve(res) }, } Object.assign(configDefault, config) if (typeof instance !== 'undefined') { instance.ready(() => { if (typeof name === 'object') { name.forEach(item => { instance[item] && instance[item](configDefault) }) } else instance[name] && instance[name](configDefault) }) } else { getWechatConfig().then(res => { const _wx = WechatJSSDK(res.data) _wx.initialize().then(() => { instance = _wx.getOriginalWx() instance.ready(() => { if (typeof name === 'object') { name.forEach(item => { instance[item] && instance[item](configDefault) }) } else instance[name] && instance[name](configDefault) }) }) }) } }) } export function ready() { return new Promise(resolve => { if (typeof instance !== 'undefined') { instance.ready(() => { resolve(instance) }) } else { getWechatConfig().then(res => { const _wx = WechatJSSDK(res.data) _wx.initialize().then(() => { instance = _wx.wx instance.ready(() => { resolve(instance) }) }) }) } }) } export function wxShowLocation() { return new Promise(() => { wechatEvevt('getLocation', { type: 'wgs84' }) .then(res => { let latitude = res.latitude // 纬度 let longitude = res.longitude // 经度 cookie.set(LATITUDE, latitude) cookie.set(LONGITUDE, longitude) }) .catch(res => { if (res.is_ready) { res.wx.getLocation({ success(res) { let latitude = res.latitude // 纬度 let longitude = res.longitude // 经度 cookie.set(LATITUDE, latitude) cookie.set(LONGITUDE, longitude) }, cancel() { cookie.remove(LATITUDE) cookie.remove(LONGITUDE) uni.showToast({ title: '取消获取位置', icon: 'none', duration: 2000, }) }, fail() { cookie.remove(LATITUDE) cookie.remove(LONGITUDE) uni.showToast({ title: '授权失败', icon: 'none', duration: 2000, }) }, }) } }) }) }