前言
最近完成了一整套的微信公众号开发,赶忙来分享一下。刚好专栏申请下来了,就在专栏里写点东西吧。我本身是做javaweb开发的,现在工作做的是android,之前可谓是从来没有做过这个东西,官网的文档写的还是不错的,不过一开始入门的话难免有些摸不到头脑,看了这个再去看文档继续深度开发的话事半功倍;
注册帐号什么的就不说了,那方面是个人就会注册。建议是去弄个开发者测试帐号,因为功能都是一样的,而且开发者帐号的权限还比较多。如果自身有公司资料的话也可以便审核资料,边用公众号学习嘛,后台代码都是一样的,开发完成之后只需要改一下后台配置即可,根本不用动代码。当然了,我是说的在代码写的漂亮的前提下;
附上2个地址,分别是公众号和测试号的地址:
正文
注册登录之后,进入正文,配置方面正式版和测试帐号是差不多的,我就以正式版为例了;
首先设置开发者密码(appsecret)和ip白名单,这个密码生成之后你就复制粘贴保存好,这个之后就看不到了,除非重置新密码才能在看到。ip白名单指的是你的服务允许访问的连接ip,这里暂时设置的是我的服务器的ip地址;
服务器地址指向的是你处理微信请求的地址,使用全称,http://。。。,这个地址必须是被设置了ip地址白名单的地址才可以。配置好之后这个地址就会是以后微信所有网络请求访问的地址了。而且微信默认访问80端口,不要使用其他端口。令牌token的话自己随意设置就好了,通用语配置服务器时的验证操作;消息加密密钥也是随机生成的,这个用的时候来复制就是了;
启用的时候回去url地址发送一个请求,这个后台要处理一下,其实也很简单,就是比对一下token,看一下是不是自己的验证请求,然后把他发送的一个随机码再给他发回去就可以了,代码如下:
@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //先验证是否是配置token的url if (Sign.checkSignature(request.getParameter("signature"), request.getParameter("timestamp"), request.getParameter("nonce"))) { Utils.out(response, request.getParameter("echostr"));//微信公众号验证Token,只需要将传入的echostr参数原封不动输出即可 return;} }
我后台这边就是简单的用servlet写的,道理都是一样的,对微信信息的处理主要集中在控制层和业务层;这里处理一个get请求,只需要写一个工具类,来验证一下微信的签名就可以了;
package com.wx.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 微信签名验证工具类 * @author Baidu */ public class Sign { // 与接口配置信息中的Token要一致 private static String wxToken = "yoursToken"; /** * 微信验证签名 * @param signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 * @param timestamp 时间戳 * @param nonce 随机数 * @return 是否正确 */ public static boolean checkSignature(String signature, String timestamp,String nonce) { // 1.将token、timestamp、nonce三个参数进行字典序排序 String[] arr = new String[] { wxToken, timestamp, nonce }; Arrays.sort(arr); // 2. 将三个参数字符串拼接成一个字符串进行sha1加密 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"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节数组转换为十六进制字符串 * @param byteArray 字节数组 * @return String */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * @param mByte 字节对象 * @return String */ 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; } }如果验证通过,前端会显示配置成功,那么就代表配置完成,可以开始下一步的开发了!