- 简要明了,不说废话,之前没弄过微信的东西,弄了一上午算是用烂代码跑通了。
- 测试框架我用的springMVC。
- 需要内网穿透的请下载natapp 官网地址 https://natapp.cn/,使用教程:NATAPP1分钟快速新手图文教程
- 需要个微信公众号,本demo用的是测试公众号,访问地址: https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
- 需要关注自己的测试公众号。
- 关于微信授权请查询 https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/Wechat_webpage_authorization.html
- 测试公众号配置
- JS接口安全域名 填写你自己穿透本地后的域名 不带http://
-
体验接口权限表-->网页服务-->网页帐号还是填写上一步的域名 不带http://
- 下面代码开始↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
-
@RequestMapping(params = "toUrl",method=RequestMethod.GET) public void toUrl(HttpServletRequest request,HttpServletResponse response){ StringBuffer sb = new StringBuffer(); //公众号appId String appId = "appidxxxxxxxxxxxxxxx"; //目标方法或者页面 先获取code 换取openId 一个微信用户对应关注的微信号只有一个唯一的openId 在其他关注的公账号下openId不同 String doname = "带http://的域名/xxxxxController.do?getCode"; sb.append("https://open.weixin.qq.com/connect/oauth2/authorize?appid="); sb.append(appId); String url = ""; try { // url = URLEncoder.encode(encodeUrl.toString(), "utf-8"); url = URLEncoder.encode(doname, "utf-8"); sb.append("&redirect_uri=").append(url); //网页授权的静默授权snsapi_base sb.append("&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect"); response.sendRedirect(sb.toString()); } catch (UnsupportedEncodingException e) { System.out.println("重定向url编码失败:>>" + e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.out.println("response重定向失败:>>" + e.getMessage()); e.printStackTrace(); } }
@RequestMapping(params = "getCode",method=RequestMethod.GET) public void toMyPage(HttpServletRequest request,HttpServletResponse response){ //获取重定向携带的code参数值 String code = request.getParameter("code"); String openId = ""; if (StringUtils.isEmpty(openId)) { /* * 根据得到的code参数,内部请求获取openId的方法。 */ openId = getOpenId(request,response,code); } } //发送请求,根据code获取openId public String getOpenId(HttpServletRequest request, HttpServletResponse response,String code) { String content = ""; String openId = ""; String unionId = ""; String appId = "appidxxxxxxxxxxxxxxx";//公众号的appId String appsecret="appsecretxxxxxxxxxxxxx"; //公众号的appsecret //封装获取openId的微信API StringBuffer url = new StringBuffer(); url.append("https://api.weixin.qq.com/sns/oauth2/access_token?appid=") .append(appId) .append("&secret=") .append(appsecret) .append("&code=") .append(code) .append("&grant_type=authorization_code"); ObjectMapper objectMapper = new ObjectMapper(); try { CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(url.toString()); CloseableHttpResponse re = null; re = httpClient.execute(httpGet); HttpEntity responseEntity = re.getEntity(); content = EntityUtils.toString(responseEntity); Map map = objectMapper.readValue(content, Map.class); openId = String.valueOf(map.get("openid")); unionId = String.valueOf(map.get("unionid")); System.out.println("获取的openID:" + openId); /* * 将openId保存到session中,当其他业务获取openId时, * 可先从session中获取openId. */ request.getSession().setAttribute("openId", openId); /* * 获取到openid就可写绑定用户方法了 */ } catch (JsonParseException e) { System.out.println("json解析失败:"); } catch (JsonMappingException e) { System.out.println("map转换成json失败:"); } catch (Exception e) { System.out.println("http获取openId请求失败:"); } return openId; }
小弟才疏学浅,希望写的明白说的清楚了。