链街Dcat后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

57 lines
1.9 KiB

  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\v3\User;
  4. use Closure;
  5. use EasyWeChat\Factory;
  6. use Exception;
  7. use Illuminate\Http\Request;
  8. class WechatAuth
  9. {
  10. /**
  11. * Handle an incoming request.
  12. *
  13. * @param Request $request
  14. * @param Closure $next
  15. * @return mixed
  16. * @throws Exception
  17. */
  18. public function handle(Request $request, Closure $next)
  19. {
  20. try {
  21. $sessionKey = 'wechat_user';
  22. $user = $request->session()->get($sessionKey);
  23. if (!$user) {
  24. $config = config('wechat.official_account.default');
  25. $app = Factory::officialAccount($config);
  26. $code = $request->input('code');
  27. if (empty($code)) {
  28. return $app->oauth->scopes(['snsapi_userinfo'])->redirect($request->url());
  29. } else {
  30. $wechatUser = $app->oauth->user();
  31. if (empty($wechatUser['id'])) {
  32. throw new \Exception('获取用户信息失败');
  33. } else if (empty($wechatUser->original['unionid'])) {
  34. # TODO 调试unionid
  35. if (config('app.debug') && $request->server('REMOTE_ADDR') == '127.0.0.1') {
  36. $wechatUser['unionid'] = 'onhl355f-ofX5e0-4I4vn0bswVPM';
  37. } else
  38. throw new Exception('获取UnionId失败');
  39. }
  40. }
  41. $user = User::where('unionid', $wechatUser->original['unionid'])->first();
  42. if (!$user) {
  43. throw new Exception('您的账号未在小程序上登录过,获取用户信息失败');
  44. }
  45. $request->session()->put($sessionKey, $user);
  46. }
  47. } catch (\Exception $exception) {
  48. return response($exception->getMessage());
  49. }
  50. return $next($request);
  51. }
  52. }