AuthorizationsController.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. <?php
  2. namespace App\Http\Controllers\Api;
  3. use App\Exceptions\SmsException;
  4. use App\Models\AdminRole;
  5. use App\Models\User;
  6. use App\Models\UserInfoModel;
  7. use App\Models\UserInviteLog;
  8. use App\Models\UserVipLimit;
  9. use App\Services\JPushService;
  10. use App\Services\SmsService;
  11. use App\Services\TencentImAccountService;
  12. use App\Transformers\UserTransformer;
  13. use Carbon\Carbon;
  14. use http\Env\Response;
  15. use Illuminate\Http\Request;
  16. use Illuminate\Support\Facades\Auth;
  17. use Illuminate\Support\Facades\DB;
  18. use Illuminate\Support\Facades\Hash;
  19. use Illuminate\Support\Facades\Validator;
  20. use PHPUnit\Util\Exception;
  21. class AuthorizationsController extends Controller
  22. {
  23. protected $tencentImAccountService;
  24. public function __construct(TencentImAccountService $tencentImAccountService)
  25. {
  26. $this->tencentImAccountService = $tencentImAccountService;
  27. }
  28. /**
  29. * 极光认证一键登录
  30. */
  31. public function auth_login(Request $request){
  32. file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND);
  33. try {
  34. if(empty($request->loginToken)){
  35. throw new Exception("参数错误");
  36. }
  37. $loginToken = $request->loginToken;
  38. $exID = $request->post('exID','800');
  39. $ret = JPushService::jgLoginTokenVerify($loginToken,$exID);
  40. $mobile = JPushService::jgOpensslPrivateDecrypt($ret['phone']);
  41. $res = $this->do_login($mobile);
  42. }catch (\Exception $exception){
  43. return $this->response->errorForbidden($exception->getMessage());
  44. }
  45. return response()->json($res);
  46. }
  47. /**
  48. * 手机号登录
  49. * @param Request $request
  50. * @return \Illuminate\Http\JsonResponse
  51. */
  52. public function login_by_mobile(Request $request)
  53. {
  54. file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND);
  55. try {
  56. $validator = Validator::make($request->all(), [
  57. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  58. 'verifyKey' => 'bail|required|string',
  59. 'smsCode' => 'bail|required',
  60. ], [
  61. 'mobile.required'=>"手机号码必须",
  62. 'mobile.regex'=>"手机号码格式错误",
  63. 'verifyKey.required'=>"验证码必须",
  64. 'smsCode.required'=>"短信验证码必须",
  65. ]);
  66. if ($validator->fails()) {
  67. return $this->response()->errorForbidden($validator->messages()->first());
  68. }
  69. //验证短信验证码
  70. SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode);
  71. $res = $this->do_login($request->mobile,null,$request->registrationId,$request->phoneModel);
  72. }catch (\Exception $exception){
  73. return $this->response->errorForbidden($exception->getMessage());
  74. } catch (SmsException $e) {
  75. return $this->response->errorForbidden($e->getMessage());
  76. }
  77. return response()->json($res);
  78. }
  79. /**
  80. * 用户账号密码登录
  81. * @param Request $request
  82. * @return \Illuminate\Http\JsonResponse|void
  83. */
  84. public function login_by_account_password(Request $request)
  85. {
  86. file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($request->all(),true).PHP_EOL,FILE_APPEND);
  87. try {
  88. $validator = Validator::make($request->all(), [
  89. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  90. 'password' => 'required|string',
  91. ],[
  92. 'mobile.required'=>"手机号码必须",
  93. 'mobile.regex'=>"手机号码格式错误",
  94. 'password.required'=>"密码必须",
  95. ]);
  96. if ($validator->fails()) {
  97. throw new Exception($validator->messages()->first());
  98. }
  99. $res = $this->do_login($request->mobile,$request->password,$request->registrationId,$request->phoneModel);
  100. }catch (\Exception $exception){
  101. return $this->response->errorForbidden($exception->getMessage());
  102. }
  103. file_put_contents('login_log.log',date("Y-m-d H:i:s").'执行成功'.PHP_EOL,FILE_APPEND);
  104. return response()->json($res);
  105. }
  106. //登录操作
  107. public function do_login($mobile,$password=null,$registrationId=null,$phoneModel=null){
  108. if(!empty($password)){
  109. if (!$user=User::query()->where(['mobile' => $mobile,'is_distory'=>0])->whereNull('deleted_at')->first()) {
  110. throw new Exception("用户不存在");
  111. }
  112. file_put_contents('login_log.log',date("Y-m-d H:i:s").var_export($user->toArray(),true).PHP_EOL,FILE_APPEND);
  113. $credentials = ['mobile'=>$mobile,'password'=>$password];
  114. if (!auth('api')->attempt($credentials)) {
  115. throw new Exception("用户名或密码错误");
  116. }
  117. }else{
  118. if(!User::query()->where(['mobile'=>$mobile,'is_distory'=>0])->first()){
  119. User::query()->create([
  120. 'mobile' => $mobile,
  121. ]);
  122. }
  123. $user = User::query()->where(['mobile'=>$mobile,'is_distory'=>0])->whereNull('deleted_at')->first();
  124. }
  125. if (!$user->ycode) {
  126. $user->ycode = $this->create_code();
  127. }
  128. if(!UserInfoModel::query()->where('user_id',$user->id)->first()){
  129. UserInfoModel::query()->create([
  130. 'user_id'=>$user->id,
  131. 'avatar'=>"https://zhengda.oss-cn-chengdu.aliyuncs.com/chengluApp/default.jpg",
  132. 'nickname'=>"用户".$user->mobile,
  133. 'birthday'=>"1990-01-01"
  134. ]);
  135. }
  136. if(!UserVipLimit::query()->where('user_id',$user->id)->first()){
  137. UserVipLimit::query()->create([
  138. 'user_id'=>$user->id,
  139. ]);
  140. }
  141. if (!$user->tencent_im_user_id) {
  142. $user->tencent_im_user_id = $this->tencentImAccountService->accountImport($user);
  143. }
  144. if($user->status!=1){
  145. throw new Exception("用户已被禁用,请联系管理员");
  146. }
  147. $token = Auth::guard('api')->fromUser($user);
  148. $user->remember_token = $token;
  149. $user->last_login_time = date("Y-m-d H:i:s");
  150. $user->last_login_ip = request()->ip();
  151. if(!empty($registrationId)){
  152. $user->registrationId = $registrationId;
  153. $user->phoneModel = $phoneModel;
  154. }
  155. $re = $user->save();
  156. file_put_contents('login_log.log',date("Y-m-d H:i:s").$re.PHP_EOL,FILE_APPEND);
  157. $resdata['token'] = "Bearer ".$token;
  158. $resdata['sex'] = $user->sex;
  159. $resdata['password'] = $user->password?1:0;
  160. $resdata['tencent_im_user_id'] =$user->tencent_im_user_id;
  161. $resdata['mobile'] =$user->mobile;
  162. $resdata['lock_pass'] =$user->lock_pass?$user->lock_pass:false;
  163. $resdata['status'] =$user->status;
  164. $resdata['is_auth'] =$user->is_auth;
  165. $resdata['ycode'] =$user->ycode;
  166. $resdata['online'] =$user->online;
  167. $resdata['notice_status'] =$user->notice_status;
  168. return $resdata;
  169. }
  170. public function captcha(){
  171. return response(captcha_src());
  172. }
  173. /**
  174. * 根据用户ID生成唯一邀请码
  175. * @param $user_id
  176. * @return string
  177. */
  178. public function create_code() {
  179. $code = create_invite_code();
  180. if(User::where(['ycode'=>$code])->first()){
  181. $code = create_invite_code();
  182. }
  183. return $code;
  184. }
  185. /**
  186. * 注册账号
  187. */
  188. public function register(Request $request){
  189. $validator = Validator::make($request->all(), [
  190. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  191. 'password' => 'bail|required',
  192. ],[
  193. 'mobile.required'=>"手机号码必须",
  194. 'mobile.regex'=>"手机号码格式错误",
  195. 'password.required'=>"密码必须",
  196. ]);
  197. if ($validator->fails()){
  198. return $this->response()->errorForbidden($validator->messages()->first());
  199. }
  200. if(User::where(['mobile'=>$request->mobile,'is_distory'=>0])->first()){
  201. return $this->response->errorForbidden("该手机号码已注册");
  202. }
  203. $ins = array();
  204. $ins['mobile'] = $request->mobile;
  205. $ins['password'] = $request->password;
  206. if(User::create($ins)){
  207. return response()->json(['message'=>"注册成功"]);
  208. }else{
  209. return $this->response->errorForbidden("注册失败");
  210. }
  211. }
  212. public function reg_h5(Request $request){
  213. $validator = Validator::make($request->all(), [
  214. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  215. 'password' => 'bail|required',
  216. 'smsCode' => 'bail|required',
  217. ],[
  218. 'mobile.required'=>"手机号码必须",
  219. 'mobile.regex'=>"手机号码格式错误",
  220. 'password.required'=>"密码必须",
  221. 'smsCode.required'=>"短信验证码必须",
  222. ]);
  223. if ($validator->fails()){
  224. return response()->json([
  225. 'code'=>0,
  226. 'message'=>$validator->messages()->first()
  227. ]);
  228. }
  229. DB::beginTransaction();
  230. try {
  231. //验证短信验证码
  232. SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode);
  233. if(User::where(['mobile'=>$request->mobile,'is_distory'=>0])->first()){
  234. throw new Exception("该手机号码已使用");
  235. }
  236. //邀请码设置
  237. $pid = 0;
  238. if(isset($request->ycode) && $request->ycode!=""){
  239. if(!$puser = User::where(['ycode'=>$request->ycode])->first()){
  240. throw new Exception("邀请码不存在");
  241. }
  242. $pid = $puser->id;
  243. }
  244. $ins = array();
  245. $ins['mobile'] = $request->mobile;
  246. $ins['password'] = $request->password;
  247. $ins['pid'] = $pid;
  248. $ins['created_at'] = date('Y-m-d H:i:s');
  249. $ins['updated_at'] = date('Y-m-d H:i:s');
  250. $insid = User::query()->insertGetId($ins);
  251. //赠送会员天数
  252. UserInviteLog::query()->create([
  253. 'user_id'=>$pid,
  254. 'invite_id'=>$insid,
  255. 'day'=>1,
  256. 'status'=>0,
  257. ]);
  258. DB::commit();
  259. } catch (SmsException $e) {
  260. DB::rollBack();
  261. return response()->json([
  262. 'code'=>0,
  263. 'message'=>$e->getMessage()
  264. ]);
  265. } catch (\Exception $e) {
  266. DB::rollBack();
  267. return response()->json([
  268. 'code'=>0,
  269. 'message'=>'短信校验失败'
  270. ]);
  271. }
  272. return response()->json([
  273. 'code'=>1,
  274. 'message'=>'注册成功'
  275. ]);
  276. }
  277. /**
  278. * 忘记密码
  279. */
  280. public function forget_password(Request $request){
  281. try {
  282. $validator = Validator::make($request->all(), [
  283. 'mobile' => ['required', 'regex:/^1[3456789]\d{9}$/'],
  284. 'verifyKey' => 'bail|required|string',
  285. 'smsCode' => 'bail|required',
  286. 'password' => 'bail|required',
  287. ],[
  288. 'mobile.required'=>"手机号码必须",
  289. 'mobile.regex'=>"手机号码格式错误",
  290. 'verifyKey.required'=>"验证码必须",
  291. 'smsCode.required'=>"短信验证码必须",
  292. 'password.required'=>"密码必须",
  293. ]);
  294. if ($validator->fails()) {
  295. throw new Exception($validator->messages()->first());
  296. }
  297. //验证短信验证码
  298. //SmsService::checkSmsCodeByVerifyKey($request->verifyKey, $request->smsCode);
  299. $user = User::where(['mobile'=>$request->mobile])->first();
  300. $user->password =$request->password;// Hash::make($request->password);
  301. if(!$user->save()){
  302. throw new Exception("设置失败");
  303. }
  304. $res = $this->do_login($request->mobile,$request->password);
  305. }catch (\Exception $exception){
  306. return $this->response->errorForbidden($exception->getMessage());
  307. } catch (SmsException $e) {
  308. return $this->response->errorForbidden($e->getMessage());
  309. }
  310. return response()->json($res);
  311. }
  312. /**
  313. * 用户协议
  314. */
  315. public function xieyi(Request $request){
  316. if(isset($request->cont) && $request->cont==1){
  317. $data = DB::table("document")->where(['id'=>$request->id])->first();
  318. return response()->json(['data'=>$data]);
  319. }else{
  320. $url = "https://".$_SERVER['HTTP_HOST']."/xieyi/content.html?id=1";
  321. $url2 = "https://".$_SERVER['HTTP_HOST']."/xieyi/content.html?id=2";
  322. return response()->json(['url1'=>$url,'url2'=>$url2]);
  323. }
  324. }
  325. /**
  326. * Get the authenticated User.
  327. *
  328. * @return \Illuminate\Http\JsonResponse
  329. */
  330. public function me()
  331. {
  332. $user = auth('api')->user();
  333. return $this->response->item($user, new UserTransformer());
  334. }
  335. /**
  336. * Log the user out (Invalidate the token).
  337. *
  338. * @return \Illuminate\Http\JsonResponse
  339. */
  340. public function logout()
  341. {
  342. $user = auth('api')->user();
  343. $user->online = 0;
  344. $user->save();
  345. auth('api')->logout();
  346. return response()->json(['message' => '退出成功!']);
  347. }
  348. /**
  349. * Refresh a token.
  350. * 刷新token,如果开启黑名单,以前的token便会失效。
  351. * 值得注意的是用上面的getToken再获取一次Token并不算做刷新,两次获得的Token是并行的,即两个都可用。
  352. * @return \Illuminate\Http\JsonResponse
  353. */
  354. public function refresh()
  355. {
  356. return $this->respondWithToken(Auth::guard('api')->refresh());
  357. }
  358. static public function updateLastLogin(User $user, string $jwtToken)
  359. {
  360. $user->remember_token = $jwtToken;
  361. $user->last_login_time = Carbon::now();
  362. $user->last_login_ip = request()->ip();
  363. $user->save();
  364. }
  365. /**
  366. * Get the token array structure.
  367. *
  368. * @param string $token
  369. *
  370. * @return \Illuminate\Http\JsonResponse
  371. */
  372. protected function respondWithToken($token)
  373. {
  374. return response()->json([
  375. 'access_token' => $token,
  376. 'token_type' => 'Bearer',
  377. 'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
  378. ]);
  379. }
  380. }