AuthController.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. <?php
  2. namespace App\Http\Controllers\V1;
  3. use App\Http\Controllers\Controller;
  4. use App\Http\Requests\WeappAuthorizationRequest;
  5. use App\Http\Requests\WeappUserinfoRequest;
  6. use App\Models\Auth;
  7. use App\Models\User;
  8. use App\Models\UserPhoneDetail;
  9. use App\Repositories\ConfigRepository;
  10. use App\Repositories\InviteNewUserRepository;
  11. use App\Repositories\UserRepository;
  12. use App\Transformers\UserTransformer;
  13. use Carbon\Carbon;
  14. use Tymon\JWTAuth\Facades\JWTAuth;
  15. /**
  16. * 小程序权限认证模块
  17. * Class AuthController
  18. * @package App\Http\Controllers\V1
  19. */
  20. class AuthController extends Controller
  21. {
  22. protected $jwt;
  23. protected $userRepository;
  24. /**
  25. * Create a new controller instance.
  26. *
  27. * @return void
  28. */
  29. public function __construct(JWTAuth $jwt, UserRepository $userRepository)
  30. {
  31. $this->jwt = $jwt;
  32. $this->userRepository = $userRepository;
  33. }
  34. /**
  35. * 小程序认证
  36. * @param WeappAuthorizationRequest $request
  37. * User: Mead
  38. */
  39. public function weappLogin(WeappAuthorizationRequest $request, ConfigRepository $configRepository, InviteNewUserRepository $inviteNewUserRepository)
  40. {
  41. try {
  42. $code = $request->code;
  43. $appid = $request->appid;
  44. $invite_user_id = $request->get('invite_user_id') ?? 0;
  45. $miniProgram = app('wechat.mini_program');
  46. $data = $miniProgram->auth->session($code);
  47. if (isset($data['errcode'])) {
  48. $this->response->errorUnauthorized('code 不正确');
  49. return '';
  50. }
  51. $auth = Auth::where('identifier', $appid)->where('credential', $data['openid'])->first();
  52. $is_auth = true;
  53. if (!$auth) {
  54. //注册用户
  55. $userInfo = $this->userRepository->getRandomUserInfo();
  56. $userInfo['register_source'] = User::REGISTER_SOURCE_WEAPP;
  57. $user = User::create($userInfo);
  58. //添加邀请注册活动
  59. if ((int)$invite_user_id != 0) {
  60. $inviteNewUserRepository->create($invite_user_id, $user->id);
  61. }
  62. //注册认证信息
  63. $attributes['type'] = Auth::TYPE_WEAPP;
  64. $attributes['identifier'] = $appid;
  65. $attributes['credential'] = $data['openid'];
  66. $attributes['user_id'] = $user->id;
  67. $attributes['is_verified'] = Auth::VERIFIED_OK;
  68. Auth::create($attributes);
  69. $is_auth = false;
  70. } else {
  71. $user = $this->userRepository->byIdGetModel($auth->user_id);
  72. }
  73. $phone_detail = $request->get('phone_detail') ?? '';
  74. if (!empty($phone_detail)) {
  75. $detail = json_decode($phone_detail);
  76. if (!empty($detail)) {
  77. UserPhoneDetail::Log($detail, $user->id);
  78. }
  79. }
  80. $token = JWTAuth::fromUser($user);
  81. return $this->response->array([
  82. 'is_auth' => $is_auth,
  83. 'token' => 'Bearer ' . $token,
  84. 'session_key' => $data['session_key'],
  85. 'exp' => Carbon::now()->addMinute(JWTAuth::factory()->getTTL())->getTimestamp(),
  86. 'auth_id' => $auth->id,
  87. 'user' => $is_auth ? $user : [],
  88. 'android_mini_version' => $configRepository->getMiniAndroidVersion(),
  89. 'ios_mini_version' => $configRepository->getMiniIosVersion(),
  90. 'invite_user_id' => $invite_user_id, // 测试
  91. ]);
  92. } catch (\Exception $exception) {
  93. return $this->errorNoValidation($exception->getMessage());
  94. }
  95. }
  96. /**
  97. * 更新用户基本信息
  98. * User: Mead
  99. */
  100. public function weappUserInfoSync(WeappUserinfoRequest $request)
  101. {
  102. try {
  103. $this->user->fill([
  104. 'nickname' => $request->get('nickName'),
  105. 'gender' => $request->get('gender', 0),
  106. 'country' => $request->get('country', ''),
  107. 'province' => $request->get('province', ''),
  108. 'city' => $request->get('city', ''),
  109. 'avatar' => $request->get('avatarUrl'),
  110. 'language' => $request->get('language', 'zh_CN'),
  111. 'register_area_id' => $request->get('area_id', 0),
  112. 'is_register' => User::REGISTER_OK
  113. ]);
  114. $this->user->save();
  115. return $this->response->item($this->user, UserTransformer::class);
  116. } catch (\Exception $exception) {
  117. $this->response->error($exception->getMessage(), 401);
  118. }
  119. }
  120. /**
  121. * 获取当前登录用户
  122. * @return \Dingo\Api\Http\Response
  123. * User: Mead
  124. */
  125. public function loginUser()
  126. {
  127. try {
  128. return $this->response->item($this->user, UserTransformer::class);
  129. } catch (\Exception $exception) {
  130. return $this->errorNoValidation($exception->getMessage());
  131. }
  132. }
  133. }