如果用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進而實現業務邏輯。
關于網頁授權回調域名的說明
1、在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權回調域名。請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加http://等協議頭;2、授權回調域名配置規范為全域名,比如需要網頁授權的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html、http://www.qq.com/login.html都可以進行OAuth2.0鑒權。但http://pay.qq.com、http://music.qq.com、http://qq.com無法進行OAuth2.0鑒權3、如果公眾號登錄授權給了第三方開發者來進行管理,則不必做任何設置,由第三方代替公眾號實現網頁授權即可
關于網頁授權的兩種scope的區別說明
1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,并且是靜默授權并自動跳轉到回調頁的。用戶感知的就是直接進入了回調頁(往往是業務頁面)
2、以snsapi_userinfo為scope發起的網頁授權,是用來獲取用戶的基本信息的。但這種授權需要用戶手動同意,并且由于用戶同意過,所以無須關注,就可在授權后獲取該用戶的基本信息。
3、用戶管理類接口中的“獲取用戶基本信息接口”,是在用戶和公眾號產生消息交互或關注后事件推送后,才能根據用戶OpenID來獲取用戶基本信息。這個接口,包括其他微信接口,都是需要該用戶(即openid)關注了公眾號后,才能調用成功的。
關于網頁授權access_token和普通access_token的區別
1、微信網頁授權是通過OAuth2.0機制實現的,在用戶授權給公眾號后,公眾號可以獲取到一個網頁授權特有的接口調用憑證(網頁授權access_token),通過網頁授權access_token可以進行授權后接口調用,如獲取用戶基本信息;2、其他微信接口,需要通過基礎支持中的“獲取access_token”接口來獲取到的普通access_token調用。
關于UnionID機制
1、請注意,網頁授權獲取用戶基本信息也遵循UnionID機制。即如果開發者有在多個公眾號,或在公眾號、移動應用之間統一用戶帳號的需求,需要前往微信開放平臺(open.weixin.qq.com)綁定公眾號后,才可利用UnionID機制來滿足上述需求。
2、UnionID機制的作用說明:如果開發者擁有多個移動應用、網站應用和公眾帳號,可通過獲取用戶基本信息中的unionid來區分用戶的唯一性,因為同一用戶,對同一個微信開放平臺下的不同應用(移動應用、網站應用和公眾帳號),unionid是相同的。
關于特殊場景下的靜默授權
1、上面已經提到,對于以snsapi_base為scope的網頁授權,就靜默授權的,用戶無感知;
2、對于已關注公眾號的用戶,如果用戶從公眾號的會話或者自定義菜單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,用戶無感知。
具體而言,網頁授權流程分為四步:
1、引導用戶進入授權頁面同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支持中的access_token不同)
3、如果需要,開發者可以刷新網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取用戶基本信息(支持UnionID機制)
實例代碼:
if (isset($_GET['code'])) {
//開始第二步
$res = getAccessToken($_GET['code']);
//------ 檢測accesstoken是否有效
if (! checkAccessToken($res['access_token'], $res['openid'])) {
echo '走了第三步';
//開始第三步 (假設需要)
$res = refreshToken($res['refresh_token']);
}
//開始第四步? (scope為 snsapi_userinfo)
$userInfo = getUserInfo($res['access_token'], $res['openid']);
print_r($userInfo);die;
} else {
//開始第一步
$url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx0b833c060bb4a2c0&redirect_uri=http://weixin.xpisme.com/getUserInfo.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect';
header('location: '. $url);
}
---------------------------------------------------------------------
function getAccessToken($code) {
$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxfe9c15ba254a41bd&secret=69e2da11e48395d889893c11b9d03b14&code='. $code .'&grant_type=authorization_code';
$res = $this->httpRequest($url);
return json_decode($res, true);
}
//第三步
function refreshToken($token) {
$url = 'https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wxfe9c15ba254a41bd&grant_type=refresh_token&refresh_token=' . $token;
$res = $this->httpRequest($url);
return json_decode($res, true);
}
//第四步
function getUserInfo($accessToken, $openid) {
$url = 'https://api.weixin.qq.com/sns/userinfo?access_token='.$accessToken.'&openid='.$openid.'&lang=zh_CN';
$res = $this->httpRequest($url);
return json_decode($res, true);
}
//附加
function checkAccessToken($token, $openid) {
$url = 'https://api.weixin.qq.com/sns/auth?access_token='.$token.'&openid=' . $openid;
$res = $this->httpRequest($url);
$data = json_decode($res, true);
if (isset($data['errmsg']) && $data['errmsg'] == 'ok') {
return true;
}
return false;
}
function httpRequest($url, $data = false)
{
$ch = curl_init();
//設置超時
curl_setopt($ch, CURLOPT_TIMEOUT, 60);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,FALSE);
if ($data) {
curl_setopt ( $ch, CURLOPT_POST, 1 );
curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );
}
curl_setopt($ch, CURLOPT_HEADER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
$res = curl_exec($ch);
curl_close($ch);
return $res;
}