Beispiel #1
0
 /**
  * 获取微信用户信息,此方法会跳转到微信授权页面获取用户授权然后返回
  * 在ajax中调用本方法,无效
  *
  * @param bool|false $openidOnly 此参数为true时,仅返回openid 响应速度会更快,并且不需要用户点击同意授权
  * @return array
  * @throws WechatException
  */
 public static function getUser($openidOnly = false)
 {
     $flashKey = md5(__FILE__) . 'oAuthAuthState';
     //从微信oAuth页面跳转回来
     if (Session::hasFlash($flashKey)) {
         $flashData = @unserialize(Session::getFlash($flashKey));
         if (is_array($flashData) && time() - $flashData[0] < 60 && isset($_GET['state']) && $_GET['state'] === $flashData[1]) {
             if (!isset($_GET['state'])) {
                 throw new WechatException('微信网页授权失败');
             }
             //通过code换取网页授权access_token
             $OauthAccessTokenArr = self::getOauthAccessToken($_GET['code']);
             if ($openidOnly) {
                 return $OauthAccessTokenArr;
             }
             //拉取用户信息(需scope为 snsapi_userinfo)
             return self::getOauthUserInfo($OauthAccessTokenArr['openid'], $OauthAccessTokenArr['access_token']);
         }
     }
     //当前url
     $uri = (isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) !== 'off' ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
     //跳转到微信oAuth授权页面
     $state = uniqid();
     Session::setFlash($flashKey, serialize(array(time(), $state)));
     self::redirect($uri, $state, $openidOnly ? 'snsapi_base' : 'snsapi_userinfo');
 }