AuthController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  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 Illuminate\Support\Facades\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. if (\App::environment('production')){
  40. SmsServer::checkSmsCodeByVerifyKey($mobile, $request->code);
  41. }
  42. } catch (Exception $exception) {
  43. return $this->error($exception->getMessage());
  44. }
  45. $user = \App::make('getUserInstance'); //在 app/Providers/AppServiceProvider.php 里面可以创一个单例模式
  46. $user->nickname = 'User' . mb_substr($mobile, 0, 6);
  47. $user->avatar = '';
  48. $user->mobile = $mobile;
  49. $user->password = $password; //这个不是直接存密码,User模型中使用了修改器
  50. //$user->register_ip = request()->ip();
  51. $user->save();
  52. return $this->success('创建成功!');
  53. }
  54. //账号密码登录
  55. public function login(Request $request)
  56. {
  57. $account = $request->input('account');
  58. $password = $request->input('password');
  59. $jpush_reg_id = $request->input('jpush_reg_id');
  60. if (!$user = User::query()->where(['mobile' => $account])->orWhere(['email' => $account])->first()) {
  61. return $this->error('账号不存在');
  62. }
  63. $credentials1 = ['mobile' => $account, 'password' => $password];
  64. $credentials2 = ['email' => $account, 'password' => $password];
  65. if (!auth('api')->attempt($credentials1) && !auth('api')->attempt($credentials2)) {
  66. return $this->error('密码错误!');
  67. }
  68. $data = $this->doLogin($user, $jpush_reg_id);
  69. return $this->success($data);
  70. }
  71. //短信验证码登录
  72. public function loginBySmsCode(Request $request)
  73. {
  74. try {
  75. if (!$user = User::query()->where(['mobile' => $request->mobile])->first()) {
  76. return $this->error('账号不存在');
  77. }
  78. //手机验证码验证
  79. SmsServer::checkSmsCodeByVerifyKey($request->mobile, $request->smsCode);
  80. //如果登录类型和 openid 不为空
  81. $type = $request->type;
  82. if (isset($type) && !empty($type)) {
  83. if ($type == 'weixin') {
  84. if ($user->wx_openid != '') {
  85. return $this->error('已经绑定微信');
  86. }
  87. $user->wx_openid = $request->openid;
  88. $user->save();
  89. }
  90. }
  91. $data = $this->doLogin($request->mobile, $request->post('jpush_reg_id', ''));
  92. } catch (\Exception $exception) {
  93. return $this->error($exception);
  94. }
  95. return $this->success($data);
  96. }
  97. //APP第三方授权登录(微信)
  98. public function authLogin(Request $request)
  99. {
  100. try {
  101. $socialite = Socialite::driver('weixin')->stateless()->user();
  102. $user = User::query()->where('open_id', $socialite->getId())->first();
  103. if (!$user) {
  104. $data['open_id'] = $socialite->getId();
  105. $data['user'] = [];
  106. } else {
  107. $account = $user->mobile ?: $user->email;
  108. $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
  109. }
  110. } catch (Exception $exception) {
  111. ErrorMsgServive::write($exception, requst()->url());
  112. return $this->error('微信授权登录出错~');
  113. }
  114. return $this->success($data);
  115. }
  116. //微信小程序登录(微信)
  117. public function miniProgram(Request $request)
  118. {
  119. try {
  120. $mini = Factory::miniProgram($this->wxConfig);
  121. $newMini = $mini->auth->session($request->input('code'));
  122. $iv = $request->input('iv');
  123. $encryptData = $request->input('encryptData');
  124. $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
  125. $openId = $decryptedData['openid'];
  126. $user = User::query()->where('open_id', $openId)->first();
  127. if (!$user) {
  128. $data['open_id'] = $openId;
  129. $data['user'] = [];
  130. } else {
  131. $account = $user->mobile ?: $user->email;
  132. $data = $this->doLogin($account, $request->post('jpush_reg_id', ''));
  133. }
  134. } catch (Exception $exception) {
  135. ErrorMsgServive::write($exception, requst()->url());
  136. return $this->error('微信授权登录出错~');
  137. }
  138. return $this->success($data);
  139. }
  140. //微信小程序获取手机号
  141. public function decryptPhone(Request $request)
  142. {
  143. $user = auth('api')->user();
  144. try {
  145. $mini = Factory::miniProgram($this->wxConfig);
  146. $newMini = $mini->auth->session($request->input('code'));
  147. $iv = $request->input('iv');
  148. $encryptData = $request->input('encryptData');
  149. $decryptedData = $mini->encryptor->decryptData($newMini['session_key'], $iv, $encryptData);
  150. $user = User::query()->where('id', $user->id)->first();
  151. $user->mobile = $decryptedData['purePhoneNumber'];
  152. $user->save();
  153. } catch (\Exception $exception) {
  154. ErrorMsgServive::write($exception, requst()->url());
  155. return $this->error('获取手机号出错~');
  156. }
  157. return $this->success();
  158. }
  159. //H5 应用进行微信授权登录
  160. public function h5Oauth()
  161. {
  162. }
  163. //微信小程序 code
  164. public function miniCode()
  165. {
  166. }
  167. //执行登录
  168. public function doLogin($user, $jpush_reg_id = null)
  169. {
  170. if (!empty($jpush_reg_id)) {
  171. //清除登陆过本设备的账号设备id
  172. User::query()->where('jpush_reg_id', $jpush_reg_id)->update(['jpush_reg_id' => '']);
  173. //当前登录用户绑定设备
  174. $user->jpush_reg_id = $jpush_reg_id;
  175. //清除别名
  176. JPushService::deleteAlias('user_id_' . $user->id);
  177. //设置极光推送别名
  178. JPushService::updateAlias($user->jpush_reg_id, 'user_id_' . $user->id);
  179. }
  180. $user->online = 1;
  181. $user->last_login_time = date('Y-m-d H:i:s');
  182. $user->last_login_ip = request()->ip();
  183. if (!$user->save()) {
  184. return $this->error('数据保存失败');
  185. }
  186. $token = Auth::guard('api')->fromUser($user);
  187. $userInfo = UserService::getUserInfoById($user->id);
  188. $data = [
  189. 'token' => "Bearer " . $token,
  190. 'user_info' => $userInfo,
  191. ];
  192. return $data;
  193. }
  194. //用户是否存在
  195. public function isUserExist($account)
  196. {
  197. $user = User::where(['mobile' => $account])
  198. ->orWhere(['email' => $account])
  199. ->first();
  200. if (!$user) {
  201. return false;
  202. }
  203. return $user;
  204. }
  205. //忘记密码
  206. public function forgetPassword(Request $request)
  207. {
  208. if ($request->new_password != $request->confirm_password) {
  209. return $this->error('两次密码不一致');
  210. }
  211. try {
  212. $user = User::find($this->user->id);
  213. //手机验证码验证
  214. SmsServer::checkSmsCodeByVerifyKey($user->mobile, $request->smsCode);
  215. } catch (Exception $exception) {
  216. return $this->error($exception->getMessage());
  217. }
  218. $user->password = $request->new_password;
  219. $user->save();
  220. return $this->success();
  221. }
  222. //退出
  223. public function logout()
  224. {
  225. $user = auth('api')->user();
  226. //清空极光别名
  227. JPushService::updateAlias($user->jpush_reg_id, '');
  228. $user->online = 0;
  229. $user->save();
  230. auth('api')->logout();
  231. return $this->success();
  232. }
  233. }