进行微信公众号的开发:java
1.咱们须要有微信公众号(开发中咱们能够本身去申请一个我的的公众号进行测试开发),算法
2.须要一个公网的IP(对于开发阶段便于咱们调试,咱们能够使用ngrok,进行一个内网穿透,将本地IP映射成公网的IP,使用80端口),开发时候,咱们将Tomcat端口设置为80;服务器
3.里面所涉及到的工具类,在个人经常使用工具类中,我有进行展现说明,直接Copy微信
-------------------------------------------------------开始微信后台------------------------------------------------------------------微信开发
开发微信公众号,必须进入微信公众号平台中,进行url 和token 的配置,这个url就是咱们与微信后台交互的路径,咱们主要就是开发这个url;app
APPID 以及AppSecret 会自动生成,在咱们开发中咱们会用的到,进行校验工具
配置url,这个url是微信Get请求到咱们服务器的地址,且为公网能够访问的地址;测试
自定义一个token,后面代码有用ui
---------------------------------------------编写微信Get请求的后台校验代码(******重要的一步)---------------------------------------------------加密
/*controller * 该方法与微信后台配置的url进行对接,是get的请求,是微信开发的第一步 * 微信后台会给咱们接口传入signature,timestamp,nonce,echostr * 进行sha1 加密与signature比较,TRUE 则返回echostr给微信 * author:cys */ @RequestMapping(value="/wxopen" ,method=RequestMethod.GET) public void wxopen(HttpServletResponse response,String signature,String timestamp,String nonce,String echostr) { PrintWriter writer=null;
//微信检验逻辑处理,这里涉及到一些算法以及加密,不用去研究它,复制就行 if(WxOpenCheck.checkSignature(signature, timestamp, nonce)) { try { writer=response.getWriter(); writer.write(echostr); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { if(writer !=null) { writer.close(); } } } }
微信检验逻辑
package com.wx.project.util; import java.util.Arrays; public class WxOpenCheck { //微信参数进行校验的逻辑 public static boolean checkSignature(String signature,String timestamp,String nonce) { //后台本身定义的Token,开发者须要本身修改的地方 String token ="chenyuesong"; String arr[]= new String[] {token,timestamp,nonce}; //排序 Arrays.sort(arr); StringBuilder builder =new StringBuilder(); for(int i=0;i<arr.length;i++) { builder.append(arr[i]); } //sha1 加密 String sha1=SHA1.encode(builder.toString()); return sha1.equals(signature); } }
sha1加密工具类,直接copy
package com.wx.project.util; import java.security.MessageDigest; /* * sha1 加密算法 * 网上copy 一大堆 */ public class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文转换成十六进制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } }
代码写好以后,在80端口运行,在微信后台中将咱们的写好的接口url接口配置上,点击提交,只要代码没有错误,就会成功。
这样咱们的第一步就完成了,微信和咱们的后台就是打通了-----