Просмотр исходного кода

APP/小程序-调整微信授权登录逻辑

sunxbiao 1 год назад
Родитель
Сommit
2347dc5e12

+ 105 - 43
app/common/repositories/user/UserRepository.php

@@ -3237,59 +3237,121 @@ class UserRepository extends BaseRepository
3237 3237
 
3238 3238
     }
3239 3239
 
3240
-    /*微信登录验证
3241
-     $openid 微信openid
3242
-    */
3243
-    public  function  wechatCheck($openid, $nickname = null, $headimgurl = null){
3244
-        $user = Db::name("user")->where(['wechat_user_id'=>$openid])->find();
3245
-        //判断是否是第一次登录
3246
-        if($user){
3247
-            //成功登录业务逻辑
3248
-            if (!$user['account']) {
3240
+    /**
3241
+     * 微信登录验证
3242
+     * @param $openid
3243
+     * @param $nickname
3244
+     * @param $headimgurl
3245
+     * @return array
3246
+     * @throws DataNotFoundException
3247
+     * @throws DbException
3248
+     * @throws ModelNotFoundException
3249
+     */
3250
+    public function wechatCheck($openid, $nickname = null, $headimgurl = null): array
3251
+    {
3252
+        // 1、判断 该openID 是否绑定多个用户
3253
+        $userDataList = Db::name("user")->where(['wechat_user_id' => $openid])->select()->toArray();
3254
+        $normalUserDataList = [];
3255
+        $normalUserData = [];
3256
+        if (!empty($userDataList)) {
3257
+            $resetWechatUserIdList = [];
3258
+            foreach ($userDataList as $userdata) {
3259
+                if ($userdata['is_del'] == 1) {
3260
+                    $resetWechatUserIdList[] = $userdata['uid'];
3261
+                } else {
3262
+                    $normalUserDataList[] = $userdata;
3263
+                }
3264
+            }
3265
+            if (!empty($resetWechatUserIdList)) {
3266
+                Db::name("user")->whereIn('uid', $resetWechatUserIdList)->update(["wechat_user_id" => 0]);
3267
+                Db::name("user_extract_openid")->whereIn('uid', $resetWechatUserIdList)->delete();
3268
+                Db::name("user_account")->whereIn('uid', $resetWechatUserIdList)->delete();
3269
+            }
3270
+            if (count($normalUserDataList) > 1) {
3271
+                return ['code' => 400, 'msg' => '当前账号异常,请联系客服!'];
3272
+            } else if (count($normalUserDataList) < 1) {
3249 3273
                 return ['code' => 400, 'msg' => '请绑定手机号'];
3250 3274
             } else {
3251
-                $existUid = Db::name('user_extract_openid')->where('openid', $openid)->value('uid');
3252
-                if (!empty($existUid) && $existUid != $user['uid']) {
3253
-                    $existUserData = Db::name("user")->where("uid", $existUid)->find();
3254
-                    if ($existUserData['is_del'] != 1) {
3255
-                        return ['code' => 400, 'msg' => '此微信号已被绑定'];
3275
+                $normalUserData = array_shift($normalUserDataList);
3276
+            }
3277
+        } else {
3278
+            return ['code' => 400, 'msg' => '请绑定手机号'];
3279
+        }
3280
+
3281
+        // 2、更新 user_extract_openid
3282
+        $existOpenIdDataList = Db::name('user_extract_openid')->where('openid', $openid)->select()->toArray();
3283
+        $normalUserDataListByExtractOpenid = [];
3284
+        $normalUserDataByExtractOpenid = [];
3285
+        if (!empty($existOpenIdDataList)) {
3286
+            $existUidList = array_column($existOpenIdDataList, 'uid');
3287
+            // 查询 用户
3288
+            $existUserData = Db::name("user")->whereIn("uid", $existUidList)->select()->toArray();
3289
+            if (!empty($existUserData)) {
3290
+                $resetWechatUserIdList = [];
3291
+                $deleteUserExtractOpenidByUidList = [];
3292
+                foreach ($existUserData as $userdata) {
3293
+                    if ($userdata['is_del'] == 1) {
3294
+                        $resetWechatUserIdList[] = $userdata['uid'];
3256 3295
                     } else {
3257
-                        Db::name('user_extract_openid')->where('openid',$openid)->delete();
3258
-                        Db::name("user")->where(['uid' => $existUid])->update(["wechat_user_id" => 0]);
3296
+                        // if ($userdata['wechat_user_id'] == $openid) {
3297
+                        $normalUserDataListByExtractOpenid[] = $userdata;
3298
+                        // } else {
3299
+                        //     $deleteUserExtractOpenidByUidList[] = $userdata['uid'];
3300
+                        // }
3259 3301
                     }
3260 3302
                 }
3261
-                $check = Db::name('user_extract_openid')->where('uid', $user['uid'])->value('openid');
3262
-                if (!empty($check)) {
3263
-                    if ($check != $openid) {
3264
-                        return ['code' => 400, 'msg' => '当前用户已绑定其他微信号'];
3265
-                    }
3266
-                } else {
3267
-                    Db::name("user_extract_openid")->insert([
3268
-                        'uid' => $user['uid'],
3269
-                        'openid' => $openid,
3270
-                        'type' => 1
3271
-                    ]);
3303
+                // 已删除的用户
3304
+                if (!empty($resetWechatUserIdList)) {
3305
+                    Db::name("user")->whereIn('uid', $resetWechatUserIdList)->update(["wechat_user_id" => 0]);
3306
+                    Db::name("user_extract_openid")->whereIn('uid', $resetWechatUserIdList)->delete();
3307
+                    Db::name("user_account")->whereIn('uid', $resetWechatUserIdList)->delete();
3272 3308
                 }
3273
-                $data2 = [];
3274
-                if (!is_null($nickname) || !is_null($headimgurl)) {
3275
-                    $data2 = [
3276
-                        "type" => 1,
3277
-                        "uid" => $user['uid'],
3278
-                        "nickname" => $nickname ?: '',
3279
-                        "avater" => $headimgurl ?: '',
3280
-                    ];
3309
+                // // 用户表绑定的 微信ID 和 微信授权表中的不一致
3310
+                // if (!empty($deleteUserExtractOpenidByUidList)) {
3311
+                //     Db::name("user_extract_openid")->whereIn('uid', $resetWechatUserIdList)->where('openid', $openid)->delete();
3312
+                // }
3313
+                if (count($normalUserDataListByExtractOpenid) > 1) {
3314
+                    return ['code' => 400, 'msg' => '当前账号异常,请联系客服!'];
3315
+                } else {
3316
+                    $normalUserDataByExtractOpenid = array_shift($normalUserDataListByExtractOpenid);
3281 3317
                 }
3282
-                $this->updateUser(
3283
-                    $user['uid'],
3284
-                    ['wechat_user_id' => $openid],
3285
-                    $data2
3286
-                );
3318
+            } else {
3319
+                Db::name('user_extract_openid')->where('openid', $openid)->delete();
3320
+            }
3321
+        }
3287 3322
 
3288
-                return ['code' => 200, 'msg' => '登陆成功', 'user' => $user];
3323
+        if (empty($normalUserDataByExtractOpenid)) {
3324
+            if (!empty($normalUserData)) {
3325
+                Db::name("user_extract_openid")->insert([
3326
+                    'uid' => $normalUserData['uid'],
3327
+                    'openid' => $openid,
3328
+                    'type' => 1
3329
+                ]);
3330
+            } else {
3331
+                return ['code' => 400, 'msg' => '请绑定手机号'];
3332
+            }
3333
+        } else {
3334
+            if ($normalUserDataByExtractOpenid['uid'] != $normalUserData['uid']) {
3335
+                return ['code' => 400, 'msg' => '当前账号异常,请联系客服!'];
3289 3336
             }
3290
-        }else{
3291
-            return ['code' => 400, 'msg' => '请绑定手机号'];
3292 3337
         }
3338
+
3339
+        $data2 = [];
3340
+        if (!is_null($nickname) || !is_null($headimgurl)) {
3341
+            $data2 = [
3342
+                "type" => 1,
3343
+                "uid" => $normalUserData['uid'],
3344
+                "nickname" => $nickname ?: '',
3345
+                "avater" => $headimgurl ?: '',
3346
+            ];
3347
+        }
3348
+        $this->updateUser(
3349
+            $normalUserData['uid'],
3350
+            ['wechat_user_id' => $openid],
3351
+            $data2
3352
+        );
3353
+
3354
+        return ['code' => 200, 'msg' => '登录成功', 'user' => $normalUserData];
3293 3355
     }
3294 3356
 
3295 3357
     /**

+ 15 - 17
app/controller/api/Auth.php

@@ -1684,33 +1684,31 @@ class Auth extends BaseController
1684 1684
     }
1685 1685
 
1686 1686
 
1687
-    /*微信授权登录*/
1688
-    public function wechatCheck(){
1689
-        $data =  $this->request->params(['openid']);
1690
-        // , 'nickname', 'avatar'
1687
+    /**
1688
+     * 微信授权登录 一键登录
1689
+     * @return mixed
1690
+     * @throws DataNotFoundException
1691
+     * @throws DbException
1692
+     * @throws ModelNotFoundException
1693
+     */
1694
+    public function wechatCheck()
1695
+    {
1696
+        $data = $this->request->params(['openid']);
1691 1697
         $data['nickname'] = $this->request->param('nickname', null);
1692 1698
         $data['avatar'] = $this->request->param('avatar', null);
1693 1699
 
1694
-        if(!$data['openid'] || $data['openid'] == '' || $data['openid'] =='undefined'){
1700
+        if (!$data['openid'] || $data['openid'] == '' || $data['openid'] == 'undefined') {
1695 1701
             return app('json')->fail("openid参数缺失");
1696 1702
         }
1697 1703
 
1704
+        /** @var UserRepository $repository */
1698 1705
         $repository = app()->make(UserRepository::class);
1699
-        if($this->source=='yhc'){
1700
-            $result =  $repository ->wechatCheckYhc($data['openid']);
1701
-        }else{
1702
-            $result =  $repository ->wechatCheck($data['openid'], $data['nickname'], $data['avatar']);
1703
-        }
1704
-        if(isset($result['code']) && $result['code'] == 200){
1706
+        $result = $repository->wechatCheck($data['openid'], $data['nickname'], $data['avatar']);
1707
+
1708
+        if (isset($result['code']) && $result['code'] == 200) {
1705 1709
             $user = $repository->accountByUser($result['user']['account']);
1706 1710
             $tokenInfo = $repository->createToken($user);
1707 1711
             $repository->loginAfter($user);
1708
-            if($this->source=='yhc'){
1709
-//                $user=$user->toArray();
1710
-                $user->avatar=Db::name('enterprise_user')->where('mer_id',$this->merId)->where('uid',$user['uid'])->value('avatar');
1711
-            }
1712
-
1713
-
1714 1712
             return app('json')->success($repository->returnToken($user, $tokenInfo));
1715 1713
         }
1716 1714
         return app("json")->fail($result['msg']);

+ 25 - 8
app/controller/api/user/User.php

@@ -2670,16 +2670,33 @@ class User extends BaseController
2670 2670
             if ($type == 1) {
2671 2671
                 $data = ["wechat_user_id" => $openid];
2672 2672
                 $unionId = $openid;
2673
-                $existUid = Db::name('user_extract_openid')->where('openid',$unionId)->value('uid');
2674
-                if (!empty($existUid) && $existUid != $uid) {
2675
-                    $existUserData = Db::name("user")->where("uid", $existUid)->find();
2676
-                    if ($existUserData['is_del'] != 1) {
2677
-                        throw new \Exception("此微信号已被绑定");
2678
-                    } else {
2679
-                        Db::name('user_extract_openid')->where('openid',$unionId)->delete();
2680
-                        Db::name("user")->where(['uid' => $existUid])->update(["wechat_user_id" => 0]);
2673
+                $userDataList = Db::name("user")->where(['wechat_user_id' => $unionId])->select()->toArray();
2674
+                $normalUserDataList = [];
2675
+                $normalUserData = [];
2676
+                if (!empty($userDataList)) {
2677
+                    $resetWechatUserIdList = [];
2678
+                    foreach ($userDataList as $userdata) {
2679
+                        if ($userdata['is_del'] == 1) {
2680
+                            $resetWechatUserIdList[] = $userdata['uid'];
2681
+                        } else {
2682
+                            $normalUserDataList[] = $userdata;
2683
+                        }
2684
+                    }
2685
+                    if (!empty($resetWechatUserIdList)) {
2686
+                        Db::name("user")->whereIn('uid', $resetWechatUserIdList)->update(["wechat_user_id" => 0]);
2687
+                        Db::name("user_extract_openid")->whereIn('uid', $resetWechatUserIdList)->delete();
2688
+                        Db::name("user_account")->whereIn('uid', $resetWechatUserIdList)->delete();
2689
+                    }
2690
+                    if (count($normalUserDataList) > 1) {
2691
+                        throw new \Exception("当前微信号异常,请联系客服!");
2692
+                    } else if (count($normalUserDataList) == 1) {
2693
+                        $normalUserData = array_shift($normalUserDataList);
2694
+                        if ($normalUserData['uid'] != $uid) {
2695
+                            throw new \Exception("此微信号已被绑定");
2696
+                        }
2681 2697
                     }
2682 2698
                 }
2699
+
2683 2700
                 $check = Db::name('user_extract_openid')->where('uid',$uid)->value('openid');
2684 2701
                 if (!empty($check)){
2685 2702
                     if ($check != $unionId) throw new \Exception("当前用户已绑定其他微信号");