Browse Source

✨ 微信公众号:接入绑定逻辑

YunaiV 1 year ago
parent
commit
6077ea8b26
2 changed files with 22 additions and 53 deletions
  1. 12 16
      pages/index/login.vue
  2. 10 37
      sheep/platform/provider/wechat/officialAccount.js

+ 12 - 16
pages/index/login.vue

@@ -1,32 +1,29 @@
+<!-- 微信公众号的登录回调页 -->
 <template>
   <!-- 空登陆页 -->
-  <view></view>
+  <view />
 </template>
 
 <script setup>
-  import { isEmpty } from 'lodash';
   import sheep from '@/sheep';
-  import { onLoad, onShow } from '@dcloudio/uni-app';
+  import { onLoad } from '@dcloudio/uni-app';
 
   onLoad(async (options) => {
     // #ifdef H5
-    let event = '';
+    // 将 search 参数赋值到 options 中,方便下面解析
     new URLSearchParams(location.search).forEach((value, key) => {
       options[key] = value;
     });
-    if (options.code) {
-      event = 'login';
-      const { error } = await sheep.$platform.useProvider().login(options.code, options.state);
-      if (error === 0) {
-        sheep.$store('user').getInfo();
-      }
-    }
-    if (options.bind_code) {
-      event = 'bind';
-      const { error } = await sheep.$platform.useProvider().bind(options.bind_code);
+    const event = options.event;
+    const code = options.code;
+    const state = options.state;
+    if (event === 'login') { // 场景一:登录
+      const res = await sheep.$platform.useProvider().login(code, state);
+    } else if (event === 'bind') { // 场景二:绑定
+      sheep.$platform.useProvider().bind(code, state);
     }
 
-    // 检测H5登录回调
+    // 检测 H5 登录回调
     let returnUrl = uni.getStorageSync('returnUrl');
     if (returnUrl) {
       uni.removeStorage('returnUrl');
@@ -36,7 +33,6 @@
         url: '/',
       });
     }
-
     // #endif
   });
 </script>

+ 10 - 37
sheep/platform/provider/wechat/officialAccount.js

@@ -23,8 +23,9 @@ async function login(code = '', state = '') {
   // 情况二:有 code 时,使用 code 去自动登录
   } else {
     // 解密 code 发起登陆
-    const loginResult = await loginByCode(code, state);
+    const loginResult = await AuthUtil.socialLogin(socialType, code, state);
     if (loginResult.code === 0) {
+      // TODO 芋艿:shareLog
       setOpenid(loginResult.data.openid);
       return loginResult;
     }
@@ -33,8 +34,8 @@ async function login(code = '', state = '') {
 }
 
 // 微信公众号绑定
-async function bind(code = '') {
-  // 获取绑定地址
+async function bind(code = '', state = '') {
+  // 情况一:没有 code 时,去获取 code
   if (code === '') {
     const loginUrl = await getLoginUrl('bind');
     if (loginUrl) {
@@ -42,9 +43,10 @@ async function bind(code = '') {
       window.location = loginUrl;
     }
   } else {
-    // 解密code发起登陆
-    const loginResult = await bindByCode(code);
-    if (loginResult.error === 0) {
+    // 情况二:有 code 时,使用 code 去自动绑定
+    const loginResult = await SocialApi.socialBind(socialType, code, state);
+    if (loginResult.code === 0) {
+      setOpenid(loginResult.data);
       return loginResult;
     }
   }
@@ -59,7 +61,8 @@ const unbind = async (openid) => {
 
 // 获取公众号登陆地址
 async function getLoginUrl(event = 'login') {
-  const page = getRootUrl() + 'pages/index/login';
+  const page = getRootUrl() + 'pages/index/login'
+    + '?event=' + event; // event 目的,区分是 login 还是 bind
   const { code, data } = await AuthUtil.socialAuthRedirect(socialType, page);
   if (code !== 0) {
     return undefined;
@@ -67,36 +70,6 @@ async function getLoginUrl(event = 'login') {
   return data;
 }
 
-// 此处使用前端发送code在后端解密,防止用户在后端过长时间停留
-function loginByCode(code, state) {
-  if (true) {
-    return AuthUtil.socialLogin(socialType, code, state);
-  }
-  // TODO 芋艿:shareLog
-  return third.wechat.login({
-    platform: 'officialAccount',
-    shareInfo: uni.getStorageSync('shareLog') || {},
-    payload: encodeURIComponent(
-      JSON.stringify({
-        code,
-      }),
-    ),
-  });
-}
-
-// 此处使用前端发送code在后端解密,防止用户在后端过长时间停留
-function bindByCode(code) {
-  debugger
-  return third.wechat.bind({
-    platform: 'officialAccount',
-    payload: encodeURIComponent(
-      JSON.stringify({
-        code,
-      }),
-    ),
-  });
-}
-
 // 设置 openid 到本地存储,目前只有 pay 支付时会使用
 function setOpenid(openid) {
   uni.setStorageSync('openid', openid);