微信公衆平臺開發1-OAuth2.0網頁受權(含源碼)

微信公衆平臺開發-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。

接口調用地址:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

調用參數說明,如表所示:

獲取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

(3)刷新access_token(若是須要)

(4)拉取用戶信息

(1)獲取code

在確保微信公衆帳號擁有受權做用域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發起的網頁受權流程一致,參考其調用方法便可。

(3)刷新access_token(若是須要)

因爲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'];
?>

 

效果如圖所示:

 5.本課內容已錄製爲視頻教程,視頻已在 《微信公衆平臺開發實例教程》一書中發佈,歡迎購買。

點此購買《微信公衆平臺開發實例教程》

相關文章
相關標籤/搜索