呼叫微信OAuth2.0網頁授權介面實現使用者資訊的繫結
在微信網頁開發中,可以通過OAuth2.0網頁授權機制,來獲取使用者基本資訊,進而實現自己的業務邏輯。
微信官方文件
關於網頁授權回撥域名的說明
1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的“開發 - 介面許可權 - 網頁服務 - 網頁帳號 - 網頁授權獲取使用者基本資訊”的配置選項中,修改授權回撥域名。請注意,這裡填寫的是域名(是一個字串),而不是URL,因此請勿加 http:// 等協議頭;
2、授權回撥域名配置規範為全域名,比如需要網頁授權的域名為:www.qq.com,配置以後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html
關於網頁授權的兩種scope的區別說明
1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的使用者的openid的,並且是靜默授權並自動跳轉到回撥頁的。使用者感知的就是直接進入了回撥頁(往往是業務頁面)
2、以snsapi_userinfo為scope發起的網頁授權,是用來獲取使用者的基本資訊的。但這種授權會產生一個授權頁面,需要使用者手動同意,在使用者同意後,就可以通過獲取使用者基本資訊的介面獲取該使用者的基本資訊。 如使用者的openid,暱稱,性別,頭像,所在地等。
步驟
具體而言,網頁授權流程分為四步:
1、引導使用者進入授權頁面或開啟授權連結同意授權,獲取code
2、通過code換取網頁授權access_token(與基礎支援中的access_token不同)
3、如果需要,開發者可以重新整理網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取使用者基本資訊
尤其需要注意的是redirect_uri這個引數,它代表了授權完成後的回撥頁面,也就是我們的業務頁面,必須以https://開頭(官方文件的要求),並且該連結需要經過urlEncode編碼
使用者同意授權後
如果使用者同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。會跳轉至我們指定的頁面,並帶上code和state兩個引數。根據code值,我們可以獲得access_token和openid,再通過access_token和openid,呼叫獲取使用者基本資訊的介面,就可以獲得使用者暱稱,性別,頭像等資料。
第二步:通過code換取網頁授權access_token
首先請注意,這裡通過code換取的是一個特殊的網頁授權access_token,與基礎支援中的access_token(該access_token用於呼叫其他介面)不同。公眾號可通過下述介面來獲取網頁授權access_token。如果網頁授權的作用域為snsapi_base,則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。
第三步:拉取使用者資訊(需scope為 snsapi_userinfo)
請求方法
http:GET(請使用https協議)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
正確時返回的JSON資料包如下:
{ “openid”:” OPENID”,
” nickname”: NICKNAME,
“sex”:”1”,
“province”:”PROVINCE”
“city”:”CITY”,
“country”:”COUNTRY”,
“headimgurl”: “http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ
4eMsv84eavHiaiceqxibJxCfHe/46”,
“privilege”:[ “PRIVILEGE1” “PRIVILEGE2” ],
“unionid”: “o6_bmasdasdsad6_2sgVt7hMZOPfL”
}
至此我們獲取到了使用者微訊號的完整資訊,並可以與業務中的user進行繫結,以進行後續的使用者定製和開發。
網頁授權獲取使用者資訊完整PHP程式碼示例
1.首先寫一個lib.php封裝php的get和post請求等操作
<?php
/**
* 封裝向微信伺服器傳送http請求的post和get方法
*
*/
/**
* 初始化,根據APPID和APPSECRET獲取ACCESS_TOKEN
*
*/
function init(){
//設定預設時區
date_default_timezone_set( "Asia/shanghai");
//APPID
define("APPID" , "省略");
//APPSECRET
define("APPSECRET" , "省略");
$token_access_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".APPID."&secret=".APPSECRET;
//獲取access_token請求的url地址
$res = file_get_contents( $token_access_url );
//將獲取的返回json值轉換為陣列格式
$arr_result = json_decode($res,true);
//定義為全域性方便使用
define("ACCESS_TOKEN" , $arr_result['access_token']);
}
/**
* post方式提交資料
*
* @param $url 提交的url地址
* @param $data post需要的資料
* @return object 返回提交後返回的json物件資料
*/
function postMessage( $url , $data){
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url );
curl_setopt($ch , CURLOPT_CUSTOMREQUEST , "POST");
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 );
curl_setopt($ch , CURLOPT_POSTFIELDS , $data );
curl_setopt($ch , CURLOPT_RETURNTRANSFER , true );
$info = curl_exec($ch); //將執行返回的資料儲存到臨時變數
if( curl_errno($ch) ){ //判斷資料在執行過程中是否有錯誤
echo 'Errno'.curl_error($ch);
}
curl_close($ch);
return $info ;
}
/**
* get方式獲取資料 , 通過curl
*
* @param $url 提交的url地址
* @return object 返回獲取json物件資料
*/
function getCach($url){
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url );
curl_setopt($ch , CURLOPT_HEADER, false);
curl_setopt($ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt($ch , CURLOPT_SSL_VERIFYPEER , false);
curl_setopt($ch , CURLOPT_USERAGENT , 'Mozilla/5.0 (Windows NT 6.1)
AppleWebKit/537.11 ( KHTML , like Geko ) Chrome/23.0.1271.1 Safari/537.11');
$res = curl_exec($ch);
$rescode = curl_getinfo($ch , CURLINFO_HTTP_CODE);
curl_close($ch);
return $res;
}
/**
* get方式獲取資料
*
* @param $url 提交的url地址
* @return object 返回讀取的資料
*/
function getFileGetContent($url){
$result = file_get_contents($url);
return $result ;
}
/**
* 格式輸出除錯資訊
*
*/
function p($arr){
var_dump($arr);
}
然後在業務邏輯頁面中獲取使用者的基本資訊
<?php
require_once "lib.php";
//APPID
define("APPID" , "省略");
//APPSECRET
define("APPSECRET" , "省略");
if( isset( $_GET['code'])){
//獲取授權頁回撥過來的code值
define("CODE",$_GET['code']);
//請求access_token的url
$get_access_token_url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".APPID."&secret=".APPSECRET."&code=".CODE."&grant_type=authorization_code";
$json_result = getCach($get_access_token_url);
$arr_result = json_decode($json_result,true);
define("ACCESS_TOKEN",$arr_result['access_token']);
define("OPEN_ID",$arr_result['openid']);
//獲取使用者基本資訊的介面url
$get_user_info_url = "https://api.weixin.qq.com/sns/userinfo?access_token=".ACCESS_TOKEN."&openid=".OPEN_ID;
$userinfo_json = getCach($get_user_info_url);
$userinfo_arr = json_decode($userinfo_json,true);
//獲得使用者的openid
$openid = $userinfo_arr['openid'];
//獲得使用者的暱稱
$nickname = $userinfo_arr['nickname'];
//獲得使用者的性別
$sex = $userinfo_arr['sex'];
//獲得使用者的頭像url
$imgicon = $userinfo_arr['headimgurl'];
}
?>