AuthController.php 10 KB

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