paypal中授權返回_微信開放平臺授權登入流程詳解
技術標籤:paypal中授權返回
最近在工作中用到了一些微信開放平臺授權第三方登入,來獲取使用者基本資訊的操作。看了一下微信給出的官方文件,寫的已經很詳細了,這裡按照自己的步驟進行了一下總結,並附帶了一些示例,方便大家理解。
微信公眾號進行對第三方授權的流程可分為以下四步:
使用者同意授權,獲取code
通過code換取網頁授權access_token
重新整理access_token(非必須)
拉取使用者資訊(需scope為 snsapi_userinfo)
其中正常流程中,第3步為非必須步驟,僅使用在access_token失效的情況下,下面對每一個步驟進行詳細介紹。
1.
獲取code
官方api如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE&connect_redirect=1#wechat_redirect
當用戶確認授權登入之後,會跳轉到redirect_uri這個地址上,並帶上微信後臺生成的code引數,在前端可對code進行儲存,用於後續獲取access_token。
引數說明:
引數 | 必須 | 說明 |
appid | 是 | 公眾號的唯一標識 |
redirect_uri | 是 | 授權後重定向的回撥連結地址, 需使用 urlEncode 對連結進行處理 |
response_type | 是 | 返回型別,請填寫code |
scope | 是 | 應用授權作用域,snsapi_base 或 snsapi_userinfo |
state | 否 | 重定向後會帶上state引數,開發者可以填寫a-zA-Z0-9的引數值,最多128位元組 |
#wechat_redirect | 是 | 無論直接開啟還是做頁面302重定向時候,必須帶此引數 |
後端程式碼示例:
@[email protected]("wechat")publicclassWeChatContraller{ @GetMapping("authorization") public String authorization() throws UnsupportedEncodingException {return"redirect:https://open.weixin.qq.com/connect/oauth2/authorize?" + "?appid=" + WeChatUtil.appid + "&redirect_uri=" + URLEncoder.encode(WeChatUtil.DomainName + "/index.html", "UTF-8")+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"; }}
需要注意的是,由於授權操作安全等級較高,所以在發起授權請求時,微信會對授權連結做正則強匹配校驗,如果連結的引數順序不對,授權頁面將無法正常訪問。
並且應用授權作用域在為snsapi_base時,不彈出授權頁面,直接跳轉,只能獲取使用者openid;而在snsapi_userinfo時彈出授權頁面,後續可通過openid拿到暱稱、性別、所在地。並且, 即使在未關注的情況下,只要使用者授權,也能獲取其資訊。
2.
獲取access_token
這裡通過code換取一個特殊的網頁授權access_token,官方api如下:
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 |
後端程式碼示例:
@[email protected]("getToken")public String getToken(@RequestParam(name = "code") String code) {Stringurl="https://api.weixin.qq.com/sns/oauth2/access_token?" + "?appid=" + WeChatUtil.appid + "&secret=" + WeChatUtil.appsecret + "&code=" + code + "&grant_type=authorization_code"; String rs = HttpSendUtil.get(url, null); JSONObject json = JSONObject.parseObject(rs); if(null == json.get("errcode")){ return json.get("access_token").toString(); }else{ return "獲取access_token出錯"; }}
這裡使用HttpClient傳送get請求,從返回的JSON中取出access_token返回。正確返回的完整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 | 使用者唯一標識 |
scope | 使用者授權的作用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON資料包如下(示例為code無效錯誤):
{ "errcode":40029, "errmsg":"invalid code"}
需要注意code只能夠使用一次,如果被消費後第二次仍然用相同code請求獲取access_token則會失敗。
3.
重新整理access_token(非必須)
access_token擁有時效性,當超時失效後可以使用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引數 |
正確時返回的JSON資料包如下,與直接獲取格式相同:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE" }
4.
拉取使用者資訊
如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取使用者資訊了。
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
引數說明:
引數 | 必須 | 說明 |
access_token | 是 | 網頁授權介面呼叫憑證,注意:此access_token與基礎支援的access_token不同 |
openid | 是 | 使用者的唯一標識 |
lang | 是 | 返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語 |
後端程式碼示例:
@[email protected]("getUserInfo")public JSONObject getUserInfo(@RequestParam(name = "accessToken") String accessToken, @RequestParam(name = "openid") String openid) { String url = "https://api.weixin.qq.com/sns/userinfo?" + "?access_token=" + accessToken + "&openid=" +openid + "&lang=zh_CN"; String rs = HttpSendUtil.get(url, null); JSONObject json = JSONObject.parseObject(rs); return json;}
正確時返回的JSON資料包如下:
{ "openid":" OPENID", "nickname": NICKNAME, "sex":"1", "province":"PROVINCE", "city":"CITY", "country":"COUNTRY","headimgurl":"http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46", "privilege":[ "PRIVILEGE1" "PRIVILEGE2"], "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"}
返回引數說明:
引數 | 說明 |
openid | 使用者的唯一標識 |
nickname | 使用者暱稱 |
sex | 使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知 |
province | 使用者個人資料填寫的省份 |
city | 普通使用者個人資料填寫的城市 |
country | 國家,如中國為CN |
headimgurl | 使用者頭像 |
privilege | 使用者特權資訊,json 陣列 |
unionid | 只有在使用者將公眾號繫結到微信開放平臺帳號後,才會出現該欄位 |
錯誤時微信會返回JSON資料包如下(示例為openid無效):
{ "errcode":40003, "errmsg":" invalid openid "}
需要注意的是,由於公眾號的secret和獲取到的access_token安全級別都非常高,只能儲存在伺服器,不允許傳給客戶端。後續重新整理access_token、通過access_token獲取使用者資訊等步驟,也必須從伺服器發起。
公眾號後臺回覆
"面試"---領取大廠面試資料
"導圖"---領取24張Java後端學習筆記導圖
"架構"---領取29本java架構師電子書籍
"實戰"---領取springboot實戰專案
"視訊"---領取最新java架構師視訊
"加群"---加入學習交流群
掃碼關注公眾號
有趣、深入、直接
與你聊聊技術
覺得有用,點個在看吧~