| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 | <?phpnamespace App\Http\Controllers\V1;use App\Models\Job;use App\Models\User;use App\Services\Api\ErrorMsgServive;use App\Services\Api\UserService;use App\Services\JPushService;use App\Services\SmsServer;use Cache;use EasyWeChat\Factory;use Illuminate\Http\Request;use Illuminate\Support\Facades\Auth;use Illuminate\Support\Facades\DB;use Laravel\Socialite\Facades\Socialite;use PHPUnit\Util\Exception;use Illuminate\Support\Facades\Validator;class AuthController extends Controller{    public function __construct()    {        $this->wxConfig = ['app_id' => env("WECHAT_MINI_PROGRAM_APPID"), 'secret' => env("WECHAT_MINI_PROGRAM_SECRET"), 'response_type' => 'array'];    }    //注册    public function register(Request $request)    {        $mobile   = $request->input('mobile', '');        $password = $request->input('password', '');        $validator = Validator::make($request->all(), [            'mobile' => 'required',            'password' => 'required|min:6',        ]);        if ($validator->fails()) {            return $this->error($validator->errors()->first());        }        if (UserService::checkUserByMobile($mobile)) {            return $this->error('手机号已被占用');        }        try { //手机验证码验证           if (\App::environment('production')){             SmsServer::checkSmsCodeByVerifyKey($mobile, $request->code);           }        } catch (Exception $exception) {            return $this->error($exception->getMessage());        }        $user = \App::make('getUserInstance'); //在 app/Providers/AppServiceProvider.php 里面可以创一个单例模式        $user->nickname = 'User' . mb_substr($mobile, 0, 6);        $user->avatar = '';        $user->mobile = $mobile;        $user->password = $password; //这个不是直接存密码,User模型中使用了修改器        //$user->register_ip = request()->ip();        $user->save();        return $this->success('创建成功!');    }    //账号密码登录    public function login(Request $request)    {        $account = $request->input('account');        $password = $request->input('password');        $jpush_reg_id = $request->input('jpush_reg_id');        if (!$user = User::query()->where(['mobile' => $account])->orWhere(['email' => $account])->first()) {            return $this->error('账号不存在');        }        $credentials1 = ['mobile' => $account, 'password' => $password];        $credentials2 = ['email' => $account, 'password' => $password];        if (!auth('api')->attempt($credentials1) && !auth('api')->attempt($credentials2)) {            return $this->error('密码错误!');        }        $data = $this->doLogin($user, $jpush_reg_id);        return $this->success($data);    }    //短信验证码登录    public function loginBySmsCode(Request $request)    {        try {            if (!$user = User::query()->where(['mobile' => $request->mobile])->first()) {              return $this->error('账号不存在');            }            //手机验证码验证            SmsServer::checkSmsCodeByVerifyKey($request->mobile, $request->smsCode);            //如果登录类型和 openid 不为空            $type = $request->type;            if (isset($type) && !empty($type)) {                if ($type == 'weixin') {                    if ($user->wx_openid != '') {                      return $this->error('已经绑定微信');                    }                    $user->wx_openid = $request->openid;                    $user->save();                }            }            $data = $this->doLogin($request->mobile, $request->post('jpush_reg_id', ''));        } catch (\Exception $exception) {            return $this->error($exception);        }        return $this->success($data);    }    //APP第三方授权登录(微信)    public function authLogin(Request $request)    {        try {            $socialite = Socialite::driver('weixin')->stateless()->user();            $user = User::query()->where('open_id', $socialite->getId())->first();            if (!$user) {                $data['open_id'] = $socialite->getId();                $data['user'] = [];            } else {                $account = $user->mobile ?: $user->email;                $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));            }        } catch (Exception $exception) {            ErrorMsgServive::write($exception, requst()->url());            return $this->error('微信授权登录出错~');        }        return $this->success($data);    }    //微信小程序登录(微信)    public function miniProgram(Request $request)    {        try {            $mini = Factory::miniProgram($this->wxConfig);            $newMini = $mini->auth->session($request->input('code'));            $iv = $request->input('iv');            $encryptData = $request->input('encryptData');            $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);            $openId = $decryptedData['openid'];            $user = User::query()->where('open_id', $openId)->first();            if (!$user) {                $data['open_id'] = $openId;                $data['user'] = [];            } else {                $account = $user->mobile ?: $user->email;                $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));            }        } catch (Exception $exception) {            ErrorMsgServive::write($exception, requst()->url());            return $this->error('微信授权登录出错~');        }        return $this->success($data);    }    //微信小程序获取手机号    public function decryptPhone(Request $request)    {        $user = auth('api')->user();        try {            $mini = Factory::miniProgram($this->wxConfig);            $newMini = $mini->auth->session($request->input('code'));            $iv = $request->input('iv');            $encryptData = $request->input('encryptData');            $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);            $user = User::query()->where('id', $user->id)->first();            $user->mobile = $decryptedData['purePhoneNumber'];            $user->save();        } catch (\Exception $exception) {            ErrorMsgServive::write($exception, requst()->url());            return $this->error('获取手机号出错~');        }        return $this->success();    }    //H5 应用进行微信授权登录    public function h5Oauth()    {    }    //微信小程序 code    public function miniCode()    {    }    //执行登录    public function doLogin($user, $jpush_reg_id = null)    {        if (!empty($jpush_reg_id)) {            //清除登陆过本设备的账号设备id            User::query()->where('jpush_reg_id', $jpush_reg_id)->update(['jpush_reg_id' => '']);            //当前登录用户绑定设备            $user->jpush_reg_id = $jpush_reg_id;            //清除别名            JPushService::deleteAlias('user_id_' . $user->id);            //设置极光推送别名            JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);        }        $user->online = 1;        $user->last_login_time = date('Y-m-d H:i:s');        $user->last_login_ip = request()->ip();        if (!$user->save()) {            return $this->error('数据保存失败');        }        $token = Auth::guard('api')->fromUser($user);        $userInfo = UserService::getUserInfoById($user->id);        $data = [            'token' => "Bearer " . $token,            'user_info' => $userInfo,        ];        return $data;    }    //用户是否存在    public function isUserExist($account)    {        $user = User::where(['mobile' => $account])            ->orWhere(['email' => $account])            ->first();        if (!$user) {            return false;        }        return $user;    }    //忘记密码    public function forgetPassword(Request $request)    {        if ($request->new_password != $request->confirm_password) {            return $this->error('两次密码不一致');        }        try {            $user = User::find($this->user->id);            //手机验证码验证            SmsServer::checkSmsCodeByVerifyKey($user->mobile, $request->smsCode);        } catch (Exception $exception) {            return $this->error($exception->getMessage());        }        $user->password = $request->new_password;        $user->save();        return $this->success();    }    //退出    public function logout()    {        $user = auth('api')->user();        //清空极光别名        JPushService::updateAlias($user->jpush_reg_id, '');        $user->online = 0;        $user->save();        auth('api')->logout();        return $this->success();    }}
 |