oauth2擷取使用者資訊的整個流程都走通了。也沒有問題。。
不過中間有一事不明。希望哪位知道的朋友幫解答下。。
每一次都要通過code去擷取access_token嗎?
不的話,那麼使用者的openid又只能在擷取access_token時返回,不然就得不到使用者的openid了。
或者是第一次擷取到使用者的openid以後存到cookie裡去,下次讀cookie嗎???
否則那個重新整理access_token有什麼意義啊。。。
再有就是擷取到的access_token是只是當前會話有效,還是對應某個使用者openid有效,或者是所有使用者都有效。。。
初次接觸這個,謝謝。。。。。
回複討論(解決方案)
這個只是針對你需要操作上的管理功能的時候才用到的,像一般的聊天啥的是沒必要擷取的,一般只有平台的管理後台才會用到這個,一般是在擷取第一次之後記錄下來防止每次操作都會去擷取一次導致當天的API調用次數消耗完畢。
這個只是針對你需要操作上的管理功能的時候才用到的,像一般的聊天啥的是沒必要擷取的,一般只有平台的管理後台才會用到這個,一般是在擷取第一次之後記錄下來防止每次操作都會去擷取一次導致當天的API調用次數消耗完畢。
我說的是:的網頁授權擷取使用者基本資料;不是基礎功能介面。。
大概流程是這樣的:
1.構造URL地址:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
REDIRECT_URI是我自己的網頁地址。使用者直接存取的是上面的地址,再回調REDIRECT_URI地址,並帶參數CODE;這裡並沒有使用者的openid
2.
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。太頻繁了。。
沒有做過這個的嗎?
使用者的openid儲存到資料庫,與使用者進行綁定
access_token每擷取一次,儲存到資料庫,在使用之前,首先查資料庫的access_token有沒有到期,二小時到期,到期重新擷取再儲存,
access_token有訪問限制的,如果你不停的擷取,最終沒法提供服務
使用者的openid儲存到資料庫,與使用者進行綁定
access_token每擷取一次,儲存到資料庫,在使用之前,首先查資料庫的access_token有沒有到期,二小時到期,到期重新擷取再儲存,
access_token有訪問限制的,如果你不停的擷取,最終沒法提供服務
這個明白。。
但的網頁授權裡,要擷取到使用者的openid只有通過擷取token那一步同時返回。。也就是擷取token的時候同時返回token和當前訪問網頁的使用者的openid。。這一點上和基礎介面裡不一樣。基礎介面裡,使用者每操作一次都可以擷取到使用者的openid。。
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",//當前訪問網頁的使用者的openid
"scope":"SCOPE"
}
可是沒有使用者的openid,我即使有token也無法擷取到這個使用者的使用者資訊。。
'', '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;}}?>
也就是說要得到當前訪問網頁的使用者的openid,就要先擷取token,才能得到當前訪問網頁的使用者的openid。
而這樣,就每次都要去擷取token。我儲存下來也就沒有意義了。。
詳見:
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
或者說是不是第一次擷取到token和openid以後,把它們存起來。
再把使用者的openid存到cookie裡。。
下一次直接讀cookie裡的openid,和儲存的openid對應的token,(相當於跳過擷取token那一步),直接去擷取使用者資訊??
但這樣的話,如果用戶端不支援cookie,結果就還是一樣了。。。。
你是建立於什麼目的需要進行使用者統計的,如果只是為了第三方登入那你只要按照的第三方登入文檔進行操作即可,如果你是想進行後台使用者同步,那你就需要一個公眾號啊。
做活動。。
這個不需要登陸,只需要每個訪問網頁的使用者的openid,就可以了
沒戲了。。。。哎