本文介紹如何得到微信公衆平臺關注用戶的基本信息,包括暱稱、頭像、性別、國家、省份、城市、語言。
本文的方法將囊括訂閱號和服務號以及自定義菜單各類場景,不管是否有高級接口權限,都有辦法來得到用戶基本信息,而無需模擬登陸。php
在本文中,特別要注意的是有兩個不一樣的Access Token,他們產生的方式不同,一種是使用AppID和AppSecret獲取的access_token,一種是OAuth2.0受權中產生的access_token,方倍工做室分別稱爲全局Access Token和受權Access Token。html
1、經過全局Access Token獲取用戶基本信息web
1. 用戶關注以及回覆消息的時候,都可以得到用戶的OpenIDjson
<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就是OpenIDapi
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 }
至此,得到用戶的基本信息。微信
這種方式最適合用戶在關注的時候,回覆一條歡迎關注+用戶暱稱的信息,如關注下面公衆帳號時的回覆所示。掃描二維碼可體驗。
2、經過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網頁受權權限的服務號中用這種方法,會自動轉換成方法三中的那樣,沒有「微信登陸」提示框出來。
能夠微信掃描下面的二維碼,而後回覆「受權」體驗這樣的獲取方式。
3、經過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網頁受權的服務號在網頁中使用,且不會彈出「微信登陸」頁面。減小給用戶的打擾。
4、使用哪一種方法最合適
供參考
1. 服務號
有高級接口權限: 消息回覆中三種均可以 自定義菜單中使用方法三 (招商銀行信用卡中心使用方法三,康盛微社區使用方法二)
沒有高級接口權限: 消息回覆中使用方法二 自定義菜單中使用方法二 (沒有高級權限須要借用別人的Appid和AppSecret)
2. 訂閱號
已認證有獲取用戶信息權限 消息回覆中使用方法一 自定義菜單中使用方法二 (沒有高級權限須要借用別人的Appid和AppSecret)
未認證沒有獲取用戶信息權限 消息回覆中使用方法二 自定義菜單中暫無方法 (沒有高級權限須要借用別人的Appid和AppSecret,方倍工做室使用的就是這種)
官方網站: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
2、微信公衆平臺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、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空 |
privilege | 用戶特權信息,json 數組,如微信沃卡用戶爲(chinaunicom) |
這與我我的的微信信息是一致的
至此,在不輸入個人帳號及密碼的狀況下,微信公衆帳號近寶得到了個人我的信息,這些信息包括暱稱、性別、國家、省份、城市、我的頭像以及特權列表。
一個完整的OAuth2認證就完成了。
3、詳細演示
掃描關注下列微信公衆帳號「方倍工做室」的二維碼,回覆「受權」。
彈出獲取到的結果