| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- 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";
- const STATE_KEY = "wx_authorize_state";
- const WX_AUTH = "wx_auth";
- const BACK_URL = "login_back_url";
- const LOGINTYPE = "loginType";
- let instance;
- let wechatObj;
- const LONGITUDE = "user_longitude";
- const LATITUDE = "user_latitude";
- export default function wechat() {
- return new Promise((resolve, reject) => {
- if (instance) return resolve(instance);
- getWechatConfig()
- .then(res => {
- const _wx = WechatJSSDK(res.data);
- wechatObj = _wx;
- _wx
- .initialize()
- .then(() => {
- instance = _wx.wx;
- instance.initConfig = res.data;
- resolve(instance);
- })
- .catch(reject);
- })
- .catch(err => {
- console.log(err);
- reject(err);
- });
- });
- }
- export function clearAuthStatus() {
- cookie.remove(WX_AUTH);
- cookie.remove(STATE_KEY);
- }
- export function oAuth() {
- if (cookie.has(WX_AUTH) && store.state.app.token) return;
- const { code } = parseQuery();
- if (!code) return toAuth();
- }
- export function auth(code) {
- return new Promise((resolve, reject) => {
- let loginType = cookie.get(LOGINTYPE);
- //if (state !== cookie.get(STATE_KEY)) return reject();
- wechatAuth(code, parseInt(cookie.get("spread")), loginType)
- .then(({ data }) => {
- // const expires_time = dayjs(data.expires_time);
- // const newTime = Math.round(new Date() / 1000);
- // store.commit("LOGIN", data.token, expires_time - newTime);
- let expires_time = data.expires_time.substring(0, 19);
- expires_time = expires_time.replace(/-/g, "/");
- expires_time = new Date(expires_time).getTime() - 28800000;
- const datas = {
- token: data.token,
- expires_time: expires_time
- };
- store.commit("LOGIN", datas);
- cookie.set(WX_AUTH, code, expires_time);
- cookie.remove(STATE_KEY);
- loginType && cookie.remove("loginType");
- resolve();
- })
- .catch(reject);
- });
- }
- export function toAuth() {
- wechat().then(wx => {
- location.href = getAuthUrl(wx.initConfig.appId);
- });
- }
- function getAuthUrl(appId) {
- const redirect_uri = encodeURIComponent(
- `${location.origin}/auth/` +
- encodeURIComponent(
- encodeURIComponent(
- cookie.has(BACK_URL)
- ? cookie.get(BACK_URL)
- : location.pathname + location.search
- )
- )
- );
- cookie.remove(BACK_URL);
- 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) {
- return toPromise(instance.chooseWXPay, config);
- }
- 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 openAddress() {
- return new Promise((resolve, reject) => {
- wechatEvevt("openAddress", {})
- .then(res => {
- console.log(res);
- resolve(res);
- })
- .catch(res => {
- console.log(res);
- if (res.is_ready) {
- res.wx.openAddress({
- fail(res) {
- reject(res);
- },
- success(res) {
- resolve(res);
- }
- });
- } else {
- reject(res);
- }
- });
- });
- }
- /**
- * 公众号事件
- * @param name 事件名
- * @param config 配置
- * @returns {Promise<unknown>}
- */
- export function wechatEvevt(name, config) {
- return new Promise((resolve, reject) => {
- let wx;
- let configDefault = {
- fail(res) {
- console.log(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);
- },
- cancel(err) {
- reject(err);
- },
- complete(err) {
- reject(err);
- }
- };
- 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((resolve, reject) => {
- let longitude = cookie.get(LONGITUDE); //经度
- let latitude = cookie.get(LATITUDE); //纬度
- if (longitude && latitude) {
- return resolve({ longitude: longitude, latitude: latitude });
- }
- wechatEvevt("getLocation", { type: "wgs84" })
- .then(res => {
- let latitude = res.latitude; // 纬度
- let longitude = res.longitude; // 经度
- cookie.set(LATITUDE, latitude);
- cookie.set(LONGITUDE, longitude);
- resolve(res);
- })
- .catch(res => {
- cookie.remove(LATITUDE);
- cookie.remove(LONGITUDE);
- reject(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);
- resolve(res);
- },
- cancel(res) {
- cookie.remove(LATITUDE);
- cookie.remove(LONGITUDE);
- reject(res);
- },
- fail(res) {
- cookie.remove(LATITUDE);
- cookie.remove(LONGITUDE);
- reject(res);
- }
- });
- } else {
- cookie.remove(LATITUDE);
- cookie.remove(LONGITUDE);
- reject(res);
- }
- })
- .fail(error => {
- reject(error);
- });
- });
- }
|