記一次微信網頁授權後獲取使用者資訊並重定向
微信公眾號開發還是比較簡單的,但是寫完之後就忘記了。每次寫還要重新查文件,所以這次吧開發過程記錄起來,有些細節問題也記錄下來,以後用到就方便了。
需求:
- 能獲取使用者基本資訊。
- 獲取微信資訊的時候,從哪個頁面來,最後到哪個頁面去。
- 呼叫方式要簡單。
思路:
因為之前寫過幾次,思路還是很清楚的,大概有一下幾個步驟:
- 提供一個連結,帶有一個redirect_url引數,代表在獲取使用者資訊後要返回的頁面。
- 在上一個連結中跳轉進行微信網頁授權。
- 授權成功後獲取code。
- 通過code呼叫微信介面獲取access_token。
- 通過access_token獲取使用者基本資訊。
- 將使用者資訊拼在之前定義的redirect_url中,並重定向到redirect_url。
實現:
思路有了下面就開始實現這個思路
1:
首先定義一個方法,接收redirect_url引數,並在這個方法中跳轉到微信授權頁面。
這裡我們需要完成思路中1,2的步驟。
注意:
在瀏覽器中呼叫方法的時候redirect_url引數要經過 URLEncoder.encode
在方法中接收的redirect_url引數任然需要經過URLEncoder.encode
,因為在作為引數接收到的時候,這個引數已經變成正常的http連結了。
在拼裝微信重定向地址的時候,需要再次URLEncoder.encode
。
//微信網頁授權地址
private String getWechatCodeUrl = "https://open.weixin.qq.com/connect/oauth2/authorize?" +
"appid=[APPID]&" + //微信appid
"redirect_uri=[REDIRECT_URI]&" + //獲取網頁授權後,微信重定向地址
"response_type=code&" +
"scope=snsapi_userinfo&" + //授權方式
"state=STATE#wechat_redirect";
//微信授權後返回的地址
private String getCodeUrl = "專案域名" +
"redirect/code?redirect_url=";
//提供的獲取使用者資訊的地址
@GetMapping("/redirect")
public String redirect(
@RequestParam(name = "redirect_url", defaultValue = "", required = false) String redirectUrl
) throws UnsupportedEncodingException {
//預設值,前端首頁地址
if (StringUtils.isBlank(redirectUrl)) {
redirectUrl = webSite;
}
//一次編碼
redirectUrl = URLEncoder.encode(redirectUrl, "utf-8");
//二次編碼
redirectUrl = URLEncoder.encode(getCodeUrl + redirectUrl, "utf-8");
//最終得到的微信獲取微信授權地址
String url = getWechatCodeUrl
.replace("[APPID]", appid)
.replace("[REDIRECT_URI]", redirectUrl);
logger.info("redirecturl: {}", url);
return "redirect:" + url;
}
2:
這裡要在定義一個連結,就是上一步要讓微信跳轉回來的地址。這裡微信會攜帶一個code引數,由於在上一步我們將redirect_url地址進行了兩次編碼,所以在這個方法中redirect_url也會傳遞進來。
著這個方法中我們需要完成思路中 4,5,6的步驟
//獲取access_token的介面地址,這裡還可以獲取到openid
private String getAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=[APPID]&" + //微信的appid
"secret=[SECRET]&" + //微信的secret
"code=[CODE]&" + //重定向後微信攜帶的code引數
"grant_type=authorization_code";
//獲取微信使用者基本資訊的介面地址
private String getWechatUserUrl = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=[ACCESS_TOKEN]&" + //獲取到的 access_token
"openid=[OPENID]&" + //公眾號的 openid
"lang=zh_CN";
//這裡的地址由微信重定向跳轉,攜帶code引數。
@GetMapping("/redirect/code")
public String getCode(
@RequestParam(name = "redirect_url", defaultValue = "", required = false) String redirectUrl,
@RequestParam(name = "code", defaultValue = "", required = false) String code
) throws UnsupportedEncodingException {
logger.info("redirect_url: {}", redirectUrl);
logger.info("code: {}", code);
if (StringUtils.isBlank(code)) {
logger.error("獲取code失敗");
return "redirect:" + redirectUrl + "?error=code-is-null";
}
//解碼重定向地址
redirectUrl = URLDecoder.decode(redirectUrl, "utf-8");
//根據code獲取微信相關資訊
String apiUrl = getAccessTokenUrl
.replace("[APPID]", appid)
.replace("[SECRET]", secret)
.replace("[CODE]", code);
String res = HttpUtils.doGet(apiUrl, new HashMap<>());
JSONObject resJson = JSONObject.parseObject(res);
//請求失敗
if (resJson.containsKey("errmsg")) {
logger.error("獲取access_token失敗," + res);
return "redirect:" + redirectUrl + "?error=" + resJson.getString("errmsg");
}
//獲取微信使用者資訊
String getUserUrl = getWechatUserUrl
.replace("[ACCESS_TOKEN]", resJson.getString("access_token"))
.replace("[OPENID]", resJson.getString("openid"));
String user = HttpUtils.doGet(getUserUrl, new HashMap<>());
JSONObject userJson = JSONObject.parseObject(user);
if (userJson.containsKey("errmsg")) {
logger.error("獲取access_token失敗," + res);
return "redirect:" + redirectUrl + "?error=" + userJson.getString("errmsg");
}
//這裡直接將微信使用者資訊編碼後重定向給最開始的redirect_url
return "redirect:" + redirectUrl + "?wechat_user=" + URLEncoder.encode(user, "utf-8");
}
完成:
這裡就已經開發完成了,釋出到線上後訪問:
[域名]/redirect?redirect_url=[需要轉到的地址]
後,在獲得使用者授權後會跳轉
[需要轉到的地址]?wechat_user=[URLEncoder.encode後的微信使用者資訊]
https://www.cnblogs.com/hebaibai/p/11089318.html