微信公众号开发仍是比较简单的,可是写完以后就忘记了。每次写还要从新查文档,因此此次吧开发过程记录起来,有些细节问题也记录下来,之后用到就方便了。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