error(__('User center already closed')); } } /** * 会员中心 */ public function index() { $user = $this->auth->getUser(); $data['code'] = $user['code'];//今日已做任务 $data['mobile'] = $user['mobile']; $data['balance'] = $user['balance']; $data['avatar'] = $user['avatar']; $data['bonus_sum'] = $user['bonus_sum']; $data['order_num'] = (new OrderModel()) ->where('user_id', $user['id']) ->where('status', OrderModel::STATUSFINISH) ->count(); $data['invite_link'] = Env::get('app.invite_domain') . '/?i=' . $user['invitation_code']; $data['invitation_code'] = $user['invitation_code']; $this->success('', $data); } /** * 会员登录 * * @ApiMethod (POST) * @param string $account 账号 * @param string $password 密码 */ public function login() { $code = $this->request->post('code'); $mobile = $this->request->post('mobile'); $pwd = $this->request->post('pwd'); if (!$code || !$mobile || !$pwd) { $this->error(__('Invalid parameters')); } $ret = $this->auth->login($code, $mobile, $pwd); if ($ret) { $data = ['userinfo' => $this->auth->getUserinfo()]; $this->success(__('Logged in successful'), $data); } else { $this->error($this->auth->getError()); } } /** * 重置密码 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $newpassword 新密码 * @param string $captcha 验证码 */ public function change_login_pwd() { $old_pwd = $this->request->post("old_pwd", '', null); $new_pwd = $this->request->post("new_pwd", '', null); $confirm_pwd = $this->request->post("confirm_pwd", '', null); $rule = [ 'old_pwd' => 'require|regex:\S{6,30}', 'new_pwd' => 'require|regex:\S{6,30}', 'confirm_pwd' => 'require|regex:\S{6,30}|confirm:new_pwd', ]; $msg = [ 'new_pwd.confirm' => __('Password and confirm password don\'t match') ]; $data = [ 'old_pwd' => $old_pwd, 'new_pwd' => $new_pwd, 'confirm_pwd' => $confirm_pwd, ]; $field = [ 'old_pwd' => __('旧密码'), 'new_pwd' => __('新密码'), 'confirm_pwd' => __('新密码') ]; $validate = new Validate($rule, $msg, $field); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError())); } $ret = $this->auth->changepwd($new_pwd, $old_pwd); if ($ret) { $this->success(__('Reset password successful')); } else { $this->error($this->auth->getError()); } } /** * 发送重置密码短信验证码 * @return void */ public function reset_fund_pwd_sms() { $login_pwd = $this->request->post("login_pwd", '', null); $user = $this->auth->getUser(); if ($user->login_pwd != $this->auth->getEncryptPassword($login_pwd, $user->salt)) { $this->error(__('Password is incorrect')); } (new \app\api\controller\Sms())->send_international_sms($user['code'], $user['mobile'], 'rest_fund_pwd'); } /** * 重置资金密码 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $newpassword 新密码 * @param string $captcha 验证码 */ public function reset_fund_pwd() { $login_pwd = $this->request->post("login_pwd", '', null); $new_pwd = $this->request->post("new_pwd", '', null); $confirm_pwd = $this->request->post("confirm_pwd", '', null); $captcha = $this->request->post("captcha"); $rule = [ 'login_pwd' => 'require|regex:\S{6,30}', 'new_pwd' => 'require|regex:\S{6,30}', 'confirm_pwd' => 'require|regex:\S{6,30}|confirm:new_pwd', ]; $msg = [ 'new_pwd.confirm' => __('Password and confirm password don\'t match') ]; $data = [ 'login_pwd' => $login_pwd, 'new_pwd' => $new_pwd, 'confirm_pwd' => $confirm_pwd, ]; $field = [ 'login_pwd' => __('登录密码'), 'new_pwd' => __('新资金密码'), 'confirm_pwd' => __('新密码') ]; $validate = new Validate($rule, $msg, $field); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError())); } if (empty($captcha)) { $this->error(__('Invalid parameters')); } $user = $this->auth->getUser(); //验证手机验证码 $ret = (new \app\api\controller\Sms())->check($user['code'],$user['mobile'], $captcha, 'rest_fund_pwd'); if (!$ret) { $this->error(__('Captcha is incorrect')); } $res = (new \app\common\model\Users()) ->where('id', $user['id']) ->update([ 'fund_pwd' => md5($new_pwd) ]); if($res){ $this->success(__('资金密码重置成功')); } $this->error(__('资金密码重置失败')); } /** * 找回密码发送验证码 * @return void * @throws \think\Exception */ public function find_pwd_send_sms() { $code = $this->request->post('country_code'); $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); $token = $this->request->post('token'); if(!captcha_check($captcha,$token)){ $this->error(__('验证码错误')); }; $user = UserModel::getByCodeAndMobile($code,$mobile); if(empty($user)){ $this->error(__('手机号码不存在')); } if($user['is_lock']){ $this->error(__('账号锁定')); } (new \app\api\controller\Sms())->send_international_sms($user['code'], $user['mobile'], 'find_pwd'); } public function verify_code() { $country_code = $this->request->post('country_code'); $mobile = $this->request->post('mobile'); $code = $this->request->post('code'); $verify = (new \app\api\controller\Sms())->check($country_code, $mobile, $code, 'find_pwd'); if($verify){ $token = uniqid(); Cache::set($token, ['code' => $country_code, 'mobile' => $mobile], 60 * 10);//临时token缓存10分钟 $this->success('', $token); } $this->error(__('手机验证码错误')); } public function reset_pwd() { $token = $this->request->post('token'); $new_pwd = $this->request->post("new_pwd", '', null); $confirm_pwd = $this->request->post("confirm_pwd", '', null); $rule = [ 'new_pwd' => 'require|regex:\S{6,30}', 'confirm_pwd' => 'require|regex:\S{6,30}|confirm:new_pwd', ]; $msg = [ 'new_pwd.confirm' => __('Password and confirm password don\'t match') ]; $data = [ 'new_pwd' => $new_pwd, 'confirm_pwd' => $confirm_pwd, ]; $field = [ 'new_pwd' => __('新资金密码'), 'confirm_pwd' => __('新密码') ]; $validate = new Validate($rule, $msg, $field); $result = $validate->check($data); if (!$result) { $this->error(__($validate->getError())); } $info = Cache::get($token); if(empty($info)){ $this->error(__('操作超时')); } Db::startTrans(); try { $salt = Random::alnum(); $new_password = $this->auth->getEncryptPassword($new_pwd, $salt); UserModel::where($info) ->update([ 'login_pwd' => $new_password, 'salt' => $salt ]); Db::commit(); } catch (Exception $e) { Db::rollback(); $this->error($e->getMessage()); } Cache::rm($token);//删除缓存 $this->success(''); } /** * 手机验证码登录 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $captcha 验证码 */ public function mobilelogin() { $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); if (!$mobile || !$captcha) { $this->error(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('Mobile is incorrect')); } if (!Sms::check($mobile, $captcha, 'mobilelogin')) { $this->error(__('Captcha is incorrect')); } $user = \app\common\model\Users::getByMobile($mobile); if ($user) { if ($user->status != 'normal') { $this->error(__('Account is locked')); } //如果已经有账号则直接登录 $ret = $this->auth->direct($user->id); } else { $ret = $this->auth->register($mobile, Random::alnum(), '', $mobile, []); } if ($ret) { Sms::flush($mobile, 'mobilelogin'); $data = ['userinfo' => $this->auth->getUserinfo()]; $this->success(__('Logged in successful'), $data); } 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'); //$email = $this->request->post('email'); $code = $this->request->post('code'); $mobile = $this->request->post('mobile'); $pwd = $this->request->post('pwd'); $confirm_pwd = $this->request->post('confirm_pwd'); $invitation_code = $this->request->post('invitation_code'); if (!$code || !$mobile || !$pwd || !$confirm_pwd || !$invitation_code) { $this->error(__('Invalid parameters')); } if ($pwd != $confirm_pwd) { $this->error(__('确认密码不一致')); } // if ($email && !Validate::is($email, "email")) { // $this->error(__('Email is incorrect')); // } if ($mobile && !Validate::regex($mobile, "^\d{8,11}$")) { $this->error(__('Mobile is incorrect')); } // $ret = Sms::check($mobile, $code, 'register'); // if (!$ret) { // $this->error(__('Captcha is incorrect')); // } $ret = $this->auth->register($code, $mobile, $pwd, $invitation_code); if ($ret) { $data = ['userinfo' => $this->auth->getUserinfo()]; $this->success(__('Sign up successful'), $data); } else { $this->error($this->auth->getError()); } } /** * 退出登录 * @ApiMethod (POST) */ public function logout() { if (!$this->request->isPost()) { $this->error(__('Invalid parameters')); } $this->auth->logout(); $this->success(__('Logout successful')); } /** * 修改会员个人信息 * * @ApiMethod (POST) * @param string $avatar 头像地址 * @param string $username 用户名 * @param string $nickname 昵称 * @param string $bio 个人简介 */ 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\Users::where('username', $username)->where('id', '<>', $this->auth->id)->find(); if ($exists) { $this->error(__('Username already exists')); } $user->username = $username; } if ($nickname) { $exists = \app\common\model\Users::where('nickname', $nickname)->where('id', '<>', $this->auth->id)->find(); if ($exists) { $this->error(__('Nickname already exists')); } $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')); } if (!Validate::is($email, "email")) { $this->error(__('Email is incorrect')); } if (\app\common\model\Users::where('email', $email)->where('id', '<>', $user->id)->find()) { $this->error(__('Email already exists')); } $result = Ems::check($email, $captcha, 'changeemail'); if (!$result) { $this->error(__('Captcha is incorrect')); } $verification = $user->verification; $verification->email = 1; $user->verification = $verification; $user->email = $email; $user->save(); Ems::flush($email, 'changeemail'); $this->success(); } /** * 修改手机号 * * @ApiMethod (POST) * @param string $mobile 手机号 * @param string $captcha 验证码 */ public function changemobile() { $user = $this->auth->getUser(); $mobile = $this->request->post('mobile'); $captcha = $this->request->post('captcha'); if (!$mobile || !$captcha) { $this->error(__('Invalid parameters')); } if (!Validate::regex($mobile, "^1\d{10}$")) { $this->error(__('Mobile is incorrect')); } if (\app\common\model\Users::where('mobile', $mobile)->where('id', '<>', $user->id)->find()) { $this->error(__('Mobile already exists')); } $result = Sms::check($mobile, $captcha, 'changemobile'); if (!$result) { $this->error(__('Captcha is incorrect')); } $verification = $user->verification; $verification->mobile = 1; $user->verification = $verification; $user->mobile = $mobile; $user->save(); Sms::flush($mobile, 'changemobile'); $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\Users::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\Users::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()); } } }