wesmiler 1 year ago
parent
commit
085e85bad0

+ 71 - 0
.env-back

@@ -0,0 +1,71 @@
+APP_NAME=dysapp
+APP_ENV=local
+LOCAL_LANG=zh-cn
+APP_KEY=base64:5c43a8wcR8LOQtT3fxxtJ/Y4Hf4y4KdLsGF5Gi6v7SY=
+APP_DEBUG=true
+SAVE_SQL_LOG=true
+APP_URL=http://test.com
+WEB_URL=http://dys.mp.dongerkj.com/
+LOG_CHANNEL=stack
+APP_SIGN_KEY=dysapp
+
+DB_CONNECTION=mysql
+DB_HOST=47.112.222.163
+DB_PORT=3306
+DB_PREFIX=lev_
+DB_DATABASE=nn2023060101
+DB_USERNAME=NN2023060101
+DB_PASSWORD=GFeffxf84fiXrBHM
+
+
+FILESYSTEM_DRIVER=public # 文件系统
+
+BROADCAST_DRIVER=log
+QUEUE_DRIVER=redis
+QUEUE_CONNECTION=redis
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+
+#REDIS_PREFIX=null
+#REDIS_HOST=127.0.0.1
+#REDIS_PASSWORD=''
+#REDIS_PORT=16379
+#REDIS_DB=1
+
+CACHE_DRIVER=redis
+REDIS_PREFIX=null
+REDIS_HOST=47.112.222.163
+REDIS_PASSWORD=derkj&6688
+REDIS_PORT=6379
+REDIS_DB=0
+
+#socket
+SOCKET_PORT=8650
+
+# 微信
+WEIXIN_APP_ID=wx36817bd4d67c9043
+WEIXIN_SECRET=432b9b616f7d8bbacb7e3d64f563ac3e
+WEIXIN_REDIRECT_URL
+
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.163.com
+MAIL_PORT=25
+MAIL_USERNAME=
+MAIL_FROM_ADDRESS=
+MAIL_PASSWORD=
+MAIL_ENCRYPTION=tls
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
+
+MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
+MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
+
+SITE_NAME = UTC
+NICK_NAME = UTC
+VERSION = v1.2.0
+
+IMG_URL = http://dys.mp.dongerkj.com/uploads

+ 1 - 1
app/Http/Controllers/Api/v1/LoginController.php

@@ -52,7 +52,7 @@ class LoginController extends webApp
         }
 
         if(!$result = WechatService::make()->auth($params)){
-            return message(MemberService::make()->getError(), false);
+            return message(WechatService::make()->getError(), false);
         }
 
         return message(2004, true, $result);

+ 84 - 0
app/Services/Api/MemberService.php

@@ -234,6 +234,7 @@ class MemberService extends BaseService
         }
 
         if(!$userId){
+            $appSources = isset($params['app_sources'])? $params['app_sources'] : '';
             $id = $this->model->max('id')+1;
             $data = [
                 'parent_id'=> $parentId,
@@ -245,6 +246,7 @@ class MemberService extends BaseService
                 'code'=> strtoupper(get_random_code(8,'D', "{$id}")),
                 'mobile' => $mobile,
                 'parents' => $parents,
+                'device' => $appSources=='android'? 2 : 1,
                 'status' => 1,
                 'balance' => 0,
                 'score' => 0,
@@ -272,4 +274,86 @@ class MemberService extends BaseService
         RedisService::set("auths:info:{$userId}", $data, 3*24*3600);
         return $result;
     }
+
+    /**
+     * 微信注册登录
+     * @param $params
+     * @return array|false
+     */
+    public function loginByWechat($params)
+    {
+        // 授权
+        $mobile = isset($params['mobile'])? $params['mobile'] : '';
+        $nickname = isset($params['nickname'])? $params['nickname'] : '';
+        $openid = isset($params['openid'])? $params['openid'] : '';
+        $avatar = isset($params['headimgurl'])? $params['headimgurl'] : '';
+        $inviteCode = isset($params['invite_code'])? $params['invite_code'] : '';
+        if(empty($params) || empty($openid)){
+            $this->error = 2014;
+            return false;
+        }
+
+        // 推荐人
+        $parentId = 0;
+        $parents = '';
+        if($inviteCode){
+            $inviteInfo = $this->model->where(['code'=> $inviteCode,'mark'=> 1])
+                ->select(['id','parents','parent_id'])
+                ->first();
+            $parentId = isset($inviteInfo['id'])? $inviteInfo['id'] : 0;
+            $parents = isset($inviteInfo['parents'])? $inviteInfo['parents'].$parentId.',' : ($parentId?$parentId.',':'');
+        }
+
+        // 验证是否注册,没有则注册
+        $data = $this->model->where(['openid'=> $openid,'mark'=>1])->select(['id','openid','username','parent_id','code','status'])->first();
+        $data = $data? $data->toArray() : [];
+        $userId = isset($data['id'])? $data['id'] : 0;
+        $status = isset($data['status'])? $data['status'] : 0;
+        if($userId && $status != 1){
+            $this->error = 2015;
+            return false;
+        }
+
+        if(!$userId){
+            $id = $this->model->max('id')+1;
+            $data = [
+                'parent_id'=> $parentId,
+                'openid'=> $openid,
+                'avatar'=> $avatar,
+                'nickname' => $nickname? $nickname : get_random_code(6,'用户u'),
+                'username' => get_username($id),
+                'password' => get_password('123456'),
+                'code'=> strtoupper(get_random_code(8,'D', "{$id}")),
+                'mobile' => $mobile,
+                'device' => isset($params['device'])? $params['device'] : 0,
+                'parents' => $parents,
+                'status' => 1,
+                'balance' => 0,
+                'score' => 0,
+                'mark' => 1,
+                'login_time' => time(),
+                'login_ip' => get_client_ip(),
+                'create_time' => time(),
+            ];
+
+            $userId = $this->model->insertGetId($data);
+        }
+
+        // 获取登录授权token
+        $jwt = new Jwt('jwt_dys_app');
+        $token = $jwt->getToken($userId);
+
+        // 结果返回
+        $result = [
+            'access_token' => $token,
+            'info'=> ['uid'=> $userId,'openid'=>$data['openid'],'username'=> $data['username']],
+        ];
+
+        // 用户信息
+        unset($data['password']);
+        RedisService::set("auths:info:{$userId}", $data, 3*24*3600);
+        return $result;
+    }
+
+
 }

+ 60 - 14
app/Services/WechatService.php

@@ -11,6 +11,7 @@
 
 namespace App\Services;
 
+use App\Services\Api\MemberService;
 use Dotenv\Dotenv;
 use Laravel\Socialite\Facades\Socialite;
 use SocialiteProviders\WeixinWeb\Provider;
@@ -30,9 +31,20 @@ class WechatService extends BaseService
 
     public function __construct()
     {
+        $wxAppid = ConfigService::make()->getConfigByCode('wechat_appid');
+        $wxAppSecret = ConfigService::make()->getConfigByCode('wechat_appsecret');
+        // 配置更新
+        if($wxAppid != env('WEIXIN_APP_ID') || $wxAppSecret != env('WEIXIN_SECRET')){
+            $env = Dotenv::createArrayBacked(base_path())->load();
+            $env['WEIXIN_APP_ID'] = $wxAppid;
+            $env['WEIXIN_SECRET'] = $wxAppSecret;
+            $envStr = '';
+            foreach($env as $k => $v){
+                $envStr .= $k.'='.$v."\n";
+            }
 
-        $env = Dotenv::createArrayBacked(base_path())->load();
-
+            file_put_contents(base_path().'.env', $envStr);
+        }
     }
 
     /**
@@ -49,26 +61,60 @@ class WechatService extends BaseService
     }
 
     /**
-     * 授权登录
+     * 微信授权登录
      * @param array $params
      * @return mixed
      */
     public function auth($params=[])
     {
+        $openid = isset($response['openid'])? $response['openid'] : '';
+        $referrer = isset($response['referrer'])? $response['referrer'] : '';
+        $accessToken = isset($response['access_token'])? $response['access_token'] : '';
+        if(empty($openid) || empty($accessToken)){
+            $this->error = '2016';
+            return false;
+        }
+
+        // 获取微信用户信息
+        $wechatInfo = $this->getUserInfo($openid, $accessToken);
+        RedisService::set("caches:wechat:{$openid}:temp", ['params'=> $params,'user'=>$wechatInfo], 7200);
+
+        // 注册
+        $appSources = isset($params['app_sources'])? $params['app_sources'] : '';
+        $wechatInfo['openid'] = $openid;
+        $wechatInfo['device'] = $appSources=='android'? 2 : 1;
+        $wechatInfo['invite_code'] = $referrer;
+        if(!$result = MemberService::make()->loginByWechat($wechatInfo)){
+            $this->error = MemberService::make()->getError();
+            return false;
+        }else{
+            return $result;
+        }
+    }
 
+    /**
+     * 微信用户信息
+     * @param $openid
+     * @param $accessToken
+     * @param false $refresh 是否强制刷新
+     * @return array|mixed
+     */
+    public function getUserInfo($openid, $accessToken, $refresh = false)
+    {
+        // 获取授权信息
+        $cacheKey = "caches:wechat:{$openid}:info_".md5($accessToken);
+        $data = RedisService::get($cacheKey);
+        $info = isset($data['info'])? $data['info'] : [];
+        if($info && !$refresh){
+            return $info;
+        }
 
-        $config = config('services.weixin');
-        var_dump($config);
-//        $driver = Socialite::buildProvider(\SocialiteProviders\Weixin\Provider::IDENTIFIER, $config);
         $driver = Socialite::with('weixin');
-        $response = $params;
-//        $response = $driver->getAccessTokenResponse($code);
-        var_dump($response);
-        $openid = isset($response['openid'])? $response['openid'] : '';
-        $accessToken = isset($response['access_token'])? $response['access_token'] : '';
         $driver->setOpenId($openid);
-        $oauthUser = $driver->userFromToken($accessToken);
-        RedisService::set("caches:weixin:{$openid}", ['params'=> $params,'res'=> $response,'user'=>$oauthUser], 7200);
-        return $oauthUser;
+        $wechatInfo = $driver->userFromToken($accessToken);
+        if($wechatInfo){
+            RedisService::set($cacheKey, ['openid'=> $openid,'access_token'=> $accessToken, 'info'=>$wechatInfo], rand(3600,7200));
+        }
+        return $wechatInfo;
     }
 }

+ 1 - 0
resources/lang/zh-cn/api.php

@@ -30,6 +30,7 @@ return [
     '2013'=> '短信验证码错误',
     '2014'=> '缺少参数',
     '2015'=> '账号已被冻结,请联系客服',
+    '2016'=> '微信授权失败',
 
     // 语言设置
     '2101'=> '语言参数错误',