***微信公眾平台開發: 獲取用戶基本信息+OAuth2.0網頁授權


本文介紹如何獲得微信公眾平台關注用戶的基本信息,包括昵稱、頭像、性別、國家、省份、城市、語言。
本文的方法將囊括訂閱號和服務號以及自定義菜單各種場景,無論是否有高級接口權限,都有辦法來獲得用戶基本信息,而無需模擬登錄。

 

在本文中,特別要注意的是有兩個不同的Access Token,他們產生的方式不一樣,一種是使用AppID和AppSecret獲取的access_token,一種是OAuth2.0授權中產生的access_token,方倍工作室分別稱為全局Access Token和授權Access Token。

 

一、通過全局Access Token獲取用戶基本信息

1. 用戶關注以及回復消息的時候,均可以獲得用戶的OpenID

復制代碼
<xml>
    <ToUserName><![CDATA[gh_b629c48b653e]]></ToUserName>
    <FromUserName><![CDATA[ollB4jv7LA3tydjviJp5V9qTU_kA]]></FromUserName>
    <CreateTime>1372307736</CreateTime>
    <MsgType><![CDATA[event]]></MsgType>
    <Event><![CDATA[subscribe]]></Event>
    <EventKey><![CDATA[]]></EventKey>
</xml>
復制代碼

其中的FromUserName就是OpenID

2. 然后使用access_token接口,請求獲得全局Access Token

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

返回結果:

{
    "access_token": "NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ",
    "expires_in": 7200
}

3. 再使用全局ACCESS_TOKEN獲取OpenID的詳細信息

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID

返回如下:

復制代碼
{
    "subscribe": 1,
    "openid": "oLVPpjqs2BhvzwPj5A-vTYAX4GLc",
    "nickname": "刺蝟寶寶",
    "sex": 1,
    "language": "zh_CN",
    "city": "深圳",
    "province": "廣東",
    "country": "中國",
    "headimgurl": "http://wx.qlogo.cn/mmopen/JcDicrZBlREhnNXZRudod9PmibRkIs5K2f1tUQ7lFjC63pYHaXGxNDgMzjGDEuvzYZbFOqtUXaxSdoZG6iane5ko9H30krIbzGv/0",
    "subscribe_time": 1386160805
}
復制代碼

至此,獲得用戶的基本信息。

這種方式最適合用戶在關注的時候,回復一條歡迎關注+用戶昵稱的信息,如關注下面公眾賬號時的回復所示。掃描二維碼可體驗。

 

 

二、通過OAuth2.0方式彈出授權頁面獲得用戶基本信息

1. 首先配置回調域名

 2. 構造請求url如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

頁面URL中的

scope=snsapi_userinfo 表示應用授權作用域為請求用戶信息
★ 如果使用別人的AppID和AppSecret,那么獲得的OpenID是那個有高級接口權限的服務號的,這里可以通過消息回復,獲取本公眾賬號下的OpenID,帶入回調中,與另一個OpenID進行關聯也可以使用開放平台的UnionID功能來得到用戶在自己賬號下的OpenID 
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

將該鏈接回復給關注用戶,用戶點擊后,彈出應用授權界面

3. 回調頁面得到鏈接如下,回調url中將包含參數code

http://mascot.duapp.com/oauth2.php?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1
或者 http://mascot.duapp.com/oauth2.php?userid=oc7tbuPA9BgUCLADib5nB3k2KWWg&code=00b788e3b42043c8459a57a8d8ab5d9f&state=1

4. 再使用code換取oauth2的授權access_token

url如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code

獲得授權Access Token:

復制代碼
{
    "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_userinfo,"
}
復制代碼

5. 再使用授權Access Token獲取用戶信息

url如下:

https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

返回如下

復制代碼
{
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "nickname": "刺蝟寶寶",
    "sex": 1,
    "language": "zh_CN",
    "city": "深圳",
    "province": "廣東",
    "country": "中國",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}
復制代碼

獲取用戶信息完成。

最終得到用戶信息如下所示

此方法詳細過程可參考 微信公眾平台開發(71)OAuth2.0網頁授權

這種方法適合,

1. 在朋友圈中獲得用戶的信息.

2. 在網頁中獲得用戶信息。

3. 在自定義菜單中獲得用戶信息。

需要說明的是,如果在已經有OAuth2.0網頁授權權限的服務號中用這種方法,會自動轉換成方法三中的那樣,沒有“微信登錄”提示框出來。

可以微信掃描下面的二維碼,然后回復“授權”體驗這樣的獲取方式。

 

三、通過OAuth2.0方式不彈出授權頁面獲得用戶基本信息

1. 配置回調域名

2. 構造請求url如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_base&state=1#wechat_redirect

頁面URL中的

scope=snsapi_base 表示應用授權作用域為 不彈出授權頁面,直接跳轉,只獲取用戶openid

3. 返回回調頁面如下

http://israel.duapp.com?code=02a9bed29b2185a9f0ed3a48fe56e700&state=1

這里獲得到了code

4. 再使用code獲取OpenID

url如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=02a9bed29b2185a9f0ed3a48fe56e700&grant_type=authorization_code

返回如下

復制代碼
{
    "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5Y6vey3dgDtFki5C8r6D0E6mSVxxtb8BjLMhb-mCyT_Yg",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-oJ9VmO-0Z-_izfnSAX_s0aqDsYkW4s8W5dLZ4iyNj5YBkF0ZUH1Ew8Iqea6x_itq13sYDqP1D7ieaDy9u2AHHw",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_base"
}
復制代碼

5. 然后獲取全局Access Token【以下與方法一中相同】

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

返回結果:

{
    "access_token": "NU7Kr6v9L9TQaqm5NE3OTPctTZx797Wxw4Snd2WL2HHBqLCiXlDVOw2l-Se0I-WmOLLniAYLAwzhbYhXNjbLc_KAA092cxkmpj5FpuqNO0IL7bB0Exz5s5qC9Umypy-rz2y441W9qgfnmNtIZWSjSQ",
    "expires_in": 7200
}

6. 再使用全局ACCESS_TOKEN獲取OpenID的詳細信息

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID

返回如下:

復制代碼
{
    "subscribe": 1,
    "openid": "oLVPpjqs2BhvzwPj5A-vTYAX4GLc",
    "nickname": "刺蝟寶寶",
    "sex": 1,
    "language": "zh_CN",
    "city": "深圳",
    "province": "廣東",
    "country": "中國",
    "headimgurl": "http://wx.qlogo.cn/mmopen/JcDicrZBlREhnNXZRudod9PmibRkIs5K2f1tUQ7lFjC63pYHaXGxNDgMzjGDEuvzYZbFOqtUXaxSdoZG6iane5ko9H30krIbzGv/0",
    "subscribe_time": 1386160805
}
復制代碼

成功獲得用戶基本信息。

這種適合已經有OAuth2.0網頁授權的服務號在網頁中使用,且不會彈出“微信登錄”頁面。減少給用戶的打擾。

 

四、使用哪種方法最合適

供參考

1. 服務號 
有高級接口權限:  消息回復中三種都可以   自定義菜單中使用方法三 (招商銀行信用卡中心使用方法三,康盛微社區使用方法二)
沒有高級接口權限: 消息回復中使用方法二   自定義菜單中使用方法二 (沒有高級權限需要借用別人的Appid和AppSecret)
2. 訂閱號
已認證有獲取用戶信息權限    消息回復中使用方法一   自定義菜單中使用方法二    (沒有高級權限需要借用別人的Appid和AppSecret)
未認證沒有獲取用戶信息權限    消息回復中使用方法二  自定義菜單中暫無方法     (沒有高級權限需要借用別人的Appid和AppSecret,方倍工作室使用的就是這種)

 

 


 

OAuth2.0網頁授權

一、什么是OAuth2.0

官方網站:http://oauth.net/   http://oauth.net/2/

權威定義:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications. 

OAuth是一個開放協議,允許用戶讓第三方應用以安全且標准的方式獲取該用戶在某一網站、移動或桌面應用上存儲的私密的資源(如用戶個人信息、照片、視頻、聯系人列表),而無需將用戶名和密碼提供給第三方應用。

OAuth 2.0是OAuth協議的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0關注客戶端開發者的簡易性,同時為Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。

OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要分享他們的訪問許可或他們數據的所有內容。

新浪微博API目前也使用OAuth 2.0。

原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

二、微信公眾平台OAuth2.0授權

微信公眾平台OAuth2.0授權詳細步驟如下:

1. 用戶關注微信公眾賬號。
2. 微信公眾賬號提供用戶請求授權頁面URL。
3. 用戶點擊授權頁面URL,將向服務器發起請求
4. 服務器詢問用戶是否同意授權給微信公眾賬號(scope為snsapi_base時無此步驟)
5. 用戶同意(scope為snsapi_base時無此步驟)
6. 服務器將CODE通過回調傳給微信公眾賬號
7. 微信公眾賬號獲得CODE
8. 微信公眾賬號通過CODE向服務器請求Access Token
9. 服務器返回Access Token和OpenID給微信公眾賬號
10. 微信公眾賬號通過Access Token向服務器請求用戶信息(scope為snsapi_base時無此步驟)
11. 服務器將用戶信息回送給微信公眾賬號(scope為snsapi_base時無此步驟)

 

 

使用的AppId和AppSecret在開發者中心-開發者ID中,可以找到。

 

 

1. 配置授權回調頁面域名

進入微信公眾平台后台后,依次進入開發者中心-權限表,找到網頁授權獲取用戶基本信息,

 

 

點擊右側的修改。原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

授權回調域名配置規范為全域名並且不帶http,比如需要網頁授權的域名為: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鑒權。

這里我們填寫方倍工作室的一個百度應用二級域名為 mascot.duapp.com

原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

如果你的網址沒有被列入過黑名單,就會在頂部出現

然后,域名配置就成功了。

 

2. 用戶授權並獲取code

在域名根目錄下,新建一個文件,命名為oauth2.php,其內容為

復制代碼
<?php
if (isset($_GET['code'])){
    echo $_GET['code'];
}else{
    echo "NO CODE";
}
?>
復制代碼

先了解下請求授權頁面的構造方式:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

參數說明

參數 必須 說明
appid 公眾號的唯一標識
redirect_uri 授權后重定向的回調鏈接地址
response_type 返回類型,請填寫code
scope 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息
state 重定向后會帶上state參數,開發者可以填寫任意參數值
#wechat_redirect 直接在微信打開鏈接,可以不填此參數。做頁面302重定向時候,必須帶此參數

應用授權作用域:由於snsapi_base只能獲取到openid,意義不大,所以我們使用snsapi_userinfo。
回調地址:填寫為剛才上傳后的oauth2.php的文件地址,
state參數:隨便一個數字,這里填1

構造請求url如下:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect

把這個鏈接發送到微信中,以便在微信瀏覽器中打開,這里使用A鏈接封裝如下:

OAuth2.0網頁授權演示 
<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">點擊這里體驗</a>
技術支持 方倍工作室

在微信中顯示如下

點擊綁定后,彈出應用授權界面

選擇允許,點擊

跳轉到auth2.php頁面,執行

echo $_GET['code']

界面上顯示的就是code,這時候通過右上角按鈕中的復制鏈接,得到鏈接如下:

http://mascot.duapp.com/oauth2.php?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1

我們成功得到了code了。

復制代碼
注意:如果在綁定的時候出現這樣的界面,就說明參數不對,需要回頭檢查一下參數
復制代碼

 

3. 使用code換取access_token

換取網頁授權access_token頁面的構造方式:

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

參數說明

參數 是否必須 說明
appid 公眾號的唯一標識
secret 公眾號的appsecret
code 填寫第一步獲取的code參數
grant_type 填寫為authorization_code

code:在這里填寫為上一步獲得的值

構造請求url如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code

可以在瀏覽器中直接執行這條語句:

得到如下json數據:

復制代碼
{
    "access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_userinfo,"
}
復制代碼

數據格式解讀如下:

參數 描述
access_token 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同
expires_in access_token接口調用憑證超時時間,單位(秒)
refresh_token 用戶刷新access_token
openid 用戶唯一標識,請注意,在未關注公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID
scope 用戶授權的作用域,使用逗號(,)分隔

於是,我們成功的通過code換取到了access_token,以及refresh_token。

復制代碼
刷新access_token
官方文檔中提到了刷新access_token的功能,但這不是必須要做的,初次使用可以先忽略。

url請求方法如下:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
參數說明
參數 是否必須 說明
appid 公眾號的唯一標識
grant_type 填寫為refresh_token
refresh_token 填寫通過access_token獲取到的refresh_token參數
構造如下:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx8888888888888888&grant_type=refresh_token&refresh_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A
在瀏覽器中執行得到前面同樣格式的json數據
復制代碼

方倍:感覺refresh token是個沒有意義的東西,使用code能獲得且必須這樣獲得access token和openid,繼而獲得用戶基本信息,那根本就沒有刷新access token的必要。個人意見,僅供參考。。。

 

 

4. 使用access_token獲取用戶信息

請求方法:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

參數說明

參數 描述
access_token 網頁授權接口調用憑證,注意:此access_token與基礎支持的access_token不同
openid 用戶的唯一標識

構造url如下:

https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

可以在瀏覽器中直接執行這條語句:

得到如下json數據:

復制代碼
{
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "nickname": "刺蝟寶寶",
    "sex": 1,
    "language": "簡體中文",
    "city": "深圳",
    "province": "廣東",
    "country": "中國",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}
復制代碼

參數解讀:

參數 描述
openid 用戶的唯一標識
nickname 用戶昵稱
sex 用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知
province 用戶個人資料填寫的省份
city 普通用戶個人資料填寫的城市
country 國家,如中國為CN
headimgurl 用戶頭像,最后一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空
privilege 用戶特權信息,json 數組,如微信沃卡用戶為(chinaunicom)

這與我個人的微信信息是一致的

 

至此,在不輸入我的賬號及密碼的情況下,微信公眾賬號近寶獲得了我的個人信息,這些信息包括昵稱、性別、國家、省份、城市、個人頭像以及特權列表。

一個完整的OAuth2認證就完成了。

 

三、詳細演示

掃描關注下列微信公眾賬號“方倍工作室”的二維碼,回復“授權”。

彈出獲取到的結果

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM