url = $this->request->url(true); // 网页授权,并获粉丝信息 $this->assign('jsSign', load_wechat('script')->getJsSign($this->url)); } /** * 微信网页授权 * @param bool $fullMode 获取完整 * @return string */ protected function oAuth($fullMode = true) { // 本地开发调试用户 openid if (in_array($this->request->host(), ['127.0.0.1', 'localhost'])) { session('openid', 'o38gps3vNdCqaggFfrBRCRikwlWY'); } // 检查缓存中 openid 信息是否完整 if (($this->openid = session('openid'))) { if (!$fullMode) { return $this->openid; } $this->fansinfo = WechatService::getFansInfo($this->openid); if (!empty($this->fansinfo) && $this->fansinfo['expires_in'] > time()) { $this->assign('fansinfo', $this->fansinfo); return $this->openid; } } // 发起微信网页授权 $wxoauth_url = $this->url; if (!($redirect_url = $this->request->get('redirectcode', false, 'decode'))) { $split = stripos($this->url, '?') === false ? '?' : '&'; $wxoauth_url = "{$this->url}{$split}redirectcode=" . encode($this->url); } $wechat = &load_wechat('Oauth'); // 微信网页授权处理 if (!$this->request->get('code', false)) { $this->redirect($wechat->getOauthRedirect($wxoauth_url, 'webOauth', 'snsapi_base')); } if (FALSE === ($result = $wechat->getOauthAccessToken()) || empty($result['openid'])) { Log::error("微信网页授权失败,{$wechat->errMsg}[{$wechat->errCode}]"); exit("微信网页授权失败,{$wechat->errMsg}[{$wechat->errCode}]"); } session('openid', $this->openid = $result['openid']); !$fullMode && $this->redirect($redirect_url); // 微信粉丝信息处理 $this->fansinfo = WechatService::getFansInfo($this->openid); if (empty($this->fansinfo['expires_in']) || $this->fansinfo['expires_in'] < time()) { /* 使用普通授权,获取用户资料;未关注时重新使用高级授权 */ if ($result['scope'] === 'snsapi_base') { $user = load_wechat('User')->getUserInfo($this->openid); if (empty($user['subscribe'])) { $this->redirect($wechat->getOauthRedirect($wxoauth_url, 'webOauth', 'snsapi_userinfo')); } } /* 使用高级授权,获取用户资料 */ elseif ($result['scope'] === 'snsapi_userinfo') { $user = $wechat->getOauthUserinfo($result['access_token'], $this->openid); } if ((empty($user) || !array_key_exists('nickname', $user))) { Log::error("微信网页授权获取用户信息失败,{$wechat->errMsg}[{$wechat->errCode}]"); exit("微信网页授权获取用户信息失败,{$wechat->errMsg}[{$wechat->errCode}]"); } /* 更新粉丝信息 */ $user['expires_in'] = $result['expires_in'] + time() - 100; $user['refresh_token'] = $result['refresh_token']; $user['access_token'] = $result['access_token']; if (!WechatService::setFansInfo($user, $wechat->appid)) { exit('微信网页授权获取用户信息保存失败'); } } $this->redirect($redirect_url); } }