參考網址:https://www.cnblogs.com/0201zcr/p/5131602.htmlphp
獲取測試公衆帳號及其相關配置html
1)、公衆測試帳號獲取json
訪問上面的鏈接,選擇「接口測試號申請」得到直接打開http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index經過微信客戶端掃碼登陸便可登陸。api
登陸完便可獲取到一個測試公衆帳號的信息。主要有appId和appsecret兩個參數,這將惟一標示一個公衆號,而且須要將他們做爲參數獲取用戶的信息。數組
2)、關注公衆號瀏覽器
用戶只有關注了這個公衆號了,才能經過打開有公衆號信息的連接去受權第三方登陸,並獲取用戶信息的操做。故咱們還須要用咱們的微信關注微信號,操做以下:安全
仍是剛剛那個登陸成功後跳轉的頁面,咱們能夠看到,該頁面有一個二維碼,咱們能夠經過掃描該二維碼進行關注,關注成功在右邊的「用戶列表」會多一個用戶的信息。以下圖所示:服務器
3)、配置回調函數微信
咱們在微信客戶端訪問第三方網頁(即咱們本身的網頁)的時候,咱們能夠經過微信網頁受權機制,咱們不只要有前面獲取到的appid和appsecret還須要有當用戶受權以後,回調的域名設置,即用戶受權後,頁面會跳轉到哪裏。具體的配置以下:app
如:wenba
仍是在剛剛的頁面,有一個「網頁受權獲取用戶基本信息」,點擊後面的修改
填寫回調的域名:如: wenba1314.com
若是你的網址沒有被列入過黑名單,就會在頂部出現
而後,域名配置就成功了!
注意:
一、這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加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鑑權
到這裏,咱們就獲取到咱們必須用到的測試信息了,包括
三、微信受權登陸並獲取用戶基本信息
微信受權使用的是OAuth2.0受權的方式。主要有如下簡略步驟:
第一步:用戶贊成受權,獲取code
第二步:經過code換取網頁受權access_token
第三步:刷新access_token(若是須要)
第四步:拉取用戶信息(需scope爲 snsapi_userinfo)
詳細的步驟以下:
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時無此步驟)
1)、用戶受權並獲取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參數,開發者能夠填寫a-zA-Z0-9的參數值,最多128字節,該值會被微信原樣返回,咱們能夠將其進行比對,防止別人的攻擊。 |
#wechat_redirect |
否 |
直接在微信打開連接,能夠不填此參數。作頁面302重定向時候,必須帶此參數 |
應用受權做用域:因爲snsapi_base只能獲取到openid,意義不大,因此咱們使用snsapi_userinfo。
回調地址:填寫爲剛纔上傳後的oauth.php的文件地址,
state參數:隨便一個數字,這裏填123
尤爲注意:因爲受權操做安全等級較高,因此在發起受權請求時,微信會對受權連接作正則強匹配校驗,若是連接的參數順序不對,受權頁面將沒法正常訪問
構造請求url以下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http://wenba1314.com/test&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
這個須要發到微信中,使用微信瀏覽器才能打開。
點開上面的連接,點擊確認登陸便可跳轉到剛剛配置的回調頁面,並獲取了微信傳回的code參數,用於下面的操做。
受權頁面以下:
受權後跳轉的頁面(咱們前面配置的redirect_uri):
說明 :
一、重定向地址必定要寫:http:// 好比http://wenba1314.com/test,否則會報redirect_uri參數錯誤
二、redirect_uri直接在微信打開連接,能夠不填此參數。
如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx&redirect_uri=http://wenba1314.com/test&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
作頁面302重定向時候,必須帶此參數,好比:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6f655e2be16b6207&redirect_uri=http://wenba1314.com/test?code=CODE&state=STATE&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
三、http://wenba1314.com/test這個我作了外網映射,例如訪問http://wenba1314.com就是訪問了我本地啓動的項目的80端口
http://wenba1314.com/test則表示訪問我本地的80端口下的/test接口
代碼:
@RequestMapping("/test") public String index(String code,String state) { System.out.println(state); System.out.println(code); return "code="+code+"-----state="+state; }
1)、使用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=xxx&secret=xxx&code=00137323023ab55775be09d6d8e75ffA&grant_type=authorization_code
只有獲取code的連接必須是在微信客戶端中點開的,獲取access_token和用戶信息能夠直接在網頁打開便可。
返回說明
正確時返回的JSON數據包以下:
{ "access_token":"xxx", "expires_in":7200, "refresh_token":"xxx", "openid":"xxx", "scope":"SCOPE" }
參數 |
描述 |
access_token |
網頁受權接口調用憑證,注意:此access_token與基礎支持的access_token不一樣 |
expires_in |
access_token接口調用憑證超時時間,單位(秒) |
refresh_token |
用戶刷新access_token |
openid |
用戶惟一標識 |
scope |
用戶受權的做用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON數據包以下(示例爲Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
2)、經過access_token、openid獲取用戶信息
請求方法:
https://api.weixin.qq.com/sns/userinfo?access_token=xxx&openid=xxx
參數說明
參數 |
描述 |
access_token |
網頁受權接口調用憑證,注意:此access_token與基礎支持的access_token不一樣 |
openid |
用戶的惟一標識 |
構造url以下:
https://api.weixin.qq.com/sns/userinfo?access_token=xxx&openid=xxx
能夠在瀏覽器中直接執行這個。
獲得的json格式數據以下:
{ "openid":" xxx", " nickname": xxx, "sex":"1", "province":"xxx" "city":"xxx", "country":"xxx", "headimgurl": "xxx", "privilege":[ "PRIVILEGE1" "PRIVILEGE2" ], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
參數 |
描述 |
openid |
用戶的惟一標識 |
nickname |
用戶暱稱 |
sex |
用戶的性別,值爲1時是男性,值爲2時是女性,值爲0時是未知 |
province |
用戶我的資料填寫的省份 |
city |
普通用戶我的資料填寫的城市 |
country |
國家,如中國爲CN |
headimgurl |
用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空。若用戶更換頭像,原有頭像URL將失效。 |
privilege |
用戶特權信息,json 數組,如微信沃卡用戶爲(chinaunicom) |
unionid |
只有在用戶將公衆號綁定到微信開放平臺賬號後,纔會出現該字段。詳見:獲取用戶我的信息(UnionID機制) |
錯誤時微信會返回JSON數據包以下(示例爲openid無效):
{"errcode":40003,"errmsg":" invalid openid "}
總結:
第一步:獲取code
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx6f655e2be16b6207&redirect_uri=http://wenba1314.com/test?code=CODE&state=STATE&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
第二步:獲取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx6f655e2be16b6207&secret=4be430bea27c4368448294abc032193c&code=0616ilwN1cK4e91IasuN1PjGwN16ilwV&grant_type=authorization_code
返回的數據爲
{"access_token":"19_phwV1NmuHibGw3eaWWq95eQpMaw8K_K4dQLvt_Yr14Zny3qOPH47er0NR7q8xSRxDXtsB665dkuw1pb9QL4_DA","expires_in":7200,"refresh_token":"19_-Dp52VDlJ9K5Oo5xCGtCtA-akx-Z6vjC3Uwc6I6AcOvMl3P1ny5toWW-6UPuEfopKbE95Xey51f-Y0Ruwb8_ug","openid":"odv7o1e1qxar2Aeqdq5RtxDUD7SQ","scope":"snsapi_userinfo"}
第三步:刷新access_token,這裏沒有作這一步(可作可不作)
第四步:根據access_token獲取用戶信息
https://api.weixin.qq.com/sns/userinfo?access_token=19_phwV1NmuHibGw3eaWWq95eQpMaw8K_K4dQLvt_Yr14Zny3qOPH47er0NR7q8xSRxDXtsB665dkuw1pb9QL4_DA&openid=odv7o1e1qxar2Aeqdq5RtxDUD7SQ&lang=zh_CN
返回的數據爲
{"openid":"odv7o1e1qxar2Aeqdq5RtxDUD7SQ","nickname":".","sex":1,"language":"zh_CN","city":"","province":"施蒂利亞","country":"奧地利","headimgurl":"http:\/\/thirdwx.qlogo.cn\/mmopen\/vi_32\/IZd3jUCN7twAvDlkOMgRkz4QWdtKdUPvfRINVtcibMqFzNYpaOP75Zlgd8moiaYQok3xUWicsZ77EictOtfudfOk0g\/132","privilege":[]}
參考官網API文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842