import AuthUtil from '@/sheep/api/member/auth'; import SocialApi from '@/sheep/api/member/social'; import UserApi from '@/sheep/api/member/user'; const socialType = 34; // 社交类型 - 微信小程序 let subscribeEventList = []; // 加载微信小程序 function load() { checkUpdate(); getSubscribeTemplate(); } // 微信小程序静默授权登陆 const login = async () => { return new Promise(async (resolve, reject) => { // 1. 获得微信 code const codeResult = await uni.login(); if (codeResult.errMsg !== 'login:ok') { return resolve(false); } // 2. 社交登录 const loginResult = await AuthUtil.socialLogin(socialType, codeResult.code, 'default'); if (loginResult.code === 0) { setOpenid(loginResult.data.openid); return resolve(true); } else { return resolve(false); } }); }; // 微信小程序手机号授权登陆 const mobileLogin = async (e) => { return new Promise(async (resolve, reject) => { if (e.errMsg !== 'getPhoneNumber:ok') { return resolve(false); } // 1. 获得微信 code const codeResult = await uni.login(); if (codeResult.errMsg !== 'login:ok') { return resolve(false); } // 2. 一键登录 const loginResult = await AuthUtil.weixinMiniAppLogin(e.code, codeResult.code, 'default'); if (loginResult.code === 0) { setOpenid(loginResult.data.openid); return resolve(true); } else { return resolve(false); } }); }; // 微信小程序绑定 const bind = () => { return new Promise(async (resolve, reject) => { // 1. 获得微信 code const codeResult = await uni.login(); if (codeResult.errMsg !== 'login:ok') { return resolve(false); } // 2. 绑定账号 const bindResult = await SocialApi.socialBind(socialType, codeResult.code, 'default'); if (bindResult.code === 0) { setOpenid(bindResult.data); return resolve(true); } else { return resolve(false); } }); }; // 微信小程序解除绑定 const unbind = async (openid) => { const { code } = await SocialApi.socialUnbind(socialType, openid); return code === 0; }; // 绑定用户手机号 const bindUserPhoneNumber = (e) => { return new Promise(async (resolve, reject) => { const { code } = await UserApi.updateUserMobileByWeixin(e.code); if (code === 0) { resolve(true); } resolve(false); }); }; // 设置 openid 到本地存储,目前只有 pay 支付时会使用 function setOpenid(openid) { uni.setStorageSync('openid', openid); } // 获得 openid async function getOpenid(force = false) { let openid = uni.getStorageSync('openid'); if (!openid && force) { const info = await getInfo(); if (info && info.openid) { openid = info.openid; setOpenid(openid); } } return openid; } // 获得社交信息 async function getInfo() { const { code, data } = await SocialApi.getSocialUser(socialType); if (code !== 0) { return undefined; } return data; } // ========== 非登录相关的逻辑 ========== // 小程序更新 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, }); } } }); } }; // 获取订阅消息模板 async function getSubscribeTemplate() { const { code, data } = await SocialApi.getSubscribeTemplateList(); if (code === 0) { subscribeEventList = data; } } // 订阅消息 function subscribeMessage(event, callback= undefined) { let tmplIds = []; if (typeof event === 'string') { const temp = subscribeEventList.find(item => item.title.includes(event)); if (temp) { tmplIds.push(temp.id); } } if (typeof event === 'object') { event.forEach((e) => { const temp = subscribeEventList.find(item => item.title.includes(e)); if (temp) { tmplIds.push(temp.id); } }); } if (tmplIds.length === 0) return; uni.requestSubscribeMessage({ tmplIds, success: ()=>{ // 不管是拒绝还是同意都触发 callback && callback() }, fail: (err) => { console.log(err); }, }); } export default { load, login, bind, unbind, bindUserPhoneNumber, mobileLogin, getInfo, getOpenid, subscribeMessage, checkUpdate, };