224 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
import { isEmpty } from 'lodash';
 | 
						|
import third from '@/sheep/api/third';
 | 
						|
import $store from '@/sheep/store';
 | 
						|
 | 
						|
let sessionId = uni.getStorageSync('sessionId');
 | 
						|
let subscribeEventList = [];
 | 
						|
 | 
						|
// 加载微信小程序
 | 
						|
function load() {
 | 
						|
  checkUpdate();
 | 
						|
  // const sessionStatus = await checkSession();
 | 
						|
  // 小程序的接口改动太频繁了 强制每次进入都重新获取
 | 
						|
  const sessionStatus = false;
 | 
						|
  if (!sessionStatus) {
 | 
						|
    getSessionId();
 | 
						|
  }
 | 
						|
  getSubscribeTemplate();
 | 
						|
}
 | 
						|
 | 
						|
// 微信小程序授权登陆
 | 
						|
const login = async (e) => {
 | 
						|
  return new Promise(async (resolve, reject) => {
 | 
						|
    if (e.errMsg !== 'getPhoneNumber:ok') {
 | 
						|
      resolve(false);
 | 
						|
      return;
 | 
						|
    }
 | 
						|
 | 
						|
    const { error } = await third.wechat.login({
 | 
						|
      platform: 'miniProgram',
 | 
						|
      shareInfo: uni.getStorageSync('shareLog') || {},
 | 
						|
      payload: encodeURIComponent(
 | 
						|
        JSON.stringify({
 | 
						|
          sessionId: uni.getStorageSync('sessionId'),
 | 
						|
          code: e.code,
 | 
						|
          iv: e.iv,
 | 
						|
          encryptedData: e.encryptedData,
 | 
						|
        }),
 | 
						|
      ),
 | 
						|
    });
 | 
						|
 | 
						|
    if (error === 0) {
 | 
						|
      resolve(true);
 | 
						|
    }
 | 
						|
 | 
						|
    if (error === -1) {
 | 
						|
      getSessionId();
 | 
						|
    }
 | 
						|
    resolve(false);
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
// 微信小程序绑定
 | 
						|
const bind = () => {
 | 
						|
  return new Promise(async (resolve, reject) => {
 | 
						|
    const loginRes = await third.wechat.bind({
 | 
						|
      platform: 'miniProgram',
 | 
						|
      payload: encodeURIComponent(
 | 
						|
        JSON.stringify({
 | 
						|
          sessionId: uni.getStorageSync('sessionId'),
 | 
						|
        }),
 | 
						|
      ),
 | 
						|
    });
 | 
						|
 | 
						|
    if (loginRes.error === -1) {
 | 
						|
      getSessionId();
 | 
						|
    } else if (loginRes.error === 0) {
 | 
						|
      resolve(true);
 | 
						|
    } else {
 | 
						|
      reject(false);
 | 
						|
    }
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
// 微信小程序解除绑定
 | 
						|
const unbind = async () => {
 | 
						|
  const { error } = await third.wechat.unbind({
 | 
						|
    platform: 'miniProgram',
 | 
						|
  });
 | 
						|
  return !error;
 | 
						|
};
 | 
						|
 | 
						|
// 获取最新sessionId
 | 
						|
const getSessionId = async () => {
 | 
						|
  // 获取code
 | 
						|
  let code = '';
 | 
						|
  const loginResult = await uni.login();
 | 
						|
  if (loginResult.errMsg === 'login:ok') {
 | 
						|
    code = loginResult.code;
 | 
						|
  } else {
 | 
						|
    getSessionId();
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
 | 
						|
  const { error, data } = await third.wechat.getSessionId({
 | 
						|
    platform: 'miniProgram',
 | 
						|
    payload: encodeURIComponent(
 | 
						|
      JSON.stringify({
 | 
						|
        code,
 | 
						|
        auto_login: !!($store('app').platform.auto_login && !$store('user').isLogin),
 | 
						|
      }),
 | 
						|
    ),
 | 
						|
  });
 | 
						|
  if (error === 0) {
 | 
						|
    uni.setStorageSync('sessionId', data.session_id);
 | 
						|
    return true;
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
};
 | 
						|
 | 
						|
// 检查sessionId是否可用
 | 
						|
const checkSession = () => {
 | 
						|
  return new Promise((resolve, reject) => {
 | 
						|
    if (!sessionId) {
 | 
						|
      return resolve(false);
 | 
						|
    }
 | 
						|
    uni.checkSession({
 | 
						|
      success() {
 | 
						|
        return resolve(true);
 | 
						|
      },
 | 
						|
      fail() {
 | 
						|
        uni.removeStorageSync('sessionId');
 | 
						|
        return resolve(false);
 | 
						|
      },
 | 
						|
    });
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
// 小程序更新
 | 
						|
const checkUpdate = async (silence = true) => {
 | 
						|
  if (uni.canIUse('getUpdateManager')) {
 | 
						|
    const updateManager = uni.getUpdateManager();
 | 
						|
    updateManager.onCheckForUpdate(function (res) {
 | 
						|
      // 请求完新版本信息的回调
 | 
						|
      if (res.hasUpdate) {
 | 
						|
        updateManager.onUpdateReady(function () {
 | 
						|
          uni.showModal({
 | 
						|
            title: '更新提示',
 | 
						|
            content: '新版本已经准备好,是否重启应用?',
 | 
						|
            success: function (res) {
 | 
						|
              if (res.confirm) {
 | 
						|
                // 新的版本已经下载好,调用 applyUpdate 应用新版本并重启
 | 
						|
                updateManager.applyUpdate();
 | 
						|
              }
 | 
						|
            },
 | 
						|
          });
 | 
						|
        });
 | 
						|
        updateManager.onUpdateFailed(function () {
 | 
						|
          // 新的版本下载失败
 | 
						|
          // uni.showModal({
 | 
						|
          //   title: '已经有新版本了哟~',
 | 
						|
          //   content: '新版本已经上线啦,请您删除当前小程序,重新搜索打开~',
 | 
						|
          // });
 | 
						|
        });
 | 
						|
      } else {
 | 
						|
        if (!silence) {
 | 
						|
          uni.showModal({
 | 
						|
            title: '当前为最新版本',
 | 
						|
            showCancel: false,
 | 
						|
          });
 | 
						|
        }
 | 
						|
      }
 | 
						|
    });
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
// 绑定用户手机号
 | 
						|
const bindUserPhoneNumber = (e) => {
 | 
						|
  return new Promise(async (resolve, reject) => {
 | 
						|
    const { error } = await third.wechat.bindUserPhoneNumber({
 | 
						|
      platform: 'miniProgram',
 | 
						|
      payload: encodeURIComponent(
 | 
						|
        JSON.stringify({
 | 
						|
          code: e.code,
 | 
						|
          iv: e.iv,
 | 
						|
          encryptedData: e.encryptedData,
 | 
						|
        }),
 | 
						|
      ),
 | 
						|
    });
 | 
						|
    if (error === 0) {
 | 
						|
      resolve(true);
 | 
						|
    }
 | 
						|
    resolve(false);
 | 
						|
  });
 | 
						|
};
 | 
						|
 | 
						|
// 获取订阅消息模板
 | 
						|
async function getSubscribeTemplate() {
 | 
						|
  const { error, data } = await third.wechat.subscribeTemplate();
 | 
						|
  if (error === 0) {
 | 
						|
    subscribeEventList = data;
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
// 订阅消息
 | 
						|
function subscribeMessage(event) {
 | 
						|
  let tmplIds = [];
 | 
						|
  if (typeof event === 'string') {
 | 
						|
    tmplIds.push(subscribeEventList[event]);
 | 
						|
  }
 | 
						|
  if (typeof event === 'object') {
 | 
						|
    event.forEach((item) => {
 | 
						|
      if (typeof subscribeEventList[item] !== 'undefined') tmplIds.push(subscribeEventList[item]);
 | 
						|
    });
 | 
						|
  }
 | 
						|
  if (tmplIds.length === 0) return;
 | 
						|
 | 
						|
  uni.requestSubscribeMessage({
 | 
						|
    tmplIds,
 | 
						|
    fail: (err) => {
 | 
						|
      console.log(err);
 | 
						|
    },
 | 
						|
  });
 | 
						|
}
 | 
						|
 | 
						|
export default {
 | 
						|
  load,
 | 
						|
  login,
 | 
						|
  bind,
 | 
						|
  unbind,
 | 
						|
  checkUpdate,
 | 
						|
  bindUserPhoneNumber,
 | 
						|
  subscribeMessage,
 | 
						|
};
 |