useLogin.ts 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356
  1. import { redirect, isWeixinBrowser, urlDeconstruction, currRoute } from '@/utils/common'
  2. import {
  3. weappLogin,
  4. updateWeappOpenid,
  5. updateWechatOpenid,
  6. wechatUser,
  7. wechatUserLogin,
  8. updateWechatOpenidByH5
  9. } from '@/app/api/auth'
  10. import { getWechatAuthCode } from '@/app/api/system'
  11. import useMemberStore from '@/stores/member'
  12. import useConfigStore from '@/stores/config'
  13. import useSystemStore from '@/stores/system'
  14. export function useLogin() {
  15. /**
  16. * 设置登录返回页
  17. */
  18. const setLoginBack = (data: redirectOptions) => {
  19. uni.setStorage({ key: 'loginBack', data })
  20. setTimeout(() => {
  21. const config = useConfigStore()
  22. const systemStore = useSystemStore()
  23. // // #ifdef MP-WEIXIN
  24. // if (!uni.getStorageSync('autoLoginLock') && config.login.is_bind_mobile) {
  25. // uni.setStorageSync('isBindMobile', true) // 强制绑定手机号标识
  26. // }
  27. // // #endif
  28. // // #ifdef H5
  29. // if (!uni.getStorageSync('autoLoginLock') && isWeixinBrowser() && config.login.is_bind_mobile) {
  30. // uni.setStorageSync('isBindMobile', true) // 强制绑定手机号标识
  31. // }
  32. // // #endif
  33. // 如果只开启了账号密码登录,就不需要跳转到登录中间页了,直接进入普通账号密码登录页面
  34. // #ifdef MP-WEIXIN
  35. if (config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
  36. redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
  37. } else if (systemStore.initStatus == 'finish' && !config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
  38. uni.showToast({ title: '商家未开启登录注册', icon: 'none' })
  39. } else {
  40. redirect({ url: '/app/pages/auth/index' })
  41. }
  42. // #endif
  43. // #ifdef H5
  44. if (isWeixinBrowser()) {
  45. // 微信浏览器
  46. if (config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
  47. redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
  48. } else if (systemStore.initStatus == 'finish' && !config.login.is_username && !config.login.is_mobile && !config.login.is_auth_register) {
  49. uni.showToast({ title: '商家未开启登录注册', icon: 'none' })
  50. } else {
  51. redirect({ url: '/app/pages/auth/index' })
  52. }
  53. } else {
  54. console.log('??????')
  55. // 普通浏览器
  56. redirect({ url: '/app/pages/auth/login', param: { type: 'username' } })
  57. }
  58. // #endif
  59. })
  60. }
  61. /**
  62. * 执行登录后跳转
  63. */
  64. const handleLoginBack = () => {
  65. uni.removeStorageSync('autoLoginLock')
  66. uni.getStorage({
  67. key: 'loginBack',
  68. success: (res: any) => {
  69. res ? redirect(
  70. {
  71. ...res.data,
  72. mode: 'redirectTo'
  73. }
  74. ) : redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
  75. },
  76. fail: (res) => {
  77. redirect({ url: '/app/pages/index/index', mode: 'switchTab' })
  78. }
  79. })
  80. }
  81. /**
  82. * 授权登录
  83. * @param params { code, backFlag, successCallback }
  84. */
  85. const authLogin = (params: any) => {
  86. let obj: any = {
  87. code: params.code,
  88. nickname: params.nickname,
  89. headimg: params.headimg,
  90. mobile: params.mobile,
  91. mobile_code: params.mobile_code
  92. };
  93. uni.getStorageSync('pid') && (Object.assign(obj, { pid: uni.getStorageSync('pid') }))
  94. // #ifdef MP-WEIXIN
  95. weappLogin(obj).then((res: any) => {
  96. if (res.data.token) {
  97. useMemberStore().setToken(res.data.token, () => {
  98. const config = useConfigStore()
  99. const memberInfo: any = useMemberStore().info
  100. // 老用户不控制强制绑定手机号
  101. if (uni.getStorageSync('wap_member_not_control_mobile')) {
  102. uni.removeStorageSync('wap_member_not_control_mobile');
  103. }
  104. if (memberInfo) {
  105. memberInfo.weapp_openid && uni.setStorageSync('openid', memberInfo.weapp_openid)
  106. if (memberInfo.mobile) {
  107. uni.setStorageSync('wap_member_mobile', memberInfo.mobile) // 存储会员手机号,防止重复请求微信获取手机号接口
  108. } else {
  109. uni.setStorageSync('wap_member_not_control_mobile', true) // 老用户不控制强制绑定手机号
  110. }
  111. }
  112. // todo 已注册的会员不受影响
  113. // 开启绑定手机号标识
  114. if (uni.getStorageSync('isBindMobile')) {
  115. uni.removeStorageSync('isBindMobile');
  116. }
  117. //
  118. // if (config.login.is_bind_mobile && memberInfo && !memberInfo.mobile) {
  119. // uni.setStorageSync('isBindMobile', true)
  120. // }
  121. if (params.successCallback) params.successCallback(res.data)
  122. if (params.backFlag) handleLoginBack() // 一键登录返回
  123. })
  124. } else {
  125. // 强制获取昵称和头像,先存储起来
  126. uni.setStorageSync('openid', res.data.openid)
  127. uni.setStorageSync('unionid', res.data.unionid)
  128. }
  129. }).catch((err) => {
  130. uni.showToast({ title: err.msg, icon: 'none' })
  131. if (params.successCallback) params.successCallback()
  132. })
  133. // #endif
  134. // #ifdef H5
  135. wechatUser(obj).then((user_res: any) => {
  136. if (user_res.data) {
  137. wechatUserLogin(user_res.data).then((res: any) => {
  138. const config = useConfigStore()
  139. if (res.data.token) {
  140. uni.removeStorageSync('member_lock')
  141. useMemberStore().setToken(res.data.token, () => {
  142. const memberInfo = useMemberStore().info
  143. memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
  144. // todo 已注册的会员不受影响
  145. // 开启绑定手机号标识
  146. if (uni.getStorageSync('isBindMobile')) {
  147. uni.removeStorageSync('isBindMobile');
  148. }
  149. // if (config.login.is_bind_mobile && memberInfo && !memberInfo.mobile) {
  150. // uni.setStorageSync('isBindMobile', true)
  151. // }
  152. // 老用户不控制强制绑定手机号
  153. if (uni.getStorageSync('wap_member_not_control_mobile')) {
  154. uni.removeStorageSync('wap_member_not_control_mobile');
  155. }
  156. if (memberInfo) {
  157. if (memberInfo.mobile) {
  158. uni.setStorageSync('wap_member_mobile', memberInfo.mobile) // 存储会员手机号,防止重复请求微信获取手机号接口
  159. } else {
  160. uni.setStorageSync('wap_member_not_control_mobile', true) // 老用户不控制强制绑定手机号
  161. }
  162. }
  163. let loginBack = uni.getStorageSync('loginBack');
  164. if (loginBack && loginBack.url && currRoute() == 'app/pages/auth/index') {
  165. handleLoginBack(); // 跳转到上一个页面
  166. }
  167. })
  168. } else {
  169. // 强制获取昵称和头像,先存储起来
  170. uni.setStorageSync('openid', res.data.openid)
  171. uni.setStorageSync('unionid', res.data.unionid)
  172. if(res.data.nickname){
  173. uni.setStorageSync('nickname', res.data.nickname)
  174. }
  175. if(res.data.avatar){
  176. uni.setStorageSync('avatar', res.data.avatar)
  177. }
  178. // 开启绑定手机号标识
  179. if (uni.getStorageSync('isBindMobile')) {
  180. uni.removeStorageSync('isBindMobile');
  181. }
  182. if (config.login.is_bind_mobile) {
  183. uni.setStorageSync('isBindMobile', true)
  184. }
  185. }
  186. }).catch((err) => {
  187. uni.setStorageSync('member_lock', true)
  188. })
  189. }
  190. }).catch((err) => {
  191. if (err.code == -1) {
  192. getAuthCode({ scopes: 'snsapi_userinfo' })
  193. } else {
  194. uni.showToast({ title: err.msg, icon: 'none' })
  195. }
  196. })
  197. // #endif
  198. }
  199. /**
  200. * 登录普通账号后修改openid
  201. * @param code
  202. * @param callback
  203. */
  204. const updateOpenid = (code: string | null, callback: any = null) => {
  205. let obj: any = {
  206. code
  207. };
  208. // #ifdef MP-WEIXIN
  209. updateWeappOpenid(obj).then((res) => {
  210. useMemberStore().getMemberInfo(() => {
  211. const memberInfo = useMemberStore().info
  212. memberInfo && memberInfo.weapp_openid && uni.setStorageSync('openid', memberInfo.weapp_openid)
  213. })
  214. })
  215. // #endif
  216. // #ifdef H5
  217. updateWechatOpenid(obj).then((res) => {
  218. useMemberStore().getMemberInfo(() => {
  219. const memberInfo = useMemberStore().info
  220. memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
  221. if (callback) callback();
  222. })
  223. })
  224. // #endif
  225. }
  226. /**
  227. * 获取授权码
  228. * @param params { scopes, updateFlag, backFlag, successCallback }
  229. */
  230. const getAuthCode = (params: any = {}) => {
  231. params.scopes = params.scopes || 'snsapi_base'; // 公众号用
  232. // 微信小程序用
  233. params.updateFlag = params.updateFlag || false; // updateFlag:更新openid
  234. params.backFlag = params.backFlag || false; // backFlag 控制一键登录返回
  235. params.successCallback = params.successCallback || null;
  236. params.nickname = params.nickname || '';
  237. params.headimg = params.headimg || '';
  238. params.mobile = params.mobile || '';
  239. params.mobile_code = params.mobile_code || '';
  240. // #ifdef MP-WEIXIN
  241. wx.login({
  242. success(res: any) {
  243. if (res.code) {
  244. params.updateFlag ? updateOpenid(res.code) : authLogin({
  245. code: res.code,
  246. nickname: params.nickname,
  247. headimg: params.headimg,
  248. mobile: params.mobile,
  249. mobile_code: params.mobile_code,
  250. backFlag: params.backFlag,
  251. successCallback: params.successCallback
  252. })
  253. } else {
  254. console.log('登录失败!' + res.errMsg)
  255. }
  256. }
  257. })
  258. // #endif
  259. // #ifdef H5
  260. let url = `${ location.origin }${ location.pathname }`
  261. // 如果当前在登录中间页,那么要跳转到首页
  262. if (url.indexOf('app/pages/auth/index') != -1) {
  263. let loginBack = uni.getStorageSync('loginBack');
  264. if (loginBack) {
  265. url = url.replace('app/pages/auth/index', loginBack.url.substr(1))
  266. if (loginBack.param) {
  267. if (url.indexOf('?') != -1) {
  268. for (let key in loginBack.param) {
  269. url += `&${ key }=${ loginBack.param[key] }`;
  270. }
  271. } else {
  272. let count = 0;
  273. for (let key in loginBack.param) {
  274. if (count == 0) {
  275. url += `?${ key }=${ loginBack.param[key] }`;
  276. } else {
  277. url += `&${ key }=${ loginBack.param[key] }`;
  278. }
  279. count++;
  280. }
  281. }
  282. }
  283. } else {
  284. url = url.replace('app/pages/auth/index', 'app/pages/index/index')
  285. }
  286. } else {
  287. let query: any = urlDeconstruction(location.href).query
  288. query.code && (delete query.code)
  289. Object.keys(query).length && (url += uni.$u.queryParams(query))
  290. }
  291. // // 强制授权加强制绑定手机号定义URL
  292. // if(uni.getStorageSync('mandatory_Mobile')){
  293. // url = `${ location.origin }${ location.pathname }`
  294. // }
  295. getWechatAuthCode({
  296. url,
  297. scopes: params.scopes
  298. }).then((res: any) => {
  299. uni.setStorageSync('wechat_login_back', true) // 微信公众号手动授权登录回调标识
  300. // uni.setStorageSync('mandatory_Mobile', true) // 微信授权登录+强制绑定手机号标识
  301. // location.replace(res.data.url);
  302. location.href = res.data.url
  303. })
  304. // #endif
  305. }
  306. const updateWechatOpenidForH5 = (wx_openid: any) => {
  307. if(!wx_openid) return;
  308. updateWechatOpenidByH5({ wx_openid }).then(res => {
  309. const memberInfo = useMemberStore().info
  310. memberInfo && memberInfo.wx_openid && uni.setStorageSync('openid', memberInfo.wx_openid)
  311. })
  312. }
  313. return {
  314. setLoginBack,
  315. handleLoginBack,
  316. authLogin,
  317. updateOpenid,
  318. getAuthCode,
  319. updateWechatOpenidForH5
  320. }
  321. }