开发微信公众号后台,原来这么简单?[微信公众号开发]

可能你不知道,有个框架叫wx-tools(小心翼翼地说)


Wx-tools是基于微信公众平台API的轻量级框架。 基于Wx-tools你可以开速开发一个订阅号/服务号的web应用后台。

博主最近终于有空!!已经更新到2.0.0啦!!

GitHub仓库

下载wx-tools-2.0.0.jar

wx-tools开发文档及demo

据说看到文档最后的都是真爱粉!

不多说!讲讲使用wx-tools开发轻量级公众号到底有多简单?

简单到哭



就三步!

1. 创建web工程,添加jar包及依赖

2. 配置wx.properties

3. 调用WxService来实现业务逻辑即可

【WxService是实现了微信公众平台API入口所以调用非常简单】

如果有过开发过基于微信公众平台API项目的小伙伴们,很容易上手哦!没有也没关系,戳这里看看官方文档入门


先定个功能小目标:现在要实现一个答题小功能。

一、 创建web工程,添加jar包及依赖

我这里使用的是maven构建项目,可以在eclipse创建web项目。

maven创建项目指令

mvn archetype:generate -DgroupId=wxtools.demo -DartifactId=demo -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeCatalog=local

注意:此指令创建的web工程版本是2.3的,比较低。可以修改web.xml,变成3.0

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>demo</display-name>
</web-app>

也可以直接用eclipse创建maven工程哦~

创建完毕后,导入wx-tools-2.0.0.jar

  • 注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。

    如果需要看源代码的务必手动修改编码。

    修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8

建立基本的package,如图。

添加wx-tools依赖的jar包。

如果使用maven构建项目,可以直接添加如下坐标下载依赖jar。

<!-- 补全依赖 -->
    <!-- 1:日志; java日志:slf4j,log4j,logback,common-logging
        slf4j接口/规范
        log4j,logback,common-logging,实现
        此处使用slf4j+logback -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.6</version>
    </dependency>

    <!-- 实现slf4j日志 -->
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>1.1.1</version>
    </dependency> 

    <!-- HttpClient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
    <!-- http://mvnrepository.com/artifact/org.apache.httpcomponents/httpmime -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpmime</artifactId>
        <version>4.3.6</version>
    </dependency>

    <!-- JSON -->
    <dependency>
        <groupId>org.codehaus.jackson</groupId>
        <artifactId>jackson-mapper-asl</artifactId>
        <version>1.9.13</version>
    </dependency>
    <!-- XML -->
    <!-- http://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.7</version>
    </dependency>
    <!-- IO -->
    <!-- http://mvnrepository.com/artifact/commons-io/commons-io -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

如果不是maven构建的项目,可以自行下载相应的jar包,放在WEB-INF/lib文件夹下

如果与项目中的jar包冲突或重复,只留一个就可以了~


二、 配置wx.properties

wx.properties是存放微信公众平台相关配置的。如AppId等。

搭好项目基本框架后,在src/main/resources或者src/main/Java下新建wx.properties,如上图

#配置如下,不要填错了哦!注意大小写。
wx.appId=wxb1bff1627d37417bcc
wx.appSecret=dd037d9b9b4eea00fba14167a9f3c75abc
wx.token=antgan
wx.aesKey=f82PVzQsKG5d8en3DwnZ8VVEoGInkmsWz3X3HsreEqe
wx.mchId=

三、调用WxService来实现业务逻辑

这里有必要介绍一下wx-tools的四大组件。

  • WxMessageRouter 消息路由器
  • WxMessageMatcher(接口) 消息匹配器
  • WxMessageInterceptor (接口) 消息拦截器
  • WxMessageHandler (接口) 消息处理器

这四大组件构成了对微信服务器发送过来的消息进行拓展性的处理。

其中,以上三个是接口,开发者可实现并构建自己的匹配器,拦截器,处理器。

更多的详情可以查看开发文档,对组件解释比较清楚。

此外,还有几个类需要注意一下

  • WxConsts 类

    封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。

  • WxConfig 类

    基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库。暂不支持自行拓展,如有需要持久化到数据库,需要自己实现。注意:配置库对于整个程序是单例的。

  • WxService 类

    微信统一的API Service入口,继承IService接口,所有接口都从这里调用。

  • WxErrorException 类

    微信异常

  • WxErrorExceptionHandler 接口

    开发者可自行实现该接口,处理微信异常

理清了关系后,开始创建自定义匹配器Matcher



1. 创建DemoMatcher.java 实现 WxMessageMatcher接口

目的:拦截消息,如果是答案(答案是smart),就允许通行。否则匹配失败。不允许通过。

/**
* Demo 简单的匹配器,可以用于更加复杂的消息验证操作
* @author antgan
*/
public class DemoMatcher implements WxMessageMatcher{
  //答案是smart,如果匹配smart返回true;反之,false。
  public boolean match(WxXmlMessage message) {
      if(message.getContent().equals("smart")){
        return true;
      }
      return false;
  }
}

2. 创建DemoInterceptor.java 实现 WxMessageInterceptor接口

目的:拦截消息,验证用户条件,需要满足关注3天以上。

/**
 * Demo 拦截器,可以做身份验证,权限验证等操作。
 * @author antgan
 */
public class DemoInterceptor implements WxMessageInterceptor{
    public boolean intercept(WxXmlMessage wxMessage, Map<String, Object> context, IService wxService)
            throws WxErrorException {
        //可以使用wxService的微信API方法
        //可以在Handler和Interceptor传递消息,使用context上下文
        //可以实现自己的业务逻辑

        //这里就不编写验证关注三天以上的用户了
        if(/*用户关注时长大于3天*/){
            return true;
        }
        return false;
    }
}

3. 创建类DemoHandler.java 实现 WxMessageHandler接口

目的:如果满足以上条件的用户消息,返回字符串“恭喜你中奖了”

/**
 * Demo 处理微信消息Handler
 * @author antgan
 */
public class DemoHandler implements WxMessageHandler {
    //wxMessage 消息 | context 上下文 | WxService API对象
    public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, IService wxService) throws WxErrorException {
        WxXmlOutMessage xmlOutMsg = null;
        //必须以build()作为结尾,否则不生效。
        if(wxMessage.getMsgType().equals(WxConsts.XML_MSG_TEXT)){
            xmlOutMsg = WxXmlOutMessage.TEXT().content("恭喜你中奖了").toUser(wxMessage.getFromUserName()).fromUser(wxMessage.getToUserName()).build();
        }
        return xmlOutMsg;
    }
}

4. 创建servlet,名为DemoServlet.java

当然你也可以使用SpringMVC,是一样的。对应的是Controller

目的:接收微信服务器发来的消息,并传入指定路由器中。

/**
 * <pre>
 * Demo Servlet
 * 如果使用的是SpringMVC,也是类似这样的写法~
 *
 * 注意:WxConfig请调用getInstance()
 * 因为对于全局是唯一的。采用单例模式。
 * </pre>
 *
 * @author antgan
 * @date 2016/12/15
 *
 */
@WebServlet("/wx")
public class DemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    // 实例化 统一业务API入口
    private IService iService = new WxService();

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 验证服务器的有效性
        PrintWriter out = response.getWriter();
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        if (iService.checkSignature(signature, timestamp, nonce, echostr)) {
            out.print(echostr);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        // 返回消息给微信服务器
        PrintWriter out = response.getWriter();

        // 创建一个路由器
        WxMessageRouter router = new WxMessageRouter(iService);
        try {
            // 微信服务器推送过来的是XML格式。
            WxXmlMessage wx = XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
            System.out.println("消息:\n " + wx.toString());
            // 添加规则;这里的规则是所有消息都交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoHandler处理
            // 注意!!每一个规则,必须由end()或者next()结束。不然不会生效。
            // end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。
            router.rule().matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoHandler())
                    .end();
            // 把消息传递给路由器进行处理
            WxXmlOutMessage xmlOutMsg = router.route(wx);
            if (xmlOutMsg != null)
                out.print(xmlOutMsg.toXml());// 因为是明文,所以不用加密,直接返回给用户。
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }
}


就是这么简单。通过可定制的Matcher,Interceptor,Handler可以实现更加复杂的业务需求。

对于一条来自微信服务器发来的消息,Interceptor和Handler其实定义多个来同时处理。更加灵活好用。更多详情还是得看wx-tools文档。讲得详细。



最后效果图。


博主有话说

大学的尾巴悄悄来临,我也顺利找到了实习和工作。闲暇期间,想起wx-tools的问题还没解决。

(舍友写项目用了我的wx-tools出现了线程爆炸,难以使用,文档不全等现象。但忙于找工作就放着wx-tools不管了)

终于有时间了,静下心来。看看别人优秀的源代码。心想着我的wx-tools就应该是简单易用,轻量级可拓展。于是,wx-tools-2.0.0.jar又诞生了。

相比之前的wx-tools。这个版本比较大的变化如下:

  • 更简化的配置(wx.properties文件来配置)。
  • 更加简单简约的使用方法(链式编程!酷炫!)
  • 去掉了线程池。(就是这玩意导致舍友项目爆炸了)
  • 去掉了鸡肋的重复消息检查器(Checker)。(当初为什么要加检查重复消息呢?黑人问号???)
  • jssdk的支持。(部分jssdk-api支持了,但是还是不支持支付和微信小店,不要问我为什么!因为我没账号来调试开发!!!辣鸡测试号不提供这样的调试。)

哎!其实对比了几个微信公众平台开发框架,wx-tools走的路线完全不同。不知道大家喜不喜欢呢~ 喜欢希望你给我star咯~wx-tools Github戳这里!!给星星!爱你么么哒!

我也创了个QQ群(570937047),欢迎大家加入,讨论JAVA开发或者对酒当歌。

最后!欢迎大家提BUG或者pull request!小弟能力不足!就这样了!

时间: 2024-10-12 19:22:16

开发微信公众号后台,原来这么简单?[微信公众号开发]的相关文章

微信公众号教程(3)微信公众平台群发消息

微信公众平台最常用到的就是群发消息,这种一对多.几乎百分百到达的传播方式,取代了短信群发,并且具有多媒体形态,还可以直接引导转化.因此编辑一条好的内容,挑选恰当的时候发送,既可以给用户带来有价值的信息,又有机会给公众账号带来新的关注和收益.本期将重点为大家讲解素材管理该怎么玩,群发消息需要注意些什么. 第三章 微信公众平台群发消息 一.微信公众平台后台素材管理   点击公众平台后台导航的"素材管理",或者在群发消息或者与用户聊天页面时,选择发送多媒体内容时快捷进入.这个页面主要是用来管

thinkphp开发微信小程序后台流程

thinkphp开发微信小程序后台流程,简单分享一下微信开发流程 1,注册微信小程序账号 2,注册好后,登陆微信小程序,下载微信小程序开发工具 3,用thinkphp开发企业后台,前台数据用json返回,赋值给微信小程序 需要注意的是要绑定(www.hq08.cn)已经备案的域名,还域名要https 的 原文地址:https://www.cnblogs.com/96net/p/9403506.html

Spring Boot 开发微信公众号后台

Hello 各位小伙伴,松哥今天要和大家聊一个有意思的话题,就是使用 Spring Boot 开发微信公众号后台. 很多小伙伴可能注意到松哥的个人网站(http://www.javaboy.org)前一阵子上线了一个公众号内回复口令解锁网站文章的功能,还有之前就有的公众号内回复口令获取超 2TB 免费视频教程的功能(免费视频教程),这两个都是松哥基于 Spring Boot 来做的,最近松哥打算通过一个系列的文章,来向小伙伴们介绍下如何通过 Spring Boot 来开发公众号后台. 1. 缘起

PHP微信公众号后台开发(Yii2实现)

本文内容较多,包括微信接入.获取微信用户信息.微信支付.JSSDK配置参数获取等部分.如果读者对微信开发没有一个主观上的认识,那么建议读者先研读微信公众平台开发者文档,然后再阅读本文,效果更佳! 微信开发的完整例子已经整理在Github,欢迎查看: yii2-wechat-demo.[八宝粥的博客] 接入微信 Yii2后台配置 1.在app/config/params.php中配置token参数 return [ //微信接入 'wechat' =>[ 'token' => 'your tok

Python微信公众号后台开发&lt;003&gt;:自定义菜单

有同学问道微信公众号后台开发的自定义菜单怎么实现? 这个问题本来想放到后面的,因为的确对公众号的影响挺明显的, 因为开启后台服务,公众号的自定义菜单就不见了,很影响使用, 也有同学问这个问题,就提前了,后面如果有进展会进行更新. 开发文档: https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Explanation_of_interface_privileges.html 订阅号账号分类及权限 订阅号分为个人号和企业订

微信公众号可快速创建“门店小程序” 不用开发

“门店小程序”是啥?“门店小程序”是小程序的一项新能力.无需开发,商户就可在微信公众号后台快速创建“门店小程序”.这个小程序类似一张“店铺名片”,可以展示线下门店名称.简介.营业时间.联系方式.地理位置和图片等门店信息,并支持在公众号自定义菜单.图文消息和模板消息等场景中使用. 它长这样: (左侧为“门店小程序”示意图,将来商户可根据需要为门店小程序快速配置卡券.支付功能) “门店小程序”和你们平时用到的小程序不同点在于: 页面标准化——便于用户识别:指向性明确——是一个“门店”:创建简单——公

django搭建微信公众号后台——验证(7.19)

php研究了好几个框架,感觉还是django强大,用起来也顺手,虽然django在微信后台这方面用得没有那么普及,但还是打算试一试,拿我自己的公众号试手. 今天主要是创建项目然后验证通过,代码还是放在pythonanywhere上. 具体怎么创建就不写了,之前有过一篇文章,这里开发用了星星的wechat-python-sdk. 在微信后台填了网址之后,在urls.py设置路由 url(r'^$', index, name='index'), 在views.py里进行验证: #-*- coding

对柳峰博主的微信公众号后台示例的部分重构

柳峰博主的专栏(http://blog.csdn.net/column/details/wechatmp.html)和王信平博主的专栏(http://www.cnblogs.com/wangshuo1/)对微信公众号开发已经做了比较详尽的阐述,基本上照搬,就可以做出第一个微信公众号后台应用.但是在『照搬』的过程中,发现有些地方总是觉得别扭,由着完美主义者的性格使然,对以下这几个地方做个小优化吧. 一.区别消息和响应 原来的消息类(用户发给后台)和响应类(后台回给用户)有这些: 我改成了这样的:

公众号后台开发

1.准备 1.准备服务 与微信对接的url要具备以下条件: (1)在公网上能够访问 (2)端口只支持80端口 在这里如果是公网能够访问的服务最好,也可以通过花生壳或者其他外网映射工具进行映射,比如ngrok. 2.数据交互原理 开发模式与编辑模式是互斥的,打开开发模式的时候,编辑模式的自动回复与自定义菜单失效:打开编辑模式的自动回复或者自定义菜单的时候开发模式会失效. 开发模式的数据交互原理如下: 我们需要开发的任务就是维信公众号服务器,包括业务逻辑.身份验证等操作. 2.接入后台 参考公众号开