教你3分钟快速开发微信公众号[订阅号][服务号]

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

GitHub仓库

下载wx-tools-1.0.0.jar

API开发文档

大三做过几个基于微信公众平台API的项目,感觉操作太繁琐,有时微信官方开发文档还有错!!

所以!wx-tools诞生了!

看过很多优秀的开源代码,特别是chanjarster的代码,优秀的设计思想让我迷糊灌顶。

不多说,让我带你快速有效可拓展的开发一个订阅号/服务号的后台。



到底有多简单?只需要3步即可~

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

2. 初始化WxConfigStorage 配置库和WxService(微信API调用接口)

3. 实现业务逻辑即可

如果有过开发过基于微信公众平台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>

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

  • 注意,导入后记得修改jar包的编码。window下默认读GBK,而框架本身是UTF-8。如果需要看源代码的务必手动修改编码。
  • 修改方式:在eclipse的工程下,对着jar包右键 –> Properties –> Encoding –> UTF-8

建立基本的package,如图。

添加wx-tools依赖的jar包。

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

maven pom.xml

 <!-- HttpClient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.3.6</version>
    </dependency>
    <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 -->
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>1.4.7</version>
    </dependency>
    <!-- IO -->
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>

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


二、初始化WxConfigStorage 配置库和WxService

本Demo采取的初始化策略是实现ServletContextListener接口,当tomcat启动时,会初始化配置。

当然,如果web项目是由Spring管理。也可以添加相应的Bean去加载初始化。这里就不多说了。

  1. 创建类实现ServletContextListener接口
/**
* 初始化配置库和微信API服务
* @author antgan
*/
public class DemoInitListener implements ServletContextListener {
 //配置库
 private WxConfigStorage config = null;
 //API Service
 private WxService wxService = null;

 public void contextInitialized(ServletContextEvent arg0) {
     System.out.println("------实例化config和service----------");
     //调用默认基于内存的配置库WxInMemoryConfigStorage的getInstance获得实例。注意这里是单例模式
     config = WxInMemoryConfigStorage.getInstance();
     //设置AppId
     config.setAppId("wxb1bff1627d37417b");
     //设置AppSecret
     config.setAppSecret("dd037d9b9b4eea00fba14167a9f3c75d");
     //设置token
     config.setToken("antgan");
     //设置临时资源文件存放路径
     config.setTmpDirFile(new File("e://test"));
     //设置永久资源文件存放路径
     config.setMaterialDirFile(new File("e://test"));
     //获得WxService实例。注意这里也是调用getInstance()方法获取唯一的业务对象。
     wxService = WxServiceImpl.getInstance();
     //注入配置库
     wxService.setWxConfigStorage(config);
 }

 public void contextDestroyed(ServletContextEvent arg0) {
     //...
 }
}
  1. web.xml指定tomcat容器启动时执行该类
<?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>
<listener>
 <display-name>DemoInitListener</display-name>
 <listener-class>wxtools.demo.init.DemoInitListener</listener-class>
</listener>
</web-app>

初始化配置库和注册服务已经ok了


三、实现业务逻辑

  • 我们模拟一个业务场景:某公众平台进行一项活动,只有关注本公众号有奖竞猜一个单词,回答正确的用户会接收到平台回复“恭喜你中奖了”。正确答案是:smart

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

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

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

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

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

  • WxConsts 类

    • 封装所有微信公众平台API的常量类型,包括接口请求路径,事件等。
  • WxConfigStorage 接口
    • 基本配置库。里面包含了AppId,AppSecret等信息。wx-tools已经提供了个基于内存管理的配置库WxInMemoryConfigStorage。开发者可以直接使用该类作为程序的配置库,亦或者自行实现WxConfigStorage接口,构建自己的持久化配置库,注意:配置库对于整个程序是单例的。
  • WxService 接口
    • 微信API Service,所有接口都从这里调用。实现类为WxServiceImpl。注意:WxServiceImpl对于整个程序是单例的。
  • WxMessageDuplicateChecker 接口
    • 消息重复检查器。默认的实现类 WxMessageInMemoryDuplicateChecker,如有有需要开发者可自行实现消息检查。
  • WxErrorException 类
    • 微信异常
  • WxErrorExceptionHandler 接口
    • 开发者可自行实现该接口,处理微信异常。


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

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

任务:识别是英文字母的消息,如果是,接收;否则,不接受。

/**
* 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, WxService wxService)
            throws WxErrorException {
        //可以使用wxService的微信API方法
        //可以在Handler和Interceptor传递消息,使用context上下文
        //可以实现自己的业务逻辑

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

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

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

/**
 * Demo 处理微信消息Handler
 * @author antgan
 */
public class DemoMessageHandler implements WxMessageHandler {
    //wxMessage 消息 | context 上下文 | WxService API对象
    public WxXmlOutMessage handle(WxXmlMessage wxMessage, Map<String, Object> context, WxService 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

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

/**
 * DemoServlet
 * 接收微信服务器请求
 * @author antgan
 */
@WebServlet("/wx")
public class DemoServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private WxConfigStorage config;
    private WxService service;
    //获取配置库和Service实例
    public DemoServlet() {
        config = WxInMemoryConfigStorage.getInstance();
        service = WxServiceImpl.getInstance();
        service.setWxConfigStorage(config);
    }

    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(WxServiceImpl.getInstance().checkSignature(signature, timestamp, nonce, echostr)){
            out.print(echostr);
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //返回消息给微信服务器
        PrintWriter out = null;
        try {
            out = response.getWriter();
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            //微信服务器推送过来的消息是XML格式。使用XStreamTransformer来反序列成WxXmlMessage对象
            WxXmlMessage wx=XStreamTransformer.fromXml(WxXmlMessage.class, request.getInputStream());
            System.out.println("消息:\n "+wx.toString());
            //实例化一个路由器,理论上路由器在整个程序中只有一个。路由规则可以有多个。
            WxMessageRouter router = new WxMessageRouter(WxServiceImpl.getInstance());
            //添加规则;这里的规则是指,只接收TEXT类型,同步接收,交给DemoMatcher处理,交给DemoInterceptor处理,交给DemoMessageHandler处理
            //注意!!每一个规则,必须由end()或者next()结束。不然不会生效。
            //end()是指消息进入该规则后不再进入其他规则。 而next()是指消息进入了一个规则后,如果满足其他规则也能进入,处理。
            router.rule().msgType(WxConsts.XML_MSG_TEXT).async(false).matcher(new DemoMatcher()).interceptor(new DemoInterceptor()).handler(new DemoMessageHandler()).end();
            //把消息传递给路由器进行处理,返回值是WxXmlMessage的子类或者null
            xmlOutMsg = router.route(wx);
            if(xmlOutMsg!=null)
                out.print(xmlOutMsg.toXml());//返回给用户。
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            out.close();
        }
    }

就是这么简单。

完成了这个活动的业务。



最后,这个框架未实现JS-SDK相关接口。如果需要支付等接口,可以wx-tools内置的http相关接口实现。依然很简单。

GitHub持续更新!敬请期待吧!

时间: 2024-10-11 12:38:22

教你3分钟快速开发微信公众号[订阅号][服务号]的相关文章

【fastweixin框架教程1】一分钟快速搭建微信公众平台JAVA服务器

目前网上有很多,一分钟微信公众平台教程,但很少有快速搭建微信公众平台服务器教程. 本文以fastweixin框架作为基础,以微信公众平台企业号作为目标,快速搭建微信公众平台服务器. 有关JAVA微信公众平台服务器框架介绍可以参考:http://my.oschina.net/ywbrj042/blog/402049 本文目标: 1.极其方便的实现微信公众平台服务端开发 2.完成服务器绑定 3.实现用户消息监听 本文技术要求:要求大家熟悉JAVA基本语言和servlet 很多大学同学可能对servl

一旦手把手教你开发微信公众平台

一旦手把手教你开发微信公众平台 目录 一旦手把手教你开发微信公众平台 目录 1 初步认识微信公众平台 2 如何申请微信公众平台测试号 3 接口配置信息 4 环境搭建以及验证消息真实性 1: 初步认识微信公众平台 微信公众平台,简称weChat.曾命名为"官号平台"和"媒体平台",最终定位为"公众平台",无疑让我们看到一个微信对后续更大的期望.和新浪微博早期从明星战略着手不同,微信此时已经有了亿级的用户,挖掘自己用户的价值,为这个新的平台增加更优质

[转]C#开发微信公众平台-就这么简单

本文转自:http://www.it165.net/pro/html/201403/11102.html 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微

[c#]asp.net开发微信公众平台(8)微信9大高级接口,自定义菜单

前7篇把最基础的消息接收和回复全做完了,  也把高级接口的入口和分拆处理写好了空方法,  此篇接着介绍微信的9大高级接口, 并着重讲解其中的自定义菜单. 微信9大接口为: 1.语音识别接口 2.客服接口 3.OAuth2.0 网页授权接口 4.生成带参数的二维码接口 5.获取用户地理位置接口 6.获取用户基本信息接口 7.获取关注者列表接口 8.用户分组接口 9.上传下载多媒体文件接口 具体介绍: 1. 语音识别 功能描述:通过语音识别接口,用户发送的语音,将同时给出语音识别出的文本内容. 实用

C#开发微信公众平台-就这么简单(转载)

写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样. 自己动手,丰衣足食. 服务号和订阅号 服务号是公司申请的微信公共账号,

【技巧】如何使用客户端发布BLOG+如何快速发布微信公众号文章

[技巧]如何使用客户端发布BLOG+如何快速发布微信公众号文章   1  BLOG文档结构图     2  前言部分   2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 如何使用客户端发布BLOG(重点) ② 如何快速发布微信公众号文章 ③ 如何批量上传图片到blog ④ 如何批量上传图片到微信公众号上     Tips: ① 本文在itpub(http://blog.itpub.net/26736162)

C#开发微信公众平台-就这么简单(附Demo)

写在前面 阅读目录: 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样. 自己动手,丰衣足食. 服务号和订阅号 服务号是公司申请的微

C#开发微信公众化平台

 C#开发微信公众化平台 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索走了很多弯路,这边总结下,希望初次接触微信公众平台的朋友别像当时的我一样. 自己动手,丰衣足食. 服务号和订阅号 服务号

C#开发微信公众平台

[转]C#开发微信公众平台-就这么简单 本文转自:http://www.it165.net/pro/html/201403/11102.html 写在前面 服务号和订阅号 URL配置 创建菜单 查询.删除菜单 接受消息 发送消息(图文.菜单事件响应) 示例Demo下载 后记 最近公司在做微信开发,其实就是接口开发,网上找了很多资料,当然园友也写了很多教程,但都是理论说了一大堆,实用指导或代码很少.如果你自己仔细研究下,其实就那么点东西,C#实现起来也很简单,原本不想写这篇文章的,但是本人当时摸索