微信公众帐号开发之一(java)
闲来没事,就记录一下微信公众平台的开发吧~
其实微信公众平台开发没有想象中的那么困难,因为注册了微信公众平台帐号登录之后在开发者模式里有详细的文档,个人感觉介绍还是比较详细的。
微信公众平台订阅号和服务号的区别网上已经有N多的介绍了,这里就不再说了。从微信公众平台登录之后开始说起吧。
对于开发者来说,开发者模式是最好的选择了。因为在里面可以更自由更灵活的选择消息回复方式。编辑模式只能对特定的字符进行相应的消息回复。而且在开发者模式下可以灵活的创建自定义菜单(前提是你的帐号有提供相应的接口,需要微信认证,提供了APPID和SECRET后才能调用接口创建自定义菜单)。
进入开发者模式之后第一步是要填写URL和TOKEN进行验证。因为你既然要对用户发来的消息进行处理作更灵活的回复的话。首先你得能收到帐号粉丝发来的消息。而粉丝发来的消息首先会发到微信服务器,只有进行验证之后微信服务器才知道该把你帐号粉丝发来的消息转发到哪儿(就是你填的URL,你的服务器地址)。所以第一步需要验证,在你的服务器和微信服务器之间建立起连接。下面就来说说URL和TOKEN吧。
URL是要公网能访问到的地址。TOKEN则是自己设置的。想填什么就填什么,不过这个TOKEN在你的服务器代码里会用到。
当你填写了URL和TOKEN之后,微信服务器会向你填写的URL发送GET请求。该请求中会携带四个参数。微信开发者文档里有写。
在这里你填写的TOKEN会被集成到GET请求里的参数里,到你的处理该请求的代码段里就会被用到了。这里对每个参数也做了详细的说明。我也不需要废话了。
当微信服务器向你指定的URL发送请求之后就到你的代码段里了。首先你得获取请求中的上述四个参数(在你的servlet的doGET()方法里获取)。拿到四个参数之后按照文档里说的你要将TOKEN(你之前填写的,在你的代码段里就是一个变量的值了),timestamp,nonce三个参数进行字典排序然后sha1加密处理,处理之后可与微信服务器发来的参数中的signature进行对比(这一步相当于确保你的服务器安全,这样你的服务器才能确定请求是由微信服务器发来的)。若对比结果是一样的就说明该请求是微信服务器发来的,这时在你的代码段里返回取得的参数中的echostr就行了。若不一样就表示请求不是微信服务器发来的。下面就把获取参数及参数处理的java代码贴出来给大家分享一下~
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // response.getWriter().write("LOL"); String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); PrintWriter out = response.getWriter(); if (SignUtil.checkSignature(signature, timestamp, nonce)) { out.print(echostr); } out.close(); out = null; }
private static String token = "***你设置的token值*****"; public static boolean checkSignature(String signature,String timestamp,String nonce){ String[] arr = new String[] {token,timestamp,nonce}; Arrays.sort(arr); StringBuilder content = new StringBuilder(); for(int i=0;i<arr.length;i++){ content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try{ md = MessageDigest.getInstance("SHA-1"); byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); }catch(NoSuchAlgorithmException e){ e.printStackTrace(); } content = null; return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; }
//这部分代码是从柳峰大神的博客里拷过来的(还是得尊重版权) private static String byteToStr(byte[] byteArray){ String strDigest = ""; for(int i=0;i<byteArray.length;i++){ strDigest += byteToHexStr(byteArray[i]); } return strDigest; } private static String byteToHexStr(byte mByte){ char[] Digit = {‘0‘,‘1‘,‘2‘,‘3‘,‘4‘,‘5‘,‘6‘,‘7‘,‘8‘,‘9‘,‘A‘,‘B‘,‘C‘,‘D‘,‘E‘,‘F‘}; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4)& 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; }
按照以上代码对微信服务器发来的GET请求处理完毕之后正确返回echostr,微信服务器收到你返回的echostr后就能通过验证了。通过验证之后就能进行开发了。通过看后面的文档,你会发现微信服务器会把你帐号粉丝发来的信息通过POST方式,post到你填写的URL对应的Servlet里。后面的开发工作就可以从你的Servlet的dopost()方法开始……
先写到这,下次有时间继续写(对于微信公众平台开发的个人经验:多看文档)……
如果有问题可以在下面留言或者发邮件给我376751704@qq.com