AuthController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Models\Job;
  4. use App\Models\User;
  5. use App\Services\Api\ErrorMsgServive;
  6. use App\Services\Api\UserService;
  7. use App\Services\JPushService;
  8. use App\Services\SmsServer;
  9. use Cache;
  10. use EasyWeChat\Factory;
  11. use Illuminate\Http\Request;
  12. use Illuminate\Support\Facades\Auth;
  13. use Illuminate\Support\Facades\DB;
  14. use Laravel\Socialite\Facades\Socialite;
  15. use PHPUnit\Util\Exception;
  16. use Validator;
  17. class AuthController extends Controller
  18. {
  19. public function __construct()
  20. {
  21. $this->wxConfig = ['app_id' => env("WECHAT_MINI_PROGRAM_APPID"), 'secret' => env("WECHAT_MINI_PROGRAM_SECRET"), 'response_type' => 'array'];
  22. }
  23. //注册
  24. public function register(Request $request)
  25. {
  26. $mobile = $request->input('mobile', '');
  27. $password = $request->input('password', '');
  28. $validator = Validator::make($request->all(), [
  29. 'mobile' => 'required',
  30. 'password' => 'required|min:6',
  31. ]);
  32. if ($validator->fails()) {
  33. return $this->error($validator->errors()->first());
  34. }
  35. if (UserService::checkUserByMobile($mobile)) {
  36. return $this->error('手机号已被占用');
  37. }
  38. try { //手机验证码验证
  39. SmsServer::checkSmsCodeByVerifyKey($request->verifyKey, $request->code);
  40. } catch (Exception $exception) {
  41. return $this->error($exception->getMessage());
  42. }
  43. $user = App::make('getUserInstance'); //在 app/Providers/AppServiceProvider.php 里面可以创一个单例模式
  44. $user->name = 'User' . mb_substr($mobile, 0, 6);
  45. $user->avatar = '';
  46. $user->mobile = $mobile;
  47. $user->password = $password; //这个不是直接存密码,User模型中使用了修改器
  48. $user->register_ip = request()->ip();
  49. return $this->success('创建成功!');
  50. }
  51. //账号密码登录
  52. public function login(Request $request)
  53. {
  54. $account = $request->input('account');
  55. $password = $request->input('password');
  56. $jpush_reg_id = $request->input('jpush_reg_id');
  57. if (!$user = User::query()->where(['mobile' => $account])->orWhere(['email' => $account])->first()) {
  58. return $this->error('账号不存在');
  59. }
  60. $credentials1 = ['mobile' => $account, 'password' => $password];
  61. $credentials2 = ['email' => $account, 'password' => $password];
  62. if (!auth('api')->attempt($credentials1) && !auth('api')->attempt($credentials2)) {
  63. return $this->error('密码错误!');
  64. }
  65. $data = $this->doLogin($user, $jpush_reg_id);
  66. return $this->success($data);
  67. }
  68. //APP第三方授权登录(微信)
  69. public function authLogin(Request $request)
  70. {
  71. try {
  72. $socialite = Socialite::driver('weixin')->stateless()->user();
  73. $user = User::query()->where('open_id', $socialite->getId())->first();
  74. if (!$user) {
  75. $data['open_id'] = $socialite->getId();
  76. $data['user'] = [];
  77. } else {
  78. $account = $user->mobile ?: $user->email;
  79. $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
  80. }
  81. } catch (Exception $exception) {
  82. ErrorMsgServive::write($exception, requst()->url());
  83. return $this->error('微信授权登录出错~');
  84. }
  85. return $this->success($data);
  86. }
  87. //微信小程序登录(微信)
  88. public function miniProgram(Request $request)
  89. {
  90. try {
  91. $mini = Factory::miniProgram($this->wxConfig);
  92. $newMini = $mini->auth->session($request->input('code'));
  93. $iv = $request->input('iv');
  94. $encryptData = $request->input('encryptData');
  95. $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
  96. $openId = $decryptedData['openid'];
  97. $user = User::query()->where('open_id', $openId)->first();
  98. if (!$user) {
  99. $data['open_id'] = $openId;
  100. $data['user'] = [];
  101. } else {
  102. $account = $user->mobile ?: $user->email;
  103. $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
  104. }
  105. } catch (Exception $exception) {
  106. ErrorMsgServive::write($exception, requst()->url());
  107. return $this->error('微信授权登录出错~');
  108. }
  109. return $this->success($data);
  110. }
  111. //微信小程序获取手机号
  112. public function decryptPhone(Request $request)
  113. {
  114. $user = auth('api')->user();
  115. try {
  116. $mini = Factory::miniProgram($this->wxConfig);
  117. $newMini = $mini->auth->session($request->input('code'));
  118. $iv = $request->input('iv');
  119. $encryptData = $request->input('encryptData');
  120. $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
  121. $user = User::query()->where('id', $user->id)->first();
  122. $user->mobile = $decryptedData['purePhoneNumber'];
  123. $user->save();
  124. } catch (\Exception $exception) {
  125. ErrorMsgServive::write($exception, requst()->url());
  126. return $this->error('获取手机号出错~');
  127. }
  128. return $this->success();
  129. }
  130. //H5 应用进行微信授权登录
  131. public function h5Oauth()
  132. {
  133. }
  134. //微信小程序 code
  135. public function miniCode()
  136. {
  137. }
  138. //执行登录
  139. public function doLogin($user, $jpush_reg_id = null)
  140. {
  141. if (!empty($jpush_reg_id)) {
  142. //清除登陆过本设备的账号设备id
  143. User::query()->where('jpush_reg_id', $jpush_reg_id)->update(['jpush_reg_id' => '']);
  144. //当前登录用户绑定设备
  145. $user->jpush_reg_id = $jpush_reg_id;
  146. //清除别名
  147. JPushService::deleteAlias('user_id_' . $user->id);
  148. //设置极光推送别名
  149. JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);
  150. }
  151. $user->online = 1;
  152. $user->last_login_time = date('Y-m-d H:i:s');
  153. $user->last_login_ip = request()->ip();
  154. if (!$user->save()) {
  155. return $this->error('数据保存失败');
  156. }
  157. $token = Auth::guard('api')->fromUser($user);
  158. $userInfo = UserService::getUserInfoById($user->id);
  159. $data = [
  160. 'token' => "Bearer " . $token,
  161. 'user_info' => $userInfo,
  162. ];
  163. return $data;
  164. }
  165. //用户是否存在
  166. public function isUserExist($account)
  167. {
  168. $user = User::where(['mobile' => $account])
  169. ->orWhere(['email' => $account])
  170. ->first();
  171. if (!$user) {
  172. return false;
  173. }
  174. return $user;
  175. }
  176. //忘记密码
  177. public function forgetPassword(Request $request)
  178. {
  179. if ($request->new_password != $request->confirm_password) {
  180. return $this->error('两次密码不一致');
  181. }
  182. try {
  183. SmsServer::checkSmsCodeByVerifyKey($request->verifyKey, $request->code);
  184. } catch (Exception $exception) {
  185. return $this->error($exception->getMessage());
  186. }
  187. $user->password = $request->new_password;
  188. $user->save();
  189. return $this->success();
  190. }
  191. //退出
  192. public function logout()
  193. {
  194. $user = auth('api')->user();
  195. //清空极光别名
  196. JPushService::updateAlias($user->jpush_reg_id, '');
  197. $user->online = 0;
  198. $user->save();
  199. auth('api')->logout();
  200. return $this->success();
  201. }
  202. }