|
@@ -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());
|
|
|
- }
|
|
|
- }
|
|
|
}
|