微信開放平臺開發第三方受權登錄(三):Android客戶端web
微信開放平臺開發第三方受權登錄(五):微信小程序spring
目錄數據庫
1、需求apache
2、開發流程json
3、開發使用的技術及工具微信小程序
4)經過access_token調用接口獲取用戶我的信息(UnionID機制)
微信開放平臺第三方受權登錄開發文檔(PC網頁端)
當微信開放平臺開發第三方受權登錄(一):開發前期準備完成後,已經獲取到應用的AppID和AppSecret、且已經成功申請到微信登錄功能。能夠進行第三方登錄受權開發。
網站應用微信登陸是基於OAuth2.0協議標準構建的微信OAuth2.0受權登陸系統。
根據需求,須要擁有第三方微信登陸功能,並獲取到用戶信息。
1)第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數;
2)經過code參數加上AppID和AppSecret等,經過API換取access_token;
3)經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。
網站應用第三方受權登錄獲取用戶信息
一、使用IDEA2017.2進行開發
二、使用SpringBoot進行快速開發
三、使用redis進行緩存。
四、使用fastJson對json數據進行處理
五、使用Maven對項目進行管理
建立工程
打開IDEA,新建一個工程,選擇Spring Initializr,Next。而後填寫工程基本信息
選擇SpringBoot的版本已經須要添加的依賴,也能夠直接跳過,手動添加依賴。因爲是web工程,須要添加web相關依賴。模板引擎採用springboot推薦的thymeleaf。最後點擊確認,進入工程。
添加相關依賴:
添加配置文件
SpringBoot默認會將resources下的application名字開頭的properties做爲配置文件。因此只須要添加application.properties就能夠了
因爲是使用thymeleaf做爲模板引擎。能夠添加相應的配置:
爲了讓系統更具備通用性,分別建立application-dev.properties、application-prod.properties對不一樣的環境進行配置。
在application.properties中,使用spring.profiles.active進行配置環境的選擇。
如:spring.profiles.active = prod
如:application-prod.properties
新建javaBean:WeChatUserInfo.java
新建WeChatOpenLoginController.java實現微信開放平臺第三方登陸的主要邏輯。
根據文檔進行編寫代碼。
前提:應用已經獲取相應的網頁受權做用域(scope=snsapi_login)
開發:第三方網站引導用戶打開連接
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
參數說明:
參數 |
必須 |
說明 |
appid |
是 |
應用惟一標識 |
redirect_uri |
是 |
請使用urlEncode對連接進行處理 |
response_type |
是 |
填code |
scope |
是 |
應用受權做用域,擁有多個做用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login便可 |
state |
否 |
用於保持請求和回調的狀態,受權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗 |
注意:若提示「該連接沒法訪問」,請檢查參數是否填寫錯誤,如redirect_uri的域名與審覈時填寫的受權域名不一致或scope不爲snsapi_login。
用戶容許受權後,將會重定向到redirect_uri的網址上,而且帶上code和state參數
redirect_uri?code=CODE&state=STATE
若用戶禁止受權,則不會重定向到咱們提供的回調地址中
成功受權後,將得到Code,經過Code能夠獲取access_token
經過上述方法獲取的code獲取access_token.
Http Get請求
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 |
請求後,
返回成功的json串爲(樣例):
{
"access_token":"ACCESS_TOKEN", // 接口調用憑證
"expires_in":7200, // access_token接口調用憑證超時時間,單位(秒)
"refresh_token":"REFRESH_TOKEN", //用戶刷新access_token
"openid":"OPENID", //受權用戶惟一標識
"scope":"SCOPE", //用戶受權的做用域,使用逗號(,)分隔
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" //當且僅當該網站應用已得到該用戶的userinfo受權時,纔會出現該字段
}
失敗返回的樣例:
{"errcode":40029,"errmsg":"invalid code"}
失敗可能緣由: 暫時不明
前提:
1. access_token有效且未超時;
2. 微信用戶已受權給第三方應用賬號相應接口做用域(scope)。
Http Get請求:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數 |
是否必須 |
說明 |
access_token |
是 |
調用憑證 |
openid |
是 |
普通用戶的標識,對當前開發者賬號惟一 |
lang |
否 |
國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認爲zh-CN |
返回成功的json結果(樣例):
{
"openid":"OPENID", //普通用戶的標識,對當前開發者賬號惟一
"nickname":"NICKNAME", //普通用戶暱稱
"sex":1, //普通用戶性別,1爲男性,2爲女性
"province":"PROVINCE", //普通用戶我的資料填寫的省份
"city":"CITY", //普通用戶我的資料填寫的城市
"country":"COUNTRY", //國家,如中國爲CN
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", //用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空
"privilege":[ //用戶特權信息,json數組,如微信沃卡用戶爲(chinaunicom)
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" //用戶統一標識。針對一個微信開放平臺賬號下的應用,同一用戶的unionid是惟一的
}
失敗JSON樣例:
{"errcode":40003,"errmsg":"invalid openid"}
注意:在用戶修改微信頭像後,舊的微信頭像URL將會失效,所以開發者應該本身在獲取用戶信息後,將頭像圖片保存下來,避免微信頭像URL失效後的異常狀況
最好保存用戶unionID信息,以便之後在不一樣應用中進行用戶信息互通。
因爲access_token有效期(目前爲2個小時)較短,當access_token超時後,可使用refresh_token進行刷新,access_token刷新結果有兩種:
1. 若access_token已超時,那麼進行refresh_token會獲取一個新的access_token,新的超時時間;
2. 若access_token未超時,那麼進行refresh_token不會改變access_token,但超時時間會刷新,至關於續期access_token。
refresh_token擁有較長的有效期(30天),當refresh_token失效的後,須要用戶從新受權。
請求方法:
獲取第一步的code後,請求如下連接進行refresh_token:
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參數 |
成功返回的結果:
{
"access_token":"ACCESS_TOKEN", //接口調用憑證
"expires_in":7200, // access_token接口調用憑證超時時間,單位(秒)
"refresh_token":"REFRESH_TOKEN", //用戶刷新access_token
"openid":"OPENID", //受權用戶惟一標識
"scope":"SCOPE" //用戶受權的做用域,使用逗號(,)分隔
}
失敗樣例:
{"errcode":40030,"errmsg":"invalid refresh_token"}
注意:
一、Appsecret 是應用接口使用密鑰,泄漏後將可能致使應用數據泄漏、應用的用戶數據泄漏等高風險後果;存儲在客戶端,極有可能被惡意竊取(如反編譯獲取Appsecret);
二、access_token 爲用戶受權第三方應用發起接口調用的憑證(至關於用戶登陸態),存儲在客戶端,可能出現惡意獲取access_token 後致使的用戶數據泄漏、用戶微信相關接口功能被惡意發起等行爲;
三、refresh_token 爲用戶受權第三方應用的長效憑證,僅用於刷新access_token,但泄漏後至關於access_token 泄漏,風險同上。
建議將secret、用戶數據(如access_token)放在App雲端服務器,由雲端中轉接口調用請求。
首先開啓redis。而後運行代碼。因爲SpringBoot會使用內置的Tomcat容器進行管理,直接運行就能夠了,而後點擊微信登陸。彈出掃碼登陸窗口,手機掃碼贊成登陸後就能夠獲取到用戶信息了.
APPID和APPSecret以及回調地址位置,注:須要修改受權回調域,即回調地址