AuthController.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\BindMobileRequest;
  5. use App\Http\Requests\MobileLoginRequest;
  6. use App\Http\Requests\WeappAuthorizationRequest;
  7. use App\Http\Requests\WeappUserinfoRequest;
  8. use App\Maps\CacheMap;
  9. use App\Models\Auth;
  10. use App\Models\User;
  11. use App\Models\UserPhoneDetail;
  12. use App\Repositories\ConfigRepository;
  13. use App\Repositories\InviteNewUserRepository;
  14. use App\Repositories\UserRepository;
  15. use App\Transformers\UserTransformer;
  16. use Carbon\Carbon;
  17. use Illuminate\Support\Facades\Cache;
  18. use Tymon\JWTAuth\Facades\JWTAuth;
  19. /**
  20. * 小程序权限认证模块
  21. * Class AuthController
  22. * @package App\Http\Controllers\V1
  23. */
  24. class AuthController extends Controller
  25. {
  26. protected $jwt;
  27. protected $userRepository;
  28. /**
  29. * Create a new controller instance.
  30. *
  31. * @return void
  32. */
  33. public function __construct(JWTAuth $jwt, UserRepository $userRepository)
  34. {
  35. $this->jwt = $jwt;
  36. $this->userRepository = $userRepository;
  37. }
  38. /**
  39. * 小程序认证
  40. * @param WeappAuthorizationRequest $request
  41. * User: Mead
  42. */
  43. public function weappLogin(WeappAuthorizationRequest $request, ConfigRepository $configRepository, InviteNewUserRepository $inviteNewUserRepository)
  44. {
  45. try {
  46. $code = $request->code;
  47. $appid = $request->appid;
  48. $invite_user_id = $request->get('invite_user_id') ?? 0;
  49. $miniProgram = app('wechat.mini_program');
  50. $data = $miniProgram->auth->session($code);
  51. if (isset($data['errcode'])) {
  52. $this->response->errorUnauthorized('code 不正确');
  53. return '';
  54. }
  55. $auth = Auth::where('identifier', $appid)->where('credential', $data['openid'])->first();
  56. $is_auth = true;
  57. if (!$auth) {
  58. //注册用户
  59. $userInfo = $this->userRepository->getRandomUserInfo();
  60. $userInfo['register_source'] = User::REGISTER_SOURCE_WEAPP;
  61. $user = User::create($userInfo);
  62. //添加邀请注册活动
  63. if ((int)$invite_user_id != 0) {
  64. $inviteNewUserRepository->create($invite_user_id, $user->id);
  65. }
  66. //注册认证信息
  67. $attributes['type'] = Auth::TYPE_WEAPP;
  68. $attributes['identifier'] = $appid;
  69. $attributes['credential'] = $data['openid'];
  70. $attributes['user_id'] = $user->id;
  71. $attributes['is_verified'] = Auth::VERIFIED_OK;
  72. Auth::create($attributes);
  73. $is_auth = false;
  74. $auth = Auth::where('identifier', $appid)->where('credential', $data['openid'])->first();
  75. } else {
  76. $user = $this->userRepository->byIdGetModel($auth->user_id);
  77. }
  78. $phone_detail = $request->get('phone_detail') ?? '';
  79. if (!empty($phone_detail)) {
  80. $detail = json_decode($phone_detail);
  81. if (!empty($detail)) {
  82. UserPhoneDetail::Log($detail, $user->id);
  83. }
  84. }
  85. $token = JWTAuth::fromUser($user);
  86. // 单机登录限制
  87. app()->redis->hset(CacheMap::SINGLE_LOGIN_API, $user->id, $token);
  88. Cache::put('login:user:session_key:auth:' . $user->id, $data['session_key'], 1440);
  89. return $this->response->array([
  90. 'is_auth' => $is_auth,
  91. 'token' => 'Bearer ' . $token,
  92. 'session_key' => '',
  93. 'exp' => Carbon::now()->addMinute(JWTAuth::factory()->getTTL())->getTimestamp(),
  94. 'auth_id' => $auth->id,
  95. 'user' => $is_auth ? $user : [],
  96. 'android_mini_version' => $configRepository->getMiniAndroidVersion(),
  97. 'ios_mini_version' => $configRepository->getMiniIosVersion(),
  98. ]);
  99. } catch (\Exception $exception) {
  100. return $this->errorNoValidation($exception->getMessage());
  101. }
  102. }
  103. /**
  104. * mobileLogin 手机号登录
  105. *
  106. * @param MobileLoginRequest $request
  107. * @param ConfigRepository $configRepository
  108. * @return void
  109. * @author Fx
  110. *
  111. */
  112. public function mobileLogin(MobileLoginRequest $request, ConfigRepository $configRepository)
  113. {
  114. try {
  115. $mobile = $request->get('mobile');
  116. $code = $request->get('code');
  117. $v_code = Cache::get("verification_code_{$mobile}", '');
  118. if (empty($v_code)) {
  119. return $this->errorNoValidation('验证码已过期');
  120. }
  121. if ((string)$v_code !== (string)$code) {
  122. return $this->errorNoValidation('验证码错误');
  123. }
  124. $user = User::query()->where('mobile', $mobile)->first();
  125. $is_auth = true;
  126. if (empty($user)) {
  127. return $this->errorNoValidation('找不到该用户,或用户没有绑定此手机号');
  128. }
  129. //注册认证信息
  130. $auth = Auth::query()->where('user_id', $user->id)->first();
  131. if (!$auth) {
  132. $is_auth = false;
  133. }
  134. $phone_detail = $request->get('phone_detail') ?? '';
  135. if (!empty($phone_detail)) {
  136. $detail = json_decode($phone_detail);
  137. if (!empty($detail)) {
  138. UserPhoneDetail::Log($detail, $user->id);
  139. }
  140. }
  141. $token = JWTAuth::fromUser($user);
  142. // 单机登录限制
  143. app()->redis->hset(CacheMap::SINGLE_LOGIN_API, $user->id, $token);
  144. return $this->response->array([
  145. 'token' => 'Bearer ' . $token,
  146. 'exp' => Carbon::now()->addMinute(JWTAuth::factory()->getTTL())->getTimestamp(),
  147. 'auth_id' => $auth->id ?? '',
  148. 'user' => $is_auth ? $user : [],
  149. 'android_mini_version' => $configRepository->getMiniAndroidVersion(),
  150. 'ios_mini_version' => $configRepository->getMiniIosVersion(),
  151. ]);
  152. } catch (\Exception $exception) {
  153. return $this->errorNoValidation($exception->getMessage());
  154. }
  155. }
  156. /**
  157. * 更新用户基本信息
  158. * User: Mead
  159. */
  160. public function weappUserInfoSync(WeappUserinfoRequest $request)
  161. {
  162. try {
  163. $this->user->fill([
  164. 'nickname' => $request->get('nickName'),
  165. 'gender' => $request->get('gender', 0),
  166. 'country' => $request->get('country', null),
  167. 'province' => $request->get('province', null),
  168. 'city' => $request->get('city', null),
  169. 'avatar' => $request->get('avatarUrl', null) ?? "http://resource.weilaigo.l4j.cn/avatarUrlDefault.jpeg",
  170. 'language' => $request->get('language', 'zh_CN'),
  171. 'register_area_id' => $request->get('area_id', 0),
  172. 'is_register' => User::REGISTER_OK
  173. ]);
  174. $this->user->save();
  175. return $this->response->item($this->user, UserTransformer::class);
  176. } catch (\Exception $exception) {
  177. $this->response->error($exception->getMessage(), 401);
  178. }
  179. }
  180. /**
  181. * 获取当前登录用户
  182. * @return \Dingo\Api\Http\Response
  183. * User: Mead
  184. */
  185. public function loginUser()
  186. {
  187. try {
  188. return $this->response->item($this->user, UserTransformer::class);
  189. } catch (\Exception $exception) {
  190. return $this->errorNoValidation($exception->getMessage());
  191. }
  192. }
  193. }