这个只是针对你需要操作微信上的管理功能的时候才用到的,像一般的聊天啥的是没必要获取的,一般只有微信平台的管理后台才会用到这个,一般是在获取第一次之后记录下来防止每次操作都会去获取一次导致当天的API调用次数消耗完毕。

解决方案 »

  1.   

    我说的是:微信的网页授权获取用户基本信息;不是微信基础功能接口。。大概流程是这样的:
    1.构造URL地址:
    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirectREDIRECT_URI是我自己的网页地址。用户直接访问的是上面的地址,再回调REDIRECT_URI地址,并带参数CODE;这里并没有用户的openid2.
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=APPSECRET&code=CODE&grant_type=authorization_code
    根据CODE获取access_token,在这里会返回:
    {
       "access_token":"ACCESS_TOKEN",
       "expires_in":7200,
       "refresh_token":"REFRESH_TOKEN",
       "openid":"OPENID",
       "scope":"SCOPE"
    }
    在这一步才有openid,也就是当前访问我这个页面的微信用户的openid
    3.
    根据openid获取微信用户资料而问题就在第二步。
    我保存access_token,那下一次我不是应该跳过第二步?跳过的话,那我又如何得到openid?没有openid我就不能进行第三步。。如果不存储access_token,那么每一次微信用户访问网页都要获取一次access_token。太频繁了。。
      

  2.   

    用户的openid保存到数据库,与用户进行绑定
    access_token每获取一次,保存到数据库,在使用之前,首先查数据库的access_token有没有过期,二小时过期,过期重新获取再保存,access_token有访问限制的,如果你不停的获取,最终没法提供服务
      

  3.   


    这个明白。。
    但微信的网页授权里,要获取到用户的openid只有通过获取token那一步同时返回。。也就是获取token的时候同时返回token和当前访问网页的微信用户的openid。。这一点上和基础接口里不一样。基础接口里,用户每操作一次都可以获取到用户的openid。。
    {
       "access_token":"ACCESS_TOKEN",
       "expires_in":7200,
       "refresh_token":"REFRESH_TOKEN",
       "openid":"OPENID",//当前访问网页的微信用户的openid
       "scope":"SCOPE"
    }
    可是没有用户的openid,我即使有token也无法获取到这个用户的用户信息。。<?php
    require_once("weixin.config.php");
    class Webweixin
    {
    //APPID 默认是服务号
    var $APPID = APPID1;
    var $APPSECRET = APPSECRET1;

    //用户方信息(存储当前交互用户的操作状态,以及状态时效)
    var $_client = array('wx_id'=>'', 'user_id'=>0, 'act'=>'', 'exp'=>0, 'token'=>'','userdata'=>'');
    var $wxu_mod;
    var $CODE = '';

        function __construct()
        {
    $this->APPID = APPID1;
    $this->APPSECRET = APPSECRET1;

    if (isset($_GET['code']))
    {
    $this->CODE =  $_GET['code'];
    $userinfo = $this->getUserInfo();
    dump($userinfo);
    }
        }

    public function getUserInfo()
    {
    $accessToken = $this->getAccessToken();

    $cfg['ssl'] = true;
    //https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
    $userinfo = $this->__curlOpen("https://api.weixin.qq.com/sns/userinfo?access_token=".$accessToken."&openid=".$this->_client['wx_id'].'&lang=zh_CN', $cfg);
    $userinfo = json_decode($userinfo,true);
    return $userinfo;
    }

    /**
     * 获取ACCESS TOKEN
     */
    public function getAccessToken($getHTTP = false)
    {
    $isCurl = true;
    /*
    $tokenfile = ROOT_PATH . "/temp/TOKEN_WEB";
    $token = file_exists($tokenfile)?file_get_contents($tokenfile):'';
    if($token)
    {
    $token = json_decode($token,true);
    if( time()-$token['access_time'] < $token['expires_in']){
    $isCurl = false;
    }
    }*/
            if($isCurl || $getHTTP)
    {
    //https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
    $cfg['ssl'] = true;
    $token = $this->__curlOpen("https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->APPID."&secret=".$this->APPSECRET."&code=".$this->CODE."&grant_type=authorization_code", $cfg);
    $token = json_decode($token,true);
    $token['access_time'] = time();
    //file_put_contents($tokenfile, json_encode($token), LOCK_EX);
    }

    $this->_client['wx_id'] = $token['openid'];
    $client = $this->wx_user();
    if($client){
    $this->_client = $client;
    }else{
    $this->wx_user('add');
    }
    return $token['access_token'];
    }
        

    public function __curlOpen($url, $cfg)
    {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    isset($cfg['post']) && curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
    if($cfg['ssl'])
    {
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    }
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)');
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    isset($cfg['post']) && curl_setopt($ch, CURLOPT_POSTFIELDS, $cfg['post']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

    $result = curl_exec($ch);
    if (curl_errno($ch))
    {
    return curl_error($ch);
    }
    curl_close($ch);
    return $result;
    }

    //微信用户信息操作
    public function wx_user($act='')
        {
    if($this->_client['wx_id'])
    {
    $this->wxu_mod = &m("weixinuser");
    if($act=='add')
    {
    $this->wxu_mod->add($this->_client);
    }elseif($act=='edit'){
    $this->wxu_mod->edit("wx_id='".$this->_client['wx_id']."'", $this->_client);
    }else{
    $client = $this->wxu_mod->get("wx_id='".$this->_client['wx_id']."'");
    return $client;
    }
    }
    }
    /*$scope : snsapi_base / snsapi_userinfo*/
    public function makeStartUrl($url, $state = '', $scope = 'snsapi_userinfo')
    {
    //https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
    $base_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={$this->APPID}&redirect_uri=";
    $base_url .= rawurlencode($url);
    $base_url .= "&response_type=code&scope={$scope}&state={$state}#wechat_redirect";

    return $base_url;
    }
    }
    ?>
      

  4.   

    也就是说要得到当前访问网页的微信用户的openid,就要先获取token,才能得到当前访问网页的微信用户的openid。
    而这样,就每次都要去获取token。我保存下来也就没有意义了。。
    详见:
    http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
      

  5.   

    或者说是不是第一次获取到token和openid以后,把它们存起来。
    再把用户的openid存到cookie里。。
    下一次直接读cookie里的openid,和存储的openid对应的token,(相当于跳过获取token那一步),直接去获取用户信息??但这样的话,如果客户端不支持cookie,结果就还是一样了。
      

  6.   

    做微信活动。。
    这个不需要登陆,只需要每个访问网页的微信用户的openid,就可以了
      

  7.   

    貌似获取网页授权access_token这个是没有限制连接次数的,那么刷新还有什么意义?
      

  8.   

    这里涉及到网页授权的作用域的区别,当作用域是snsapi_userinfo,才有access_token接口调用凭证超时时间的限制,这时候才会用到access_token。
    这个token会有一个时间限制。当是snsapi_base时,则没有限制,也就是说这个时候,access_token是用不上的。
    这时候是不可能拿着这个token去获取用户信息的,肯定获取不到。这个地方可能是微信接口里为了省事,重用了。
      

  9.   

    同理 想不通这个问题 求解答 到底怎么保存这个accesstoken