导图社区 微信公众号开发步骤
微信公众号开发步骤基础教学课件,内容非常简单,想学的朋友可以在这个导图基础上在丰富一下。
编辑于2020-12-13 02:35:44微信公众号开发步骤
使用框架:wx-tools 构建工具:maven
项目搭建
maven org.apache.httpcomponents httpclient 4.3.6 org.apache.httpcomponents httpmime 4.3.6 org.codehaus.jackson jackson-mapper-asl 1.9.13 com.thoughtworks.xstream xstream 1.4.7 commons-io commons-io 2.4 wx.properties 在src/main/resources或者src/main/Java下新建wx.properties
wx.appId=wxb1bff1627d37417bcc wx.appSecret=dd037d9b9b4eea00fba14167a9f3c75abc wx.token=antgan wx.aesKey=f82PVzQsKG5d8en3DwnZ8VVEoGInkmsWz3X3HsreEqe wx.mchId= wx.apiKey=
调用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; } }</string,>
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; } }</string,>
4. 创建servlet,名为DemoServlet.java
目的:接收微信服务器发来的消息,并传入指定路由器中。
/** * <pre class="brush:java;"> * 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 {