因工作需要,要在微信公众平台上进行服务号的开发,现记录下开发流程。

环境

win7、IDEA14、Jdk1.7、微信公众平台测试号、外网域名

搭建基础开发环境

搭建web项目使用最简单的Servlet做消息入口。

创建WeChatServlet 继承 HttpServlet

在web.xml中配置sevlet的url路径

<servlet-name>wechat</servlet-name>
<servlet-class>cn.wh.wechat.WeChatServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>wechat</servlet-name>
    <url-pattern>/wechat</url-pattern>
</servlet-mapping>

在微信公众平台申请管理测试号

http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

登陆之后设置URL和token,URL就是外网域名/项目名/wechat,必须是80端口。

配置消息通道认证

WeChatServlet的doGet方法如下:

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {
    String signature = request.getParameter("signature");// 微信加密签名
    String timestamp = request.getParameter("timestamp");// 时间戳
    String nonce = request.getParameter("nonce");// 随机数
    String echostr = request.getParameter("echostr");// 随机字符串
    if (StringUtils.isBlank(signature) || StringUtils.isBlank(timestamp)|| StringUtils.isBlank(nonce)) {
        Writer out = response.getWriter();
        out.write("error...");
        out.flush();
        out.close();
        return;
    }
    // 重写totring方法,得到三个参数的拼接字符串
    List<String> list = new ArrayList<String>(3) {
        private static final long serialVersionUID = 2621444383666420433L;

        public String toString() {
            return this.get(0) + this.get(1) + this.get(2);
        }
    };
    list.add(TOKEN);
    list.add(timestamp);
    list.add(nonce);
    Collections.sort(list);// 排序
    String tmpStr = new MySecurity().encode(list.toString(),
            MySecurity.SHA_1);// SHA-1加密
    Writer out = response.getWriter();
    if (signature.equals(tmpStr)) {
        out.write(echostr);// 请求验证成功,返回随机码
    } else {
        out.write("");
    }
    out.flush();
    out.close();
}

在微信公众平台测试页面点击提交请求会到WeChatServlet的doGet方法,如果验证通过返回验证码。

以上是在微信公众平台接入开发模式。

后续会写一些开发中用到的消息处理机制。