这个明白。。 但微信的网页授权里,要获取到用户的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;
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。太频繁了。。
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也无法获取到这个用户的用户信息。。<?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;
}
}
?>
而这样,就每次都要去获取token。我保存下来也就没有意义了。。
详见:
http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
再把用户的openid存到cookie里。。
下一次直接读cookie里的openid,和存储的openid对应的token,(相当于跳过获取token那一步),直接去获取用户信息??但这样的话,如果客户端不支持cookie,结果就还是一样了。
这个不需要登陆,只需要每个访问网页的微信用户的openid,就可以了
这个token会有一个时间限制。当是snsapi_base时,则没有限制,也就是说这个时候,access_token是用不上的。
这时候是不可能拿着这个token去获取用户信息的,肯定获取不到。这个地方可能是微信接口里为了省事,重用了。