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) 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'); alert(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); 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, }); } }); } }); }); }