WechatAuthenticatedService.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. /**
  3. * @Name
  4. * @Description
  5. * @Author 刘学玺
  6. * @Date 2024/3/25 17:00
  7. */
  8. namespace App\Http\Services\Frontend\Client\Auth;
  9. use App\Exceptions\ApiException;
  10. use App\Http\Services\Frontend\Client\Common\AuthService;
  11. use App\Http\Services\Frontend\Client\Common\SmsService;
  12. use App\Http\Services\Service;
  13. use App\Models\Member\User;
  14. use App\Models\WechatUser;
  15. use EasyWeChat\Kernel\Exceptions\InvalidArgumentException;
  16. use Illuminate\Http\JsonResponse;
  17. use Illuminate\Http\Response;
  18. use Illuminate\Support\Facades\DB;
  19. use Overtrue\LaravelWeChat\EasyWeChat;
  20. class WechatAuthenticatedService extends Service
  21. {
  22. /**
  23. * @throws InvalidArgumentException
  24. */
  25. public function oauth($data): array
  26. {
  27. $wechat = EasyWeChat::officialAccount();
  28. $oauth = $wechat->getOAuth();
  29. $scopes = $data['scopes'] ?: 'snsapi_base';
  30. //callback_url 是授权回调的URL
  31. //生成完整的授权URL
  32. $redirectUrl = $oauth->scopes([$scopes])->redirect($data['redirect_url']);
  33. return ['redirectUrl' => $redirectUrl];
  34. }
  35. /**
  36. * @throws InvalidArgumentException
  37. */
  38. public function callback(array $params): array
  39. {
  40. $wechat = EasyWeChat::officialAccount();
  41. $oauth = $wechat->getOAuth();
  42. // 获取 OAuth 授权用户信息
  43. $wechat_user = $oauth->userFromCode($params['code']);
  44. //$wechat_user = $user->toArray();
  45. $data = [
  46. 'openid' => $wechat_user->getId() ?? $wechat_user->getTokenResponse()['openid'],
  47. 'bindUser' => true
  48. ];
  49. $avatar = $wechat_user->getAvatar();
  50. $avatar && ($data['avatar'] = $avatar);
  51. $nickname = $wechat_user->getNickname();
  52. $nickname && ($data['nickname'] = $nickname);
  53. $userIsExists = User::query()->where('openid', $data['openid'])->exists();
  54. if (!$userIsExists) {
  55. // $user_id = User::query()->create($data)->id;
  56. // $user = User::query()->find($user_id);
  57. $data['bindUser'] = false;
  58. }
  59. // $isExits = $this->hasOpenID($data['openid']);
  60. // 是否已存在
  61. // !$isExits && $this->create($data);
  62. // $wechatUser = WechatUser::query()->with('user.info')->where('openid', $data['openid'])->first();
  63. // return $this->success('', ['wechatUser' => $wechatUser->toArray()]);
  64. return $data;
  65. }
  66. private function hasOpenID($openId): bool
  67. {
  68. return false;
  69. // return WechatUser::query()->where('openid', $openId)->exists();
  70. }
  71. /**
  72. * @throws ApiException
  73. */
  74. public function bind(array $params): void
  75. {
  76. $mobile = $params['mobile'];
  77. $code = $params['code'];
  78. $openid = $params['open_id'];
  79. // 验证验证码
  80. $verifyCodeResult = (new SmsService())->verifyCode($mobile, $code);
  81. !$verifyCodeResult && self::error('验证码错误!', 400);
  82. // 获取微信信息
  83. // $data = [
  84. // 'openid' => $params['openid'],
  85. // 'avatar' => $params['avatar'],
  86. // 'nickname' => $params['nickname'],
  87. // ];
  88. $register_ip = request()->getClientIp();
  89. // 获取绑定用户
  90. User::query()->updateOrCreate(['openid' => $openid], ['openid' => $openid, 'mobile' => $mobile, 'register_ip' => $register_ip]);
  91. }
  92. /**
  93. * @throws ApiException
  94. */
  95. public function store($data): array
  96. {
  97. // 公众号OpenID
  98. $openID = $data['open_id'];
  99. $autoRegister = $data['auto_register'] ?? 0;
  100. $user = User::query()->where('open_id', $openID)->first();
  101. if (!$user && $autoRegister) {
  102. // 获取微信信息
  103. // 创建用户信息
  104. $user_id = User::query()->create(['openid' => $openID])->id;
  105. $user = User::query()->find($user_id);
  106. }
  107. $token = (new AuthService)->store($user);
  108. return ['token' => $token];
  109. }
  110. public function create1($data): Response
  111. {
  112. // 判断验证码
  113. (new SmsService())->verify($data['mobile'], $data['code']);
  114. $where = ['mobile' => $data['mobile'], 'type' => 0];
  115. $exists = User::query()->where($where)->exists();
  116. if (!$exists) User::query()->create($where);
  117. // 绑定公众号
  118. $user = User::query()->where($where)->first();
  119. $user->open_id = $data['open_id'];
  120. $user->save();
  121. return (new AuthService)->store($user);
  122. }
  123. // 发送短信
  124. public function send($data): Response
  125. {
  126. $mobile = $data['mobile'];
  127. $sms = new SmsService();
  128. return $sms->send($mobile, 0, 2);
  129. }
  130. }