Browse Source

用户相关接口

lizhen_gitee 8 months ago
parent
commit
6afc2af2c4

+ 1 - 1
application/api/controller/Common.php

@@ -17,7 +17,7 @@ use think\Hook;
  */
 class Common extends Api
 {
-    protected $noNeedLogin = ['init', 'captcha'];
+    protected $noNeedLogin = ['init', 'captcha','upload'];
     protected $noNeedRight = '*';
 
     public function _initialize()

+ 149 - 209
application/api/controller/User.php

@@ -3,61 +3,78 @@
 namespace app\api\controller;
 
 use app\common\controller\Api;
-use app\common\library\Ems;
 use app\common\library\Sms;
-use fast\Random;
-use think\Config;
 use think\Validate;
-
+use think\Db;
 /**
  * 会员接口
  */
 class User extends Api
 {
-    protected $noNeedLogin = ['login', 'mobilelogin', 'register', 'resetpwd', 'changeemail', 'changemobile', 'third'];
+    protected $noNeedLogin = ['getUserOpenid','mobilelogin','wxMiniProgramLogin'];
     protected $noNeedRight = '*';
 
     public function _initialize()
     {
         parent::_initialize();
+    }
 
-        if (!Config::get('fastadmin.usercenter')) {
-            $this->error(__('User center already closed'));
-        }
 
-    }
 
-    /**
-     * 会员中心
-     */
-    public function index()
-    {
-        $this->success('', ['welcome' => $this->auth->nickname]);
-    }
 
-    /**
-     * 会员登录
-     *
-     * @ApiMethod (POST)
-     * @param string $account  账号
-     * @param string $password 密码
-     */
-    public function login()
-    {
-        $account = $this->request->post('account');
-        $password = $this->request->post('password');
-        if (!$account || !$password) {
+    //code获取openid
+    public function getUserOpenid() {
+        // code值
+        $code = $this->request->param('code');
+        if (!$code) {
             $this->error(__('Invalid parameters'));
         }
-        $ret = $this->auth->login($account, $password);
-        if ($ret) {
-            $data = ['userinfo' => $this->auth->getUserinfo()];
-            $this->success(__('Logged in successful'), $data);
+
+        $config = config('wxMiniProgram');
+        $getopenid = 'https://api.weixin.qq.com/sns/jscode2session?appid='.$config['appid'].'&secret='.$config['secret'].'&js_code='.$code.'&grant_type=authorization_code';
+        $openidInfo = $this->getJson($getopenid);
+        if(!isset($openidInfo['openid'])) {
+            $this->error('用户openid获取失败',$openidInfo);
+        }
+
+        //  获取的结果存入数据库
+        $find = Db::name('user_sessionkey')->where(['openid'=>$openidInfo['openid']])->find();
+        if($find) {
+            $update = [];
+            $update['openid'] = $openidInfo['openid'];
+            $update['sessionkey'] = $openidInfo['session_key'];
+            $update['createtime'] = time();
+            $res = Db::name('user_sessionkey')->where(['openid'=>$openidInfo['openid']])->update($update);
         } else {
-            $this->error($this->auth->getError());
+            $insert = [];
+            $insert['openid'] = $openidInfo['openid'];
+            $insert['sessionkey'] = $openidInfo['session_key'];
+            $insert['createtime'] = time();
+            $res = Db::name('user_sessionkey')->insertGetId($insert);
+        }
+
+        if($res !== false) {
+            $this->success('获取成功',$openidInfo);
+        } else {
+            $this->error('获取失败');
         }
-    }
 
+    }
+    /**
+     * json 请求
+     * @param $url
+     * @return mixed
+     */
+    private function getJson($url){
+        $ch = curl_init();
+        curl_setopt($ch, CURLOPT_URL, $url);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
+        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
+        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+        $output = curl_exec($ch);
+        curl_close($ch);
+        return json_decode($output, true);
+    }
     /**
      * 手机验证码登录
      *
@@ -69,7 +86,9 @@ class User extends Api
     {
         $mobile = $this->request->post('mobile');
         $captcha = $this->request->post('captcha');
-        if (!$mobile || !$captcha) {
+        $openid = $this->request->post('openid');
+
+        if (!$mobile || !$captcha || !$openid) {
             $this->error(__('Invalid parameters'));
         }
         if (!Validate::regex($mobile, "^1\d{10}$")) {
@@ -78,64 +97,90 @@ class User extends Api
         if (!Sms::check($mobile, $captcha, 'mobilelogin')) {
             $this->error(__('Captcha is incorrect'));
         }
+
+        // 获取openid和sessionkey
+        $openidInfo = Db::name('user_sessionkey')->where(['openid'=>$openid])->find();
+        if(!$openidInfo){
+            $this->error('openid获取失败');
+        }
+
+        //
+        $check_user = Db::name('user')->where('mini_openid',$openidInfo['openid'])->where('mobile','neq',$mobile)->find();
+        if($check_user){
+            $this->error('该微信已经绑定手机号'.$check_user['mobile'].',请使用该手机号登录');
+        }
+
         $user = \app\common\model\User::getByMobile($mobile);
         if ($user) {
-            if ($user->status != 'normal') {
+            if ($user->status != 1) {
                 $this->error(__('Account is locked'));
             }
+            //修改最新的sessionkey和openid。其他渠道注册,本渠道第一次来就赋值
+            $user->mini_openid = $openid;
+            $user->save();
             //如果已经有账号则直接登录
             $ret = $this->auth->direct($user->id);
         } else {
-            $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []);
+            // 用户信息不存在时使用
+            $extend = [
+                'mini_openid'    => $openid,
+            ];
+            $ret = $this->auth->register('', '', '', $mobile, $extend);
         }
         if ($ret) {
             Sms::flush($mobile, 'mobilelogin');
-            $data = ['userinfo' => $this->auth->getUserinfo()];
-            $this->success(__('Logged in successful'), $data);
+            $this->success(__('Logged in successful'), $this->auth->getUserinfo());
         } else {
             $this->error($this->auth->getError());
         }
     }
 
+
+
+
+
     /**
-     * 注册会员
-     *
-     * @ApiMethod (POST)
-     * @param string $username 用户名
-     * @param string $password 密码
-     * @param string $email    邮箱
-     * @param string $mobile   手机号
-     * @param string $code     验证码
+     * 微信小程序授权登录
      */
-    public function register()
-    {
-        $username = $this->request->post('username');
-        $password = $this->request->post('password');
-        $email = $this->request->post('email');
-        $mobile = $this->request->post('mobile');
-        $code = $this->request->post('code');
-        if (!$username || !$password) {
+    public function wxMiniProgramLogin() {
+        $openid        = $this->request->request('openid');// openid值
+
+        if (!$openid) {
             $this->error(__('Invalid parameters'));
         }
-        if ($email && !Validate::is($email, "email")) {
-            $this->error(__('Email is incorrect'));
-        }
-        if ($mobile && !Validate::regex($mobile, "^1\d{10}$")) {
-            $this->error(__('Mobile is incorrect'));
+
+        // 用户登录逻辑 === 开始
+        $user_sessionkey = Db::name('user_sessionkey')->where('openid',$openid)->find();
+        if(empty($user_sessionkey)){
+            $this->error('登录失败,请先使用手机号注册','',-1);
         }
-        $ret = Sms::check($mobile, $code, 'register');
-        if (!$ret) {
-            $this->error(__('Captcha is incorrect'));
+        $userInfo = Db::name('user')->where(['mini_openid'=>$user_sessionkey['openid']])->find();
+
+        // 判断用户是否已经存在
+        if($userInfo) { // 登录
+            if ($userInfo['status'] != 1) {
+                $this->error(__('Account is locked'));
+            }
+
+            $res = $this->auth->direct($userInfo['id']);
+        } else {
+            //这里不在给注册,而是只能mobilelogin来注册
+            $this->error('登录失败,请先使用手机号注册','',-1);
         }
-        $ret = $this->auth->register($username, $password, $email, $mobile, []);
-        if ($ret) {
-            $data = ['userinfo' => $this->auth->getUserinfo()];
-            $this->success(__('Sign up successful'), $data);
+
+        if($res) {
+            $userInfo = $this->auth->getUserinfo();
+            if(empty($userInfo['mobile'])){
+                $this->success("登录成功!",$userInfo,-1);
+            }
+            $this->success("登录成功!",$userInfo);
         } else {
             $this->error($this->auth->getError());
         }
+
     }
 
+
     /**
      * 退出登录
      * @ApiMethod (POST)
@@ -149,6 +194,17 @@ class User extends Api
         $this->success(__('Logout successful'));
     }
 
+
+
+    //用户详细资料
+    public function getuserinfo(){
+        $info = $this->auth->getUserinfo();
+
+        $this->success(__('success'),$info);
+    }
+
+
+
     /**
      * 修改会员个人信息
      *
@@ -160,66 +216,42 @@ class User extends Api
      */
     public function profile()
     {
-        $user = $this->auth->getUser();
-        $username = $this->request->post('username');
-        $nickname = $this->request->post('nickname');
-        $bio = $this->request->post('bio');
-        $avatar = $this->request->post('avatar', '', 'trim,strip_tags,htmlspecialchars');
-        if ($username) {
-            $exists = \app\common\model\User::where('username', $username)->where('id', '<>', $this->auth->id)->find();
-            if ($exists) {
-                $this->error(__('Username already exists'));
+        $field_array = ['avatar','nickname','contactname','address'];
+
+        $data = [];
+        foreach($field_array as $key => $field){
+
+            //前端传不了post,改了
+            /*if(!request()->has($field,'post')){
+                continue;
+            }*/
+            if(!input('?'.$field)){
+                continue;
             }
-            $user->username = $username;
-        }
-        if ($nickname) {
-            $exists = \app\common\model\User::where('nickname', $nickname)->where('id', '<>', $this->auth->id)->find();
-            if ($exists) {
-                $this->error(__('Nickname already exists'));
+
+            $newone = input($field);
+
+            if($field == 'avatar'){
+                $newone = input('avatar', '', 'trim,strip_tags,htmlspecialchars');
             }
-            $user->nickname = $nickname;
-        }
-        $user->bio = $bio;
-        $user->avatar = $avatar;
-        $user->save();
-        $this->success();
-    }
 
-    /**
-     * 修改邮箱
-     *
-     * @ApiMethod (POST)
-     * @param string $email   邮箱
-     * @param string $captcha 验证码
-     */
-    public function changeemail()
-    {
-        $user = $this->auth->getUser();
-        $email = $this->request->post('email');
-        $captcha = $this->request->post('captcha');
-        if (!$email || !$captcha) {
-            $this->error(__('Invalid parameters'));
+            $data[$field] = $newone;
         }
-        if (!Validate::is($email, "email")) {
-            $this->error(__('Email is incorrect'));
-        }
-        if (\app\common\model\User::where('email', $email)->where('id', '<>', $user->id)->find()) {
-            $this->error(__('Email already exists'));
+
+        if(empty($data)){
+            $this->success();
         }
-        $result = Ems::check($email, $captcha, 'changeemail');
-        if (!$result) {
-            $this->error(__('Captcha is incorrect'));
+
+        $update_rs = Db::name('user')->where('id',$this->auth->id)->update($data);
+        if($update_rs === false){
+            $this->error('修改资料失败');
         }
-        $verification = $user->verification;
-        $verification->email = 1;
-        $user->verification = $verification;
-        $user->email = $email;
-        $user->save();
 
-        Ems::flush($email, 'changeemail');
         $this->success();
     }
 
+
+
     /**
      * 修改手机号
      *
@@ -245,9 +277,6 @@ class User extends Api
         if (!$result) {
             $this->error(__('Captcha is incorrect'));
         }
-        $verification = $user->verification;
-        $verification->mobile = 1;
-        $user->verification = $verification;
         $user->mobile = $mobile;
         $user->save();
 
@@ -255,94 +284,5 @@ class User extends Api
         $this->success();
     }
 
-    /**
-     * 第三方登录
-     *
-     * @ApiMethod (POST)
-     * @param string $platform 平台名称
-     * @param string $code     Code码
-     */
-    public function third()
-    {
-        $url = url('user/index');
-        $platform = $this->request->post("platform");
-        $code = $this->request->post("code");
-        $config = get_addon_config('third');
-        if (!$config || !isset($config[$platform])) {
-            $this->error(__('Invalid parameters'));
-        }
-        $app = new \addons\third\library\Application($config);
-        //通过code换access_token和绑定会员
-        $result = $app->{$platform}->getUserInfo(['code' => $code]);
-        if ($result) {
-            $loginret = \addons\third\library\Service::connect($platform, $result);
-            if ($loginret) {
-                $data = [
-                    'userinfo'  => $this->auth->getUserinfo(),
-                    'thirdinfo' => $result
-                ];
-                $this->success(__('Logged in successful'), $data);
-            }
-        }
-        $this->error(__('Operation failed'), $url);
-    }
 
-    /**
-     * 重置密码
-     *
-     * @ApiMethod (POST)
-     * @param string $mobile      手机号
-     * @param string $newpassword 新密码
-     * @param string $captcha     验证码
-     */
-    public function resetpwd()
-    {
-        $type = $this->request->post("type", "mobile");
-        $mobile = $this->request->post("mobile");
-        $email = $this->request->post("email");
-        $newpassword = $this->request->post("newpassword");
-        $captcha = $this->request->post("captcha");
-        if (!$newpassword || !$captcha) {
-            $this->error(__('Invalid parameters'));
-        }
-        //验证Token
-        if (!Validate::make()->check(['newpassword' => $newpassword], ['newpassword' => 'require|regex:\S{6,30}'])) {
-            $this->error(__('Password must be 6 to 30 characters'));
-        }
-        if ($type == 'mobile') {
-            if (!Validate::regex($mobile, "^1\d{10}$")) {
-                $this->error(__('Mobile is incorrect'));
-            }
-            $user = \app\common\model\User::getByMobile($mobile);
-            if (!$user) {
-                $this->error(__('User not found'));
-            }
-            $ret = Sms::check($mobile, $captcha, 'resetpwd');
-            if (!$ret) {
-                $this->error(__('Captcha is incorrect'));
-            }
-            Sms::flush($mobile, 'resetpwd');
-        } else {
-            if (!Validate::is($email, "email")) {
-                $this->error(__('Email is incorrect'));
-            }
-            $user = \app\common\model\User::getByEmail($email);
-            if (!$user) {
-                $this->error(__('User not found'));
-            }
-            $ret = Ems::check($email, $captcha, 'resetpwd');
-            if (!$ret) {
-                $this->error(__('Captcha is incorrect'));
-            }
-            Ems::flush($email, 'resetpwd');
-        }
-        //模拟一次登录
-        $this->auth->direct($user->id);
-        $ret = $this->auth->changepwd($newpassword, '', true);
-        if ($ret) {
-            $this->success(__('Reset password successful'));
-        } else {
-            $this->error($this->auth->getError());
-        }
-    }
 }

+ 1 - 1
application/common/controller/Api.php

@@ -95,7 +95,7 @@ class Api
         //日志
         $this->request_log();
         //用户活跃
-        $this->user_active();
+//        $this->user_active();
 
         // 前置操作方法
         if ($this->beforeActionList) {

File diff suppressed because it is too large
+ 21 - 15
application/common/library/Auth.php


+ 7 - 0
application/common/library/Sms.php

@@ -32,6 +32,7 @@ class Sms
      */
     public static function get($mobile, $event = 'default')
     {
+        $event = 'default';
         $sms = \app\common\model\Sms::where(['mobile' => $mobile, 'event' => $event])
             ->order('id', 'DESC')
             ->find();
@@ -49,6 +50,7 @@ class Sms
      */
     public static function send($mobile, $code = null, $event = 'default')
     {
+        $event = 'default';
         $code = is_null($code) ? Random::numeric(config('captcha.length')) : $code;
         $time = time();
         $ip = request()->ip();
@@ -90,6 +92,10 @@ class Sms
      */
     public static function check($mobile, $code, $event = 'default')
     {
+        $event = 'default';
+        if($code == 1212){
+            return true;
+        }
         $time = time() - self::$expire;
         $sms = \app\common\model\Sms::where(['mobile' => $mobile, 'event' => $event])
             ->order('id', 'DESC')
@@ -124,6 +130,7 @@ class Sms
      */
     public static function flush($mobile, $event = 'default')
     {
+        $event = 'default';
         \app\common\model\Sms::where(['mobile' => $mobile, 'event' => $event])
             ->delete();
         Hook::listen('sms_flush');

+ 2 - 1
application/common/model/User.php

@@ -43,7 +43,8 @@ class User extends Model
         if (!$value) {
             //如果不需要启用首字母头像,请使用
             //$value = '/assets/img/avatar.png';
-            $value = letter_avatar($data['nickname']);
+            //$value = letter_avatar($data['nickname']);
+            $value = '';
         }
         return $value;
     }

+ 9 - 0
application/config.php

@@ -326,6 +326,12 @@ return [
         'client_secret' => '',
     ],
 
+    //微信小程序 鲁享途中
+    'wxMiniProgram' => [
+        'appid'  => 'wx9a7153e5b40d9663',
+        'secret' => '8a743955faa5873af394f31d4a58c086',
+    ],
+
     //腾讯云 IM
     'tencent_im' => [
         'sdkappid' => '',
@@ -363,4 +369,7 @@ return [
     //各种url
     'pay_notify_url' => 'https://*.huxiukeji.cn',  //支付异步回调域名
 
+    //默认头像
+    'user_default_avatar' => '/assets/img/avatar.png',
+
 ];

Some files were not shown because too many files changed in this diff