Browse Source

fixed:用户端-微信登录-社交账号关联

刘学玺 4 months ago
parent
commit
feae970b3e
1 changed files with 34 additions and 27 deletions
  1. 34 27
      app/Services/Client/AccountService.php

+ 34 - 27
app/Services/Client/AccountService.php

@@ -34,7 +34,7 @@ class AccountService
      * 业务逻辑:
      * 1. 生成6位随机数字验证码
      * 2. 将验证码保存到缓存中,有效期5分钟
-     * 3. 调用短信服发送验证码
+     * 3. 调用短信服���发送验证码
      * 4. 返回发送成功消息和验证码
      *
      * @param  string  $mobile  手机号
@@ -117,8 +117,8 @@ class AccountService
     {
         // 使用事务确保数据一致性
         return DB::transaction(function () use ($openid, $userInfo) {
-            // 查找或创建微信社交账号记录
-            $socialAccount = $this->findOrCreateSocialAccount($openid);
+            // 查找或创建微信社交账号记录,传入用户信息
+            $socialAccount = $this->findOrCreateSocialAccount($openid, $userInfo);
 
             // 获取关联的用户,如果没有则创建新用户
             $user = $socialAccount->user ?? $this->createUserFromWechat($userInfo);
@@ -148,7 +148,7 @@ class AccountService
     /**
      * 用户退出
      * 业务逻辑:
-     * 1. 根据��户ID查找用户
+     * 1. 根据户ID查找用户
      * 2. 验证用户是否存在,不存在则中断请求
      * 3. 删除用户所有token
      * 4. 返回退出成功消息
@@ -196,7 +196,7 @@ class AccountService
         // 删除用户的所有认证令牌
         $this->revokeTokens($user);
 
-        // 返回销成功的消息
+        // 返回���销成功的消息
         return ['message' => '账号已注销'];
     }
 
@@ -243,7 +243,7 @@ class AccountService
     /**
      * 发送验证码短信
      *
-     * 逻辑���述:
+     * 逻辑述:
      * 1. 调用短信服务发送验证码
      *
      * @param  string  $mobile  手机号
@@ -320,29 +320,36 @@ class AccountService
     /**
      * 查找或创建社交账号
      *
-     * 逻辑描述:
-     * 1. 先查找是否存在社交账号
-     * 2. 不存在则创建新记录
+     * 业务流程:
+     * 1. 根据openid查找已存在的社交账号记录
+     * 2. 如果存在则直接返回
+     * 3. 如果不存在,使用社交信息创建新记录
      *
-     * @param  string  $openid  微信openid
+     * @param string $openid 微信openid
+     * @param array $userInfo 微信用户信息(昵称、头像等)
+     * @return MemberSocialAccount
      */
-    private function findOrCreateSocialAccount(string $openid): MemberSocialAccount
+    private function findOrCreateSocialAccount(string $openid, array $userInfo = []): MemberSocialAccount
     {
-        // 先查找是否存在社交账号
-        $socialAccount = MemberSocialAccount::where([
-            'platform' => 'WECHAT',
-            'social_id' => $openid,
-        ])->first();
-
-        // 如果不存在,则创建新记录
-        if (!$socialAccount) {
-            $socialAccount = MemberSocialAccount::create([
-                'platform' => 'WECHAT',
-                'social_id' => $openid,
-            ]);
+        // 根据openid查找已存在的社交账号
+        $socialAccount = MemberSocialAccount::where('social_id', $openid)
+            ->where('platform', 'WECHAT')
+            ->first();
+
+        // 如果已存在则直接返回
+        if ($socialAccount) {
+            return $socialAccount;
         }
 
-        return $socialAccount;
+        // 创建新的社交账号记录,包含用户信息
+        return MemberSocialAccount::create([
+            'platform' => 'WECHAT',
+            'social_id' => $openid,
+            'nickname' => $userInfo['nickname'] ?? '',
+            'avatar' => $userInfo['avatar'] ?? '',  // 微信返回的头像字段名
+            'gender' => $userInfo['gender'] ?? 0,          // 微信返回的性别字段名
+            'status' => 1,                              // 默认状态为有效
+        ]);
     }
 
     /**
@@ -430,7 +437,7 @@ class AccountService
      * 1. 获取当前认证用户
      * 2. 用户未登录则抛出异常
      *
-     * @throws BusinessException 户未登录时抛出异常
+     * @throws BusinessException ���户未登录时抛出异常
      */
     private function getCurrentUser(): MemberUser
     {
@@ -511,7 +518,7 @@ class AccountService
      * 2. 验证邀请码格式是否正确
      * 3. 分解邀请码获取类型和ID
      * 4. 根据类型查找邀请人
-     * 5. 邀请人不存在则记录日���并返回
+     * 5. 邀请人不存在则记录日并返回
      * 6. 检查用户是否已在营销团队中
      * 7. 使用事务创建团队关系
      *
@@ -620,7 +627,7 @@ class AccountService
             $user->mobile = $mobile;
             $user->save();
 
-            // 返回成功消息和更新后用户信息
+            // 返回成功消息和更新后��用户信息
             return [
                 'message' => '手机号绑定成功',
                 'user' => $user->fresh(),