1. 程式人生 > 其它 >paypal中授權返回_微信開放平臺授權登入流程詳解

paypal中授權返回_微信開放平臺授權登入流程詳解

技術標籤:paypal中授權返回

最近在工作中用到了一些微信開放平臺授權第三方登入,來獲取使用者基本資訊的操作。看了一下微信給出的官方文件,寫的已經很詳細了,這裡按照自己的步驟進行了一下總結,並附帶了一些示例,方便大家理解。

微信公眾號進行對第三方授權的流程可分為以下四步:

  1. 使用者同意授權,獲取code

  2. 通過code換取網頁授權access_token

  3. 重新整理access_token(非必須)

  4. 拉取使用者資訊(需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架構師視訊

"加群"---加入學習交流群

c4d8f1706fdb643fb1123fcd2265b9ae.png

掃碼關注公眾號

有趣、深入、直接

與你聊聊技術

覺得有用,點個在看吧~