import config from '@/common/config.js' import { isWechat, objToUrlQuery } from '@/util/squ.js' import { getCurQuery, getCurQueryAll, routeWithParams, getStorageSync, toast } from '@/util/squni.js' import { post } from '@/util/request.js' import store from '@/store' export const LoginAlready = 'LoginAlready' export const LoginSuccess = 'LoginSuccess' export const LoginUnBind = 'LoginUnBind' export const LoginRedirect = 'LoginRedirect' export const LoginError = 'LoginError' // 开始登录 export const login = (force) => { return new Promise((resolve) => { if (!force && getStorageSync('token')) { console.debug('本地已存在token, 则认为已经登录') resolve(LoginAlready) return } // #ifdef H5 const accessToken = getCurQuery('accessToken') if (!force && accessToken) { console.debug('请求参数中包含accessToken, 则认为登录成功') store.commit('setToken', accessToken) resolve(LoginSuccess) } else if (config.appIdWxMp && isWechat()) { h5WxLogin().then((res) => { resolve(res) }) } else { h5Login().then((res) => { resolve(res) }) } // #endif // #ifdef MP-WEIXIN // 获取进入不同平台的登录方法 uni.getProvider({ service: 'oauth', success: function(res) { // 当前只做微信小程序 if (~res.provider.indexOf('weixin')) { uni.login({ provider: 'weixin', success: function(loginRes) { // 前端获取到微信登录临时码,传至后台换openId和sessionId let code = loginRes.code doLogin('WxMa', { code }).then((wxRes) => { resolve(wxRes) }) }, }) } }, }) // #endif }) } // 请求后台登录 export const doLogin = (loginType, params) => { return new Promise((resolve) => { let inviterUserId = getCurQuery('inviterUserId') console.debug(`请求登录. inviterUserId=${inviterUserId || ''}`) post(`/core/user/login?loginType=${loginType}`, Object.assign({}, { appid: config[`appId${loginType}`], inviterUserId: inviterUserId, autoRegister: 'true' }, params)).then((res) => { console.log(res); if (res.status === 'success') { // 调用成功,根据是否有token判断跳转的页面 let data = res.data store.commit('setOpenid', data.openid) if (data.tokenInfo) { // tokenInfo不为空,可直接进入首页 console.debug('登录成功. loginType=' + loginType) store.commit('setToken', data.tokenInfo.tokenValue) store.commit('setRefreshToken', data.refreshToken) resolve(LoginSuccess) } else { console.debug('登录失败. loginType=' + loginType + ", openid=" + data.openid) resolve(LoginUnBind) } } else { resolve({ status: LoginError, data: res}) } }) }) } // H5微信登录(公众号) export const h5WxLogin = () => { const code = getCurQuery('code') if (!code) { console.debug('微信公众号登录. 不包含code,需进行用户授权') // 授权获取openid const redirectUri = encodeURIComponent(window.location.href) const scope = 'snsapi_base' // snsapi_base snsapi_userinfo // 静默授权 用户无感知 const state = 'sqbiz' // 自定义参数,回调时会带上 const url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${config.appIdWxMp}&redirect_uri=${redirectUri}&response_type=code&scope=${scope}&state=${state}#wechat_redirect` window.location.href = url } else { console.debug('微信公众号登录. 包含code,执行登录') return doLogin('WxMp', { code }) } } // H5登录 export const h5Login = () => { routeWithParams(config.loginPath) return new Promise((resolve) => { resolve(LoginRedirect) }) }