AuthController.php 10 KB

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