微信公衆平臺開發-OAuth2.0網頁受權接口、網頁受權接口詳解(含源碼)
做者: 孟祥磊-《微信公衆平臺開發實例教程》php
在微信開發的高級應用中,幾乎都會使用到該接口,由於經過該接口,能夠獲取到用戶的微信基礎信息,其中的用戶惟一標識OpenID是微信應用中最長用到的參數之一,近期有不少學員一直諮詢,因此我寫下這篇文章。html
1.網頁受權接口的做用json
開發者經過網頁受權接口,可獲取到用戶的基本信息,包括OpenID、暱稱、用戶資料填寫的省份、城市、國家以及頭像地址,以實現業務邏輯。api
與一樣是獲取用戶基本信息的用戶管理中的「獲取用戶信息」接口相比,網頁受權接口不管用戶是否關注了公衆號,均可以正常獲取到用戶信息,而用戶管理中的「獲取用戶信息」接口則必須關注公衆號纔可獲取。數組
2.網頁受權接口模式介紹微信
微信公衆平臺網頁受權接口有兩種模式,分別是scope爲snsapi_base和scope爲snsapi_userinfo,根據微信應用的不一樣需求,會用到不一樣的模式,兩種模式各有利弊。微信開發
(1)以snsapi_base爲scope發起的網頁受權。app
l 優勢:靜默受權,直接跳轉到到回調頁,不會彈出「確認登錄」頁面,用戶感知較好微信公衆平臺
l 缺點:僅可獲取到用戶的OpenID,在須要獲取其餘用戶信息時不適用函數
(2)以snsapi_userinfo爲scope發起的網頁受權。
l 優勢:除用戶OpenID外,還能夠獲取到用戶的,暱稱、用戶資料填寫的省份、城市、國家以及頭像地址
l 缺點:用戶進入頁面時會彈出「確認登錄」也就是贊成受權的頁面,單擊「確認登錄」按鈕後,纔會跳轉到回調頁,用戶感知較差
注意:對於已關注該公衆號的用戶,若是從公衆號的回話或者自定義菜單進入本公衆號的網頁受權頁,即便是以snsapi_userinfo爲scope發起的網頁受權,也是靜默受權,不會彈出「確認」登錄界面。
3.數據傳輸流程解析
以snsapi_base爲scope發起的網頁受權,當用戶進入使用網頁受權的網頁時,會帶上code參數,經過該參數,並調用接口,可獲取到一個特殊的access_token以及用戶的OpenID,程序可根據該參數繼續運行,流程如圖所示。
以snsapi_userinfo爲scope發起的網頁受權,與以snsapi_base爲scope發起的網頁受權不一樣的是,首先會進入「確認登錄」,也就是受權頁面,用戶贊成受權後,會跳轉到回調頁,並帶上code參數,經過該參數,並調用接口,可獲取到一個特殊的access_token以及用戶的OpenID,此時,scope爲snsapi_userinfo時,便可經過access_token和OpenID獲取用戶的基本信息了。
4.網頁受權接口注意事項
(1)網頁受權接口暫時只支持認證後的服務號調用。
(2)在微信公衆號調用用戶網頁受權接口以前,開發者須要先到公衆平臺官網中的「開發 → 接口權限 → 網頁服務 → 網頁賬號 → 網頁受權獲取用戶基本信息」的配置選項中,配置受權回調域名,如圖所示。請注意,這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加 http:// 等協議頭。
(3)受權回調域名配置規範爲全域名,好比須要網頁受權的域名爲: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鑑權。
(4)回調頁面域名需使用字母、數字及「-」的組合,不支持IP地址、端口號及短鏈。填寫的域名需與實際回調URL中的域名相同。填寫的域名須經過ICP備案的驗證。
5.scope參數爲snsapi_base的網頁受權接口調用實例
(1)獲取code
(2)經過code換取access_token以及OpenID
(1)獲取code
在確保微信公衆帳號擁有受權做用域scope參數爲snsapi_base的前提下,引導微信用戶打開以下格式頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,是否擁有scope參數對應的受權做用域權限。
參數說明,如表所示:
scope爲snsapi_base時接口調用參數說明
參數 |
是否必須 |
說明 |
appid |
是 |
公衆號的惟一標識 |
redirect_uri |
是 |
受權後重定向的回調連接地址,請使用urlencode對連接進行處理 |
response_type |
是 |
返回類型,請填寫code |
scope |
是 |
應用受權做用域,snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid) |
state |
否 |
重定向後會帶上state參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節 |
#wechat_redirect |
是 |
不管直接打開仍是作頁面302重定向時候,必須帶此參數 |
訪問該連接後,會跳轉到回調頁,即redirect_uri/?code=CODE&state=STATE,若是回調頁是「http://www.xxx.qq/test.php」,code是微信自動分配的,也就是上面連接中獲取到的response_type的值,每次訪問都不一樣,假設code爲「031cEhnA1qGrf10uzzoA1n3jnA1cEhn1」回調頁即爲:
「http://www.xxx.qq/test.php/?code=031cEhnA1qGrf10uzzoA1n3jnA1cEhn1&state=STATE」。
(2)經過code換取access_token以及OpenID
回調頁帶上的code參數可經過GET方式獲取,即$_GET[‘code’];並經過指定接口地址獲取access_token以及OpenID。
接口調用地址:
調用參數說明,如表所示:
獲取access_token以及OpenID調用參數說明
參數 |
是否必須 |
說明 |
appid |
是 |
公衆號的惟一標識 |
secret |
是 |
公衆號的appsecret |
code |
是 |
填寫第一步獲取的code參數 |
grant_type |
是 |
填寫爲authorization_code |
返回說明:
正常狀況下,微信會返回JSON數據包給公衆號:
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
返回參數說明:
返回參數說明
參數 |
描述 |
access_token |
網頁受權接口調用憑證,注意:此access_token與基礎支持的access_token不一樣 |
expires_in |
access_token接口調用憑證超時時間,單位(秒) |
refresh_token |
用戶刷新access_token |
openid |
用戶惟一標識,請注意,在未關注公衆號時,用戶訪問公衆號的網頁,也會產生一個用戶和公衆號惟一的OpenID |
scope |
用戶受權的做用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON數據包以下(示例爲Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
5.程序
<?php /* 以snsapi_base爲scope發起的網頁受權 獲取access_token,openid */ require('wei_function.php'); $appid="wx78478e595939c538"; $secret="5540e8ccab4f71dfad752f73cfb85780"; $code=$_GET['code']; $OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code"; $OAuthinfo=json_decode(getdata($OAuthurl),true); //print_r($OAuthinfo); $access_token=$OAuthinfo['access_token']; $openid=$OAuthinfo['openid']; echo "獲取到的access_token:<br />".$access_token."<br />"; echo "獲取到的用戶openid:<br />".$openid; ?>
代碼解析
require('wei_function.php');該函數文件能夠購買《微信公衆平臺開發實例教程》,在該書中第95頁有詳細講解。
$appid="xxx";
$secret="xxx";
分別將公衆號的AppID和AppSecret賦值給變量$appid和$secret;
$OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code";
$OAuthinfo=json_decode(getdata($OAuthurl),true);
$access_token=$OAuthinfo['access_token'];
$openid=$OAuthinfo['openid'];
將接口地址中的appid、secret和code參數替換,並經過getdata()函數(該函數在wei_function.php文件中,可直接被使用)請求該接口地址,並將返回的JSON數據經過json_decode()函數處理爲數組,以後單獨輸出access_token和openid。
訪問該程序的網址爲:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx78478e595939c538&redirect_uri=http://www.xxx.com/OAuth2.0.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
appid爲公衆號的appid,且需與上面的$appid的值相同,不然會提示{"errcode":40029,"errmsg":"invalid code, hints: [ req_id: z3H9UA0717ns83 ]"}這樣的錯誤信息,其表明的意思是不合法的oauth_code。
OAuth2.0.php爲該程序文件。
運行效果如圖所示。
6.scope參數爲snsapi_userinfo的網頁受權接口調用實例
(1)獲取code
(2)經過code換取access_token以及OpenID
(4)拉取用戶信息
在確保微信公衆帳號擁有受權做用域scope參數爲snsapi_userinfo的前提下,引導微信用戶打開以下格式頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,是否擁有scope參數對應的受權做用域權限。
該連接格式與以snsapi_userinfo爲scope發起的網頁受權不一樣的僅僅是scope不一樣,其他相同。
調用參數說明,如所示:
scope爲snsapi_userinfo時接口調用參數說明
參數 |
是否必須 |
說明 |
appid |
是 |
公衆號的惟一標識 |
redirect_uri |
是 |
受權後重定向的回調連接地址,請使用urlencode對連接進行處理 |
response_type |
是 |
返回類型,請填寫code |
scope |
是 |
應用受權做用域,snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且,即便在未關注的狀況下,只要用戶受權,也能獲取其信息) |
state |
否 |
重定向後會帶上state參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節 |
#wechat_redirect |
是 |
不管直接打開仍是作頁面302重定向時候,必須帶此參數 |
(2)經過code換取access_token以及OpenID
該步驟與以snsapi_userinfo爲scope發起的網頁受權流程一致,參考其調用方法便可。
因爲access_token擁有較短的有效期,當access_token超時後,可使用refresh_token進行刷新,refresh_token有效期爲30天,當refresh_token失效以後,須要用戶從新受權。
refresh_token在(2)經過code換取access_token以及OpenID中與access_token和OpenID一同獲取,獲取代碼爲$refresh_token=$OAuthinfo['refresh_token'];。
(4)拉取用戶信息
<?php /* 以snsapi_base爲scope發起的網頁受權 獲取access_token,openid */ require('wei_function.php'); $appid="wx78478e595939c538"; $secret="5540e8ccab4f71dfad752f73cfb85780"; $code=$_GET['code']; $OAuthurl="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$appid."&secret=".$secret."&code=".$code."&grant_type=authorization_code"; $OAuthinfo=json_decode(getdata($OAuthurl),true); //print_r($OAuthinfo); $access_token=$OAuthinfo['access_token']; $openid=$OAuthinfo['openid']; $user_url="https://api.weixin.qq.com/sns/userinfo?access_token=".$access_token."&openid=".$openid."&lang=zh_CN"; $user_info=json_decode(getdata($user_url),true); //print_r($user_info); echo "OpenID:".$user_info['openid']; echo "<br />"; echo "暱稱:".$user_info['nickname']; echo "<br />"; echo "性別:".$user_info['sex']; echo "<br />"; echo "資料填寫城市:".$user_info['city']; echo "<br />"; echo "資料填寫省份:".$user_info['province']; echo "<br />"; echo "資料填寫國家:".$user_info['country']; echo "<br />"; echo "用戶頭像地址:".$user_info['headimgurl']; echo "<br />"; echo "unionid:".$user_info['unionid']; ?>
效果如圖所示:
點此購買《微信公衆平臺開發實例教程》