引言:
最近的开发中用到了微信公众号,通过微信公众号接收一些文本、图片……然后对这些信息进行处理,效果类似下图:
一、申请公众号
公众号开发当然首先得有一个公众号,公众号分为两种:订阅号和服务号,这两个有什么区别那?可以参考博客:http://blog.csdn.net/kisscatforever/article/details/76971356
二、了解微信通信流程
我们关注微信公众号之后,就可以和公众号进行简单的通信,就像上面的那张图片,发送一个文本,公众号会根据发送的内容进行回复。
三、微信通信原理
我们需要知道通过公众号发送的消息不是直接请求到我们的网站服务器的,而是通过微信服务器进行转发,所以我们每一次和微信公众号互动都是通过微信的服务器做中间人,这样才能完成交互过程,交互是通过xml文件的格式进行传递的,如下图:
四、准备工具
上面的通信原理里讲到要通过微信服务器做中间人,因此我们需要做的一个工作就是把微信和我们的程序连接起来,在此需要一个拥有公网IP的服务器,例如:阿里云/腾讯云等,也可以使用花生壳等工具进行内容穿透。
因为小编是自己测试用,所以用的是花生壳,如果是正式开发,建议到阿里云或者腾讯云进行购买。
注册完花生壳之后,会赠送一个域名(对应着一个外网IP),里面有一个内网穿透的功能,有免费试用的,但需要付一部分流量费用,在这我们需要进行添加映射,把我们网站内网的发布地址和外网绑定。如下图:
注:映射到外网的80端口
五、微信接入,成为开发者
1、验证理论
开发者提交信息后,微信服务器将发送Get请求到填写的服务器地址URL上,Get请求携带参数如下:
验证流程:
2、验证代码(java):
(1)新建一个Controller类(例:)
@Controller
@RequestMapping("/weixin")
public class WeixinServlet extends HttpServlet {
@RequestMapping(value = "/index", method = {RequestMethod.GET})
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 接收微信服务器以Get请求发送的4个参数
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 (CheckUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr); // 校验通过,原样返回echostr参数内容
} else {
System.out.println("不是微信发来的请求!");
}
}
(2)验证用到了一个工具类(CheckUtil.java)
/**
* 校验的工具类 微信使用
*/
@Component
public class CheckUtil {
private static final String token = "health"; //这个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]);
}
// sha1加密
String temp = getSHA1String(content.toString());
return temp.equals(signature); // 与微信传递过来的签名进行比较
}
private static String getSHA1String(String data) {
// 使用commons codec生成sha1字符串
return DigestUtils.shaHex(data);
}
}
3、服务器配置
进入微信公众号,在开发--基本配置里,进行服务器地址配置
需要配置四个地方:
url:以http://或者https://开头,分别支持80端口和443端口 规则:http://外网IP:端口号/请求到处理get请求的方法。如下图中:前面对应我在外网映射的域名,后面对应的controller及get请求的方法。
Token:后台用于和timestamp、nonce按字典排序的字符串名称,用来做验证,和代码中设置的token一致
密钥:随机生成即可。
消息加解密方式:入门开发,暂且选择明文
点击提交,如果token验证成功,说明从微信服务器到我们的网站服务器打通了
总结:
成为开发者的关键就是把我们的网站服务器和微信服务器连接起来,这样才能够进行通信,重点是通过get请求方式对参数进行验证。
初来乍到,如果写的有问题的地方或者有什么建议的,欢迎留言!