Wxbase.php 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. <?php
  2. namespace app\index\controller;
  3. use app\BaseController;
  4. use app\model\User;
  5. use wx\offiaccount\User as OffiaccountUser;
  6. class Wxbase extends BaseController
  7. {
  8. protected $user;
  9. public function initialize()
  10. {
  11. /** 网页授权 */
  12. $code = input('code');
  13. $this->user = session('user');
  14. $appid = config('app.official_appid');
  15. $wxUser = new OffiaccountUser();
  16. $request = request();
  17. $param = $request->param();
  18. if (!isset($param['r']) || !is_numeric($param['r'])) {
  19. echo '页面不存在';
  20. exit;
  21. }
  22. $get = $request->get();
  23. if (isset($get['code'])) unset($get['code']);
  24. $redirectUrl = url($request->baseUrl(), $get, false, true);
  25. // 判断是否需要网页授权
  26. if (empty($code) && empty($this->user)) {
  27. // 参数中剔除code值,防止重复获取
  28. $wxUser->redirectForCode($appid, $redirectUrl);
  29. }
  30. // 网页授权获取用户信息
  31. if (!empty($code)) {
  32. // 获取网页授权获取access_token
  33. $data = $wxUser->getAccessTokenByCode($appid, config('app.official_secret'), $code);
  34. if (isset($data['errcode']) && in_array($data['errcode'], [40029, 40163, 41008, 42003])) { // code已经被使用
  35. $wxUser->redirectForCode($appid, $redirectUrl);
  36. } elseif (isset($data['errcode'])) {
  37. trace('授权获取用户信息', 'error');
  38. trace($data, 'error');
  39. echo $data['errmsg'];
  40. exit;
  41. }
  42. // 查询用户信息是否存在
  43. $user = User::where([['openid', '=', $data['openid']], ['root_id', '=', $param['r']]])->findOrEmpty();
  44. if ($user->isEmpty() || empty($user->unionid)) {
  45. $userInfo = $wxUser->getH5UserInfo($data['access_token'], $data['openid']);
  46. if (isset($userInfo['errcode'])) {
  47. trace('拉取用户信息', 'error');
  48. trace($data, 'error');
  49. echo '请求失败';
  50. exit;
  51. }
  52. $user->save([
  53. 'nickname' => $userInfo['nickname'],
  54. 'sex' => $userInfo['sex'],
  55. 'headimgurl' => $userInfo['headimgurl'],
  56. 'province' => $userInfo['province'],
  57. 'city' => $userInfo['city'],
  58. 'country' => $userInfo['country'],
  59. 'openid' => $userInfo['openid'],
  60. 'unionid' => $userInfo['unionid'] ?? '',
  61. 'root_id' => $param['r']
  62. ]);
  63. }
  64. $this->user = $user->toArray();
  65. session('user', $this->user);
  66. session('openid', $data['openid']);
  67. trace($redirectUrl, 'log');
  68. // header('location:' . $redirectUrl);
  69. // exit;
  70. }
  71. }
  72. }