| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356 |
- import { redirect, isWeixinBrowser, urlDeconstruction, currRoute } from '@/utils/common'
- import {
- weappLogin,
- updateWeappOpenid,
- updateWechatOpenid,
- wechatUser,
- wechatUserLogin,
- updateWechatOpenidByH5
-
- } from '@/app/api/auth'
- import { getWechatAuthCode } from '@/app/api/system'
- import useMemberStore from '@/stores/member'
- import useConfigStore from '@/stores/config'
- import useSystemStore from '@/stores/system'
- export function useLogin() {
- /**
- * 设置登录返回页
- */
- const setLoginBack = (data: redirectOptions) => {
- uni.setStorage({ key: 'loginBack', data })
- setTimeout(() => {
- const config = useConfigStore()
- const systemStore = useSystemStore()
- // // #ifdef MP-WEIXIN
- // if (!uni.getStorageSync('autoLoginLock') && config.login.is_bind_mobile) {
- // uni.setStorageSync('isBindMobile', true) // 强制绑定手机号标识
- // }
- // // #endif
- // // #ifdef H5
- // if (!uni.getStorageSync('autoLoginLock') && isWeixinBrowser() && config.login.is_bind_mobile) {
- // uni.setStorageSync('isBindMobile', true) // 强制绑定手机号标识
- // }
- // // #endif
- // 如果只开启了账号密码登录,就不需要跳转到登录中间页了,直接进入普通账号密码登录页面
- // #ifdef MP-WEIXIN
- if (config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
- redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
- } else if (systemStore.initStatus == 'finish' && !config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
- uni.showToast({ title: '商家未开启登录注册', icon: 'none' })
- } else {
- redirect({ url: '/app/pages/auth/index' })
- }
- // #endif
- // #ifdef H5
- if (isWeixinBrowser()) {
- // 微信浏览器
- if (config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
- redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
- } else if (systemStore.initStatus == 'finish' && !config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
- uni.showToast({ title: '商家未开启登录注册', icon: 'none' })
- } else {
- redirect({ url: '/app/pages/auth/index' })
- }
- } else {
- console.log('??????')
- // 普通浏览器
- redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
- }
- // #endif
- })
- }
- /**
- * 执行登录后跳转
- */
- const handleLoginBack = () => {
- uni.removeStorageSync('autoLoginLock')
- uni.getStorage({
- key: 'loginBack',
- success: (res: any) => {
- res ? redirect(
- {
- ...res.data,
- mode: 'redirectTo'
- }
- ) : redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
- },
- fail: (res) => {
- redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
- }
- })
- }
- /**
- * 授权登录
- * @param params { code, backFlag, successCallback }
- */
- const authLogin = (params: any) => {
- let obj: any = {
- code: params.code,
- nickname: params.nickname,
- headimg: params.headimg,
- mobile: params.mobile,
- mobile_code: params.mobile_code
- };
- uni.getStorageSync('pid') && (Object.assign(obj, { pid: uni.getStorageSync('pid') }))
- // #ifdef MP-WEIXIN
- weappLogin(obj).then((res: any) => {
- if (res.data.token) {
- useMemberStore().setToken(res.data.token, () => {
- const config = useConfigStore()
- const memberInfo: any = useMemberStore().info
- // 老用户不控制强制绑定手机号
- if (uni.getStorageSync('wap_member_not_control_mobile')) {
- uni.removeStorageSync('wap_member_not_control_mobile');
- }
- if (memberInfo) {
- memberInfo.weapp_openid && uni.setStorageSync('openid', memberInfo.weapp_openid)
- if (memberInfo.mobile) {
- uni.setStorageSync('wap_member_mobile', memberInfo.mobile) // 存储会员手机号,防止重复请求微信获取手机号接口
- } else {
- uni.setStorageSync('wap_member_not_control_mobile', true) // 老用户不控制强制绑定手机号
- }
- }
- // todo 已注册的会员不受影响
- // 开启绑定手机号标识
- if (uni.getStorageSync('isBindMobile')) {
- uni.removeStorageSync('isBindMobile');
- }
- //
- // if (config.login.is_bind_mobile && memberInfo && !memberInfo.mobile) {
- // uni.setStorageSync('isBindMobile', true)
- // }
- if (params.successCallback) params.successCallback(res.data)
- if (params.backFlag) handleLoginBack() // 一键登录返回
- })
- } else {
- // 强制获取昵称和头像,先存储起来
- uni.setStorageSync('openid', res.data.openid)
- uni.setStorageSync('unionid', res.data.unionid)
- }
- }).catch((err) => {
- uni.showToast({ title: err.msg, icon: 'none' })
- if (params.successCallback) params.successCallback()
- })
- // #endif
- // #ifdef H5
- wechatUser(obj).then((user_res: any) => {
- if (user_res.data) {
- wechatUserLogin(user_res.data).then((res: any) => {
- const config = useConfigStore()
- if (res.data.token) {
- uni.removeStorageSync('member_lock')
- useMemberStore().setToken(res.data.token, () => {
- const memberInfo = useMemberStore().info
- memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
- // todo 已注册的会员不受影响
- // 开启绑定手机号标识
- if (uni.getStorageSync('isBindMobile')) {
- uni.removeStorageSync('isBindMobile');
- }
- // if (config.login.is_bind_mobile && memberInfo && !memberInfo.mobile) {
- // uni.setStorageSync('isBindMobile', true)
- // }
- // 老用户不控制强制绑定手机号
- if (uni.getStorageSync('wap_member_not_control_mobile')) {
- uni.removeStorageSync('wap_member_not_control_mobile');
- }
- if (memberInfo) {
- if (memberInfo.mobile) {
- uni.setStorageSync('wap_member_mobile', memberInfo.mobile) // 存储会员手机号,防止重复请求微信获取手机号接口
- } else {
- uni.setStorageSync('wap_member_not_control_mobile', true) // 老用户不控制强制绑定手机号
- }
- }
- let loginBack = uni.getStorageSync('loginBack');
- if (loginBack && loginBack.url && currRoute() == 'app/pages/auth/index') {
- handleLoginBack(); // 跳转到上一个页面
- }
- })
- } else {
- // 强制获取昵称和头像,先存储起来
- uni.setStorageSync('openid', res.data.openid)
- uni.setStorageSync('unionid', res.data.unionid)
- if(res.data.nickname){
- uni.setStorageSync('nickname', res.data.nickname)
- }
- if(res.data.avatar){
- uni.setStorageSync('avatar', res.data.avatar)
- }
- // 开启绑定手机号标识
- if (uni.getStorageSync('isBindMobile')) {
- uni.removeStorageSync('isBindMobile');
- }
- if (config.login.is_bind_mobile) {
- uni.setStorageSync('isBindMobile', true)
- }
- }
- }).catch((err) => {
- uni.setStorageSync('member_lock', true)
- })
- }
- }).catch((err) => {
- if (err.code == -1) {
- getAuthCode({ scopes: 'snsapi_userinfo' })
- } else {
- uni.showToast({ title: err.msg, icon: 'none' })
- }
- })
- // #endif
-
- }
-
- /**
- * 登录普通账号后修改openid
- * @param code
- * @param callback
- */
- const updateOpenid = (code: string | null, callback: any = null) => {
- let obj: any = {
- code
- };
- // #ifdef MP-WEIXIN
- updateWeappOpenid(obj).then((res) => {
- useMemberStore().getMemberInfo(() => {
- const memberInfo = useMemberStore().info
- memberInfo && memberInfo.weapp_openid && uni.setStorageSync('openid', memberInfo.weapp_openid)
- })
- })
- // #endif
- // #ifdef H5
- updateWechatOpenid(obj).then((res) => {
- useMemberStore().getMemberInfo(() => {
- const memberInfo = useMemberStore().info
- memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
- if (callback) callback();
- })
- })
- // #endif
- }
- /**
- * 获取授权码
- * @param params { scopes, updateFlag, backFlag, successCallback }
- */
- const getAuthCode = (params: any = {}) => {
- params.scopes = params.scopes || 'snsapi_base'; // 公众号用
- // 微信小程序用
- params.updateFlag = params.updateFlag || false; // updateFlag:更新openid
- params.backFlag = params.backFlag || false; // backFlag 控制一键登录返回
- params.successCallback = params.successCallback || null;
- params.nickname = params.nickname || '';
- params.headimg = params.headimg || '';
- params.mobile = params.mobile || '';
- params.mobile_code = params.mobile_code || '';
- // #ifdef MP-WEIXIN
- wx.login({
- success(res: any) {
- if (res.code) {
- params.updateFlag ? updateOpenid(res.code) : authLogin({
- code: res.code,
- nickname: params.nickname,
- headimg: params.headimg,
- mobile: params.mobile,
- mobile_code: params.mobile_code,
- backFlag: params.backFlag,
- successCallback: params.successCallback
- })
- } else {
- console.log('登录失败!' + res.errMsg)
- }
- }
- })
- // #endif
- // #ifdef H5
- let url = `${ location.origin }${ location.pathname }`
- // 如果当前在登录中间页,那么要跳转到首页
- if (url.indexOf('app/pages/auth/index') != -1) {
- let loginBack = uni.getStorageSync('loginBack');
- if (loginBack) {
- url = url.replace('app/pages/auth/index', loginBack.url.substr(1))
- if (loginBack.param) {
- if (url.indexOf('?') != -1) {
- for (let key in loginBack.param) {
- url += `&${ key }=${ loginBack.param[key] }`;
- }
- } else {
- let count = 0;
- for (let key in loginBack.param) {
- if (count == 0) {
- url += `?${ key }=${ loginBack.param[key] }`;
- } else {
- url += `&${ key }=${ loginBack.param[key] }`;
- }
- count++;
- }
- }
- }
- } else {
- url = url.replace('app/pages/auth/index', 'app/pages/index/index')
- }
- } else {
- let query: any = urlDeconstruction(location.href).query
- query.code && (delete query.code)
- Object.keys(query).length && (url += uni.$u.queryParams(query))
- }
- // // 强制授权加强制绑定手机号定义URL
- // if(uni.getStorageSync('mandatory_Mobile')){
- // url = `${ location.origin }${ location.pathname }`
- // }
- getWechatAuthCode({
- url,
- scopes: params.scopes
- }).then((res: any) => {
- uni.setStorageSync('wechat_login_back', true) // 微信公众号手动授权登录回调标识
- // uni.setStorageSync('mandatory_Mobile', true) // 微信授权登录+强制绑定手机号标识
- // location.replace(res.data.url);
- location.href = res.data.url
- })
- // #endif
- }
- const updateWechatOpenidForH5 = (wx_openid: any) => {
- if(!wx_openid) return;
- updateWechatOpenidByH5({ wx_openid }).then(res => {
- const memberInfo = useMemberStore().info
- memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
- })
- }
- return {
- setLoginBack,
- handleLoginBack,
- authLogin,
- updateOpenid,
- getAuthCode,
- updateWechatOpenidForH5
- }
- }
|