微信公衆號開發仍是比較簡單的,可是寫完以後就忘記了。每次寫還要從新查文檔,因此此次吧開發過程記錄起來,有些細節問題也記錄下來,之後用到就方便了。html
由於以前寫過幾回,思路仍是很清楚的,大概有一下幾個步驟:前端
思路有了下面就開始實現這個思路java
首先定義一個方法,接收redirect_url參數,並在這個方法中跳轉到微信受權頁面。web
這裏咱們須要完成思路中1,2的步驟。api
在瀏覽器中調用方法的時候redirect_url參數要通過 URLEncoder.encode
瀏覽器
在方法中接收的redirect_url參數任然須要通過URLEncoder.encode
,由於在做爲參數接收到的時候,這個參數已經變成正常的http連接了。微信
在拼裝微信重定向地址的時候,須要再次URLEncoder.encode
。app
//微信網頁受權地址 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; }
這裏要在定義一個連接,就是上一步要讓微信跳轉回來的地址。這裏微信會攜帶一個code參數,因爲在上一步咱們將redirect_url地址進行了兩次編碼,因此在這個方法中redirect_url也會傳遞進來。ui
着這個方法中咱們須要完成思路中 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