【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
目的:申请一个微信测试号,调用各种接口,如获取openid等简单使用。
1、准备微信测试账号
可以看下这个博客,如何申请微信号测试账号,进行微信开发
然后获取一个免费的外网,看下这个博客,Mac下NATAPP将内网映射到外网
2、启动natapp
环境配置好了,首先我们要确认我们项目的端口号,应该与natapp的端口号一样,因为我们的项目是8088,所以对应的如下:
上面的博客没有说明这一点,我们直接用http://9fvs5p.natappfree.cc代替localhost:8088测试接口成功就成功了。
3、测试token
我的配置token如图:
那么对应项目接口地址一样的,
@Controller @RequestMapping(value = "/wx") @Slf4j public class WxController { @GetMapping("testToken.html") public void getToken(String signature, String timestamp, String nonce, String echostr, HttpServletResponse response) throws NoSuchAlgorithmException, IOException { // 将token、timestamp、nonce三个参数进行字典序排序 log.info("signature:"+signature); log.info("timestamp:"+timestamp); log.info("nonce:"+nonce); log.info("echostr:"+echostr); log.info("TOKEN:"+"mdxlcj"); String[] params = new String[] { "mdxlcj", timestamp, nonce }; Arrays.sort(params); // 将三个参数字符串拼接成一个字符串进行sha1加密 String clearText = params[0] + params[1] + params[2]; String algorithm = "SHA-1"; String sign = new String(org.apache.commons.codec.binary.Hex.encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes()))); // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if (signature.equals(sign)) { response.getWriter().print(echostr); } } }
多尝试几次,然后就会配置成功。
4、添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.0.7</version> </dependency> <dependency> <groupId>net.sf.json-lib</groupId> <artifactId>json-lib</artifactId> <version>2.4</version> <classifier>jdk15</classifier> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.10</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>
5、application.properties
server.port=8088 # wxae20f429f6db1950 wxpay.appId=wxcb9a5f499f9e0f6c # appSecret 是 appId 对应的接口密码,微信公众号授权获取用户 openId 时使用 wxpay.appSecret=2d1079aad9a428a761d0b9d162720fc7 # thymeleaf 配置 spring.mvc.view.prefix=classpath:/templates/ spring.mvc.view.suffix=.html spring.thymeleaf.cache=false spring.mvc.static-path-pattern=/** spring.resources.static-locations =classpath:/static/ spring.thymeleaf.mode=LEGACYHTML5
6、html页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>首页</title> </head> <body> <h3>你好,程舰!</h3> </body> </html>
7、获取openid
最重要的一环
@Controller @RequestMapping(value = "/wx") @Slf4j public class WxController { private WxBean wxBean = new WxBean(); @GetMapping(value = "/getWxCode.html") public String getWxCode() throws UnsupportedEncodingException { // 1、redirect_uri设置 String redict = URLEncoder.encode("http://9fvs5p.natappfree.cc/wx/getWxAccessToken.html", "UTF-8"); // 2、获取code的url String url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+wxBean.getAppId()+"&redirect_uri="+redict+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"; // 3、重定向去微信获取code,之后去回掉接口/getWxAccessToken.html return "redirect:" + url; } @GetMapping(value = "/getWxAccessToken.html") public String getWxAccessToken(HttpServletRequest request){ // 1、获取code String code = request.getParameter("code"); // 2、拼接获取access_token的url String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+wxBean.getAppId()+"&secret="+wxBean.getAppSecret()+"&code="+code+"&grant_type=authorization_code"; // 3、调用获取access_token String result = HttpUtil.get(url); // 4、转换结果 JSONObject jsonObject = JSONObject.fromObject(result); if (null == jsonObject || jsonObject.isEmpty() || jsonObject.get("access_token") == null || jsonObject.get("openid") == null) { return "/false"; } // 5、取access_token String accessToken = jsonObject.get("access_token").toString(); // 6、取openid String openId = jsonObject.get("openid").toString(); log.info("accessToken====="+accessToken); log.info("openId====="+openId); return "index"; } @GetMapping("testToken.html") public void getToken(String signature, String timestamp, String nonce, String echostr, HttpServletResponse response) throws NoSuchAlgorithmException, IOException { // 将token、timestamp、nonce三个参数进行字典序排序 log.info("signature:"+signature); log.info("timestamp:"+timestamp); log.info("nonce:"+nonce); log.info("echostr:"+echostr); log.info("TOKEN:"+"mdxlcj"); String[] params = new String[] { "mdxlcj", timestamp, nonce }; Arrays.sort(params); // 将三个参数字符串拼接成一个字符串进行sha1加密 String clearText = params[0] + params[1] + params[2]; String algorithm = "SHA-1"; String sign = new String(org.apache.commons.codec.binary.Hex.encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes()))); // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if (signature.equals(sign)) { response.getWriter().print(echostr); } } }
成功之后,我们把域名发到微信上,如图:
点击之后,就会跳转,如下:
而我们控制台获取的openid等信息,如下:
最终成功,如果第一步第二步弄不出来私信我或者评论,就好了。
来源:oschina
链接:https://my.oschina.net/mdxlcj/blog/3143225