接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置 2、验证服务器地址的有效性 3、依据接口文档实现业务逻辑
好我们就开始:
1.登录微信公众平台,进入基本配置
修改配置,将自己的服务器的URL地址,配置在此处:
填写完成后,【先不用 提交】,先进行第二步 服务器端代码的配置
注意:
如果想使用 自定义菜单等相关接口权限,需要注意:
可以看到 个人订阅号是没有 使用自定义菜单的相关接口能力的,如果需要使用的话,需要注册服务号或使用测试号:
那么 在服务器端代码中使用的 测试AppId/Secret/Token等都需要重新设置为测试号的相关信息!
2.服务器端配置相关
服务器端相关代码 思路:
1>首先搭建web项目,使用maven管理架包,项目架构用spring+spring MVC+hibernate,pom.xml文件中,关于微信端开发的配置就是,就是使用weixin-java-tools项目使用java进行微信端开发
<!-- 微信开发工具包 --> <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-common</artifactId> <version>2.2.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp --> <dependency> <groupId>com.github.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>2.2.0</version> </dependency>
完整pom.xml文件信息
1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 2 <modelVersion>4.0.0</modelVersion> 3 <groupId>com.sxd.wx1</groupId> 4 <artifactId>wxSecond</artifactId> 5 <version>0.0.1-SNAPSHOT</version> 6 <packaging>war</packaging> 7 <build> 8 <plugins> 9 <plugin> 10 <artifactId>maven-war-plugin</artifactId> 11 <configuration> 12 <version>3.0</version> 13 </configuration> 14 </plugin> 15 </plugins> 16 </build> 17 18 <properties> 19 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 20 <spring.version>4.1.4.RELEASE</spring.version> 21 <hibernate.version>4.3.8.Final</hibernate.version> 22 </properties> 23 24 <dependencies> 25 <!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api --> 26 <dependency> 27 <groupId>javax.persistence</groupId> 28 <artifactId>persistence-api</artifactId> 29 <version>1.0</version> 30 </dependency> 31 <!-- 进行加密操作 --> 32 <dependency> 33 <groupId>commons-codec</groupId> 34 <artifactId>commons-codec</artifactId> 35 <version>1.10</version> 36 </dependency> 37 38 <!-- https://mvnrepository.com/artifact/dom4j/dom4j --> 39 <dependency> 40 <groupId>dom4j</groupId> 41 <artifactId>dom4j</artifactId> 42 <version>1.6.1</version> 43 </dependency> 44 45 46 <!-- 微信开发工具包 --> 47 48 <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common --> 49 <dependency> 50 <groupId>com.github.binarywang</groupId> 51 <artifactId>weixin-java-common</artifactId> 52 <version>2.2.0</version> 53 </dependency> 54 <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp --> 55 <dependency> 56 <groupId>com.github.binarywang</groupId> 57 <artifactId>weixin-java-mp</artifactId> 58 <version>2.2.0</version> 59 </dependency> 60 61 62 <!-- junit --> 63 <dependency> 64 <groupId>junit</groupId> 65 <artifactId>junit</artifactId> 66 <version>4.12</version> 67 <scope>test</scope> 68 </dependency> 69 70 <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper --> 71 <dependency> 72 <groupId>com.github.pagehelper</groupId> 73 <artifactId>pagehelper</artifactId> 74 <version>4.1.4</version> 75 </dependency> 76 77 <!-- spring --> 78 <dependency> 79 <groupId>org.springframework</groupId> 80 <artifactId>spring-core</artifactId> 81 <version>${spring.version}</version> 82 </dependency> 83 84 <dependency> 85 <groupId>org.springframework</groupId> 86 <artifactId>spring-beans</artifactId> 87 <version>${spring.version}</version> 88 </dependency> 89 90 <dependency> 91 <groupId>org.springframework</groupId> 92 <artifactId>spring-context</artifactId> 93 <version>${spring.version}</version> 94 </dependency> 95 96 <dependency> 97 <groupId>org.springframework</groupId> 98 <artifactId>spring-tx</artifactId> 99 <version>${spring.version}</version> 100 </dependency> 101 102 <dependency> 103 <groupId>org.springframework</groupId> 104 <artifactId>spring-web</artifactId> 105 <version>${spring.version}</version> 106 </dependency> 107 108 <dependency> 109 <groupId>org.springframework</groupId> 110 <artifactId>spring-test</artifactId> 111 <version>${spring.version}</version> 112 <scope>test</scope> 113 </dependency> 114 115 <!-- 使用SpringMVC需配置 --> 116 <dependency> 117 <groupId>org.springframework</groupId> 118 <artifactId>spring-webmvc</artifactId> 119 <version>${spring.version}</version> 120 </dependency> 121 <!-- spring cglib 代理 --> 122 <dependency> 123 <groupId>cglib</groupId> 124 <artifactId>cglib</artifactId> 125 <version>2.2.2</version> 126 </dependency> 127 <!-- 关系型数据库整合时需配置 如hibernate jpa等 --> 128 <dependency> 129 <groupId>org.springframework</groupId> 130 <artifactId>spring-orm</artifactId> 131 <version>${spring.version}</version> 132 </dependency> 133 134 <!-- hibernate --> 135 <dependency> 136 <groupId>org.hibernate</groupId> 137 <artifactId>hibernate-core</artifactId> 138 <version>${hibernate.version}</version> 139 </dependency> 140 141 <dependency> 142 <groupId>org.hibernate</groupId> 143 <artifactId>hibernate-ehcache</artifactId> 144 <version>${hibernate.version}</version> 145 </dependency> 146 147 <!-- 二级缓存ehcache --> 148 <dependency> 149 <groupId>net.sf.ehcache</groupId> 150 <artifactId>ehcache</artifactId> 151 <version>2.9.0</version> 152 </dependency> 153 154 <!-- log4j --> 155 <dependency> 156 <groupId>log4j</groupId> 157 <artifactId>log4j</artifactId> 158 <version>1.2.17</version> 159 </dependency> 160 161 <!-- mysql连接 --> 162 <dependency> 163 <groupId>mysql</groupId> 164 <artifactId>mysql-connector-java</artifactId> 165 <version>5.1.34</version> 166 </dependency> 167 168 <!-- c3p0数据源 --> 169 <dependency> 170 <groupId>com.mchange</groupId> 171 <artifactId>c3p0</artifactId> 172 <version>0.9.5-pre10</version> 173 </dependency> 174 175 <!-- json --> 176 177 <!-- 1号 --> 178 <dependency> 179 <groupId>com.fasterxml.jackson.core</groupId> 180 <artifactId>jackson-core</artifactId> 181 <version>2.8.1</version> 182 </dependency> 183 <!-- 2号 --> 184 <dependency> 185 <groupId>com.fasterxml.jackson.core</groupId> 186 <artifactId>jackson-annotations</artifactId> 187 <version>2.8.1</version> 188 </dependency> 189 190 <!-- 3号 --> 191 <dependency> 192 <groupId>com.fasterxml.jackson.core</groupId> 193 <artifactId>jackson-databind</artifactId> 194 <version>2.8.1</version> 195 <exclusions> 196 <exclusion> 197 <artifactId>jackson-core</artifactId> 198 <groupId>com.fasterxml.jackson.core</groupId> 199 </exclusion> 200 <exclusion> 201 <artifactId>jackson-annotations</artifactId> 202 <groupId>com.fasterxml.jackson.core</groupId> 203 </exclusion> 204 </exclusions> 205 </dependency> 206 207 <!-- 4号 --> 208 <dependency> 209 <groupId>com.google.code.gson</groupId> 210 <artifactId>gson</artifactId> 211 <version>2.7</version> 212 </dependency> 213 <!-- 5号 --> 214 <dependency> 215 <groupId>net.sf.json-lib</groupId> 216 <artifactId>json-lib</artifactId> 217 <version>2.4</version> 218 <classifier>jdk15</classifier> 219 </dependency> 220 <!-- 5号json-lib还需要以下依赖包 --> 221 <dependency> 222 <groupId>commons-lang</groupId> 223 <artifactId>commons-lang</artifactId> 224 <version>2.5</version> 225 </dependency> 226 <dependency> 227 <groupId>commons-beanutils</groupId> 228 <artifactId>commons-beanutils</artifactId> 229 <version>1.9.2</version> 230 </dependency> 231 <dependency> 232 <groupId>commons-collections</groupId> 233 <artifactId>commons-collections</artifactId> 234 <version>3.2.1</version> 235 </dependency> 236 <dependency> 237 <groupId>commons-logging</groupId> 238 <artifactId>commons-logging</artifactId> 239 <version>1.2</version> 240 </dependency> 241 242 <!-- aop --> 243 <dependency> 244 <groupId>org.aspectj</groupId> 245 <artifactId>aspectjweaver</artifactId> 246 <version>1.8.4</version> 247 </dependency> 248 249 <!-- servlet --> 250 <dependency> 251 <groupId>javax.servlet</groupId> 252 <artifactId>servlet-api</artifactId> 253 <version>3.0-alpha-1</version> 254 <scope>provided</scope> 255 </dependency> 256 257 <dependency> 258 <groupId>javax.servlet</groupId> 259 <artifactId>jstl</artifactId> 260 <version>1.2</version> 261 </dependency> 262 <!-- guava 集合的交并操作 --> 263 <dependency> 264 <groupId>com.google.guava</groupId> 265 <artifactId>guava</artifactId> 266 <version>19.0</version> 267 </dependency> 268 <dependency> 269 <groupId>com.google.guava</groupId> 270 <artifactId>guava-collections</artifactId> 271 <version>r03</version> 272 </dependency> 273 274 <!-- 文件上传 --> 275 <dependency> 276 <groupId>commons-fileupload</groupId> 277 <artifactId>commons-fileupload</artifactId> 278 <version>1.3.1</version> 279 </dependency> 280 281 </dependencies> 282 </project>
2>服务器端代码:
CenterController.java
1 package com.sxd.controller; 2 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 import java.util.Map; 7 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import me.chanjar.weixin.common.api.WxConsts; 12 import me.chanjar.weixin.common.bean.menu.WxMenu; 13 import me.chanjar.weixin.common.bean.menu.WxMenuButton; 14 import me.chanjar.weixin.common.exception.WxErrorException; 15 import me.chanjar.weixin.common.session.WxSessionManager; 16 import me.chanjar.weixin.mp.api.WxMpConfigStorage; 17 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage; 18 import me.chanjar.weixin.mp.api.WxMpMessageHandler; 19 import me.chanjar.weixin.mp.api.WxMpMessageRouter; 20 import me.chanjar.weixin.mp.api.WxMpService; 21 import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl; 22 import me.chanjar.weixin.mp.bean.WxMpXmlMessage; 23 import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; 24 import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage; 25 26 import org.springframework.context.annotation.Lazy; 27 import org.springframework.stereotype.Controller; 28 import org.springframework.web.bind.annotation.RequestMapping; 29 import org.springframework.web.bind.annotation.ResponseBody; 30 31 import com.sxd.util.ButtonMenuUtils; 32 import com.sxd.util.Dom4jUtils; 33 import com.sxd.util.RuleManager; 34 35 36 /** 37 * 中央处理器 38 * 39 * @author Administrator 40 * 41 */ 42 @Controller 43 @RequestMapping("centercontroller") 44 public class CenterController { 45 46 public WxMpInMemoryConfigStorage config;//微信基本配置信息+Access Token 47 public static WxMpService wxMpService; //微信API的Service 48 public WxMpMessageRouter wxMpMessageRouter;//微信消息路由器 49 public static String accessToken; 50 51 52 /** 53 * 1.处理微信首次配置信息+创建按钮 【首次创建后可以 注释initWeiXin()方法 不用每次都执行】 54 * 2.验证接口配置信息 【如果过时重新获取】 55 * 3.消息转发---中转站 【每次微信端的信息都会从微信服务器转发到这里,然后从这里转发出去】 56 * @param request 57 * @param response 58 * @return 59 * @throws IOException 60 * @throws WxErrorException 61 */ 62 @RequestMapping("test") 63 public String test1(HttpServletRequest request, HttpServletResponse response) throws IOException, WxErrorException{ 64 /** 65 * 1.处理微信首次配置信息+创建按钮 66 */ 67 // initWeiXin(); 68 /** 69 * 2.验证接口配置信息 如果过时重新获取 70 */ 71 String echostr = request.getParameter("echostr"); 72 if(echostr != null){ 73 return "forward:/tokenCheckController/tokenCheck.htmls"; 74 } 75 76 /** 77 * 3.消息转发---中转站 每次微信端的消息都会来到这里进行分发 78 */ 79 WxMpXmlMessage message = WxMpXmlMessage.fromXml(request.getInputStream()); 80 String msgType = message.getMsgType(); 81 Dom4jUtils dom4El = new Dom4jUtils(); 82 String url = dom4El.msgDispather(msgType); 83 if(url != null){ 84 request.setAttribute("message", message); 85 return url; 86 } 87 88 response.getWriter().write("无法辨识消息类型!!"); 89 return null; 90 91 } 92 93 94 /** 95 * 初始化 微信相关配置 并且创建按钮 96 * @throws WxErrorException 97 */ 98 public void initWeiXin() throws WxErrorException{ 99 config = new WxMpInMemoryConfigStorage(); 100 config.setAppId("wx4848686e5bd4efce"); // 设置微信公众号的appid 101 config.setSecret("fc37ce345b3612d615d4ead83f21bdff"); // 设置微信公众号的app corpSecret 102 config.setToken("F0932398023"); // 设置微信公众号的token 103 104 wxMpService = new WxMpServiceImpl(); 105 wxMpService.setWxMpConfigStorage(config);//创建自己的service 106 if(config.getAccessToken() == null){ 107 accessToken = wxMpService.getAccessToken(true);//手动刷新获取了Access Token 108 } 109 //创建菜单按钮 110 ButtonMenuUtils bm = new ButtonMenuUtils(); 111 WxMenu menu = bm.createButtonMenu(); 112 wxMpService.getMenuService().menuCreate(menu); 113 } 114 115 }
TokenCheckController.java
1 package com.sxd.util.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 import org.springframework.stereotype.Controller; 9 import org.springframework.web.bind.annotation.RequestMapping; 10 import org.springframework.web.bind.annotation.ResponseBody; 11 12 import com.sxd.util.TokenCheckUtils; 13 14 @Controller 15 @RequestMapping("tokenCheckController") 16 public class TokenCheckController { 17 18 @RequestMapping("tokenCheck") 19 public void tokenCheck(HttpServletRequest request,HttpServletResponse response) throws IOException{ 20 String signature = request.getParameter("signature"); 21 String timestamp = request.getParameter("timestamp"); 22 String nonce = request.getParameter("nonce"); 23 String echostr = request.getParameter("echostr"); 24 25 TokenCheckUtils tokenCheckUtils = new TokenCheckUtils(); 26 echostr = tokenCheckUtils.tokenCheck(signature, timestamp, nonce, echostr); 27 28 response.getWriter().write(echostr); 29 } 30 }
TokenCheckUtils.java
1 package com.sxd.util; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.List; 6 7 import org.apache.commons.codec.digest.DigestUtils; 8 9 /** 10 * 验证接口配置信息 11 * @author SXD 12 * 13 */ 14 public class TokenCheckUtils { 15 16 /** 17 * 验证接口配置信息 18 * 加密/校验流程如下: 19 1. 将token、timestamp、nonce三个参数进行字典序排序 20 2. 将三个参数字符串拼接成一个字符串进行sha1加密 21 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 22 */ 23 public String tokenCheck(String signature,String timestamp,String nonce,String echostr){ 24 String token = "F0932398023"; 25 List<String> list = new ArrayList<>(); 26 list.add(timestamp); 27 list.add(token); 28 list.add(nonce); 29 30 Collections.sort(list);//1.字典排序 31 32 String str = DigestUtils.sha1Hex(list.get(0)+list.get(1)+list.get(2));//2.sha1加密 33 if(signature.equals(str)){//3.判断是否微信信息 此处判断echostr!=null是为了进行下面的操作不影响此处原本的效果 34 return echostr; 35 // 也就是说 如果echostr!=null,那么此次的请求是在验证是否成为开发者的;否则就是其他的微信请求,不用跳出程序 36 } 37 return null; 38 } 39 }
msgTypeDispather.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <WxDispather> 3 <WxMsgType type="text" url="forward:/textMsgController/msgDeal.htmls"></WxMsgType> 4 <WxMsgType type="image" url="forward:/imageMsgController/msgDeal.htmls"></WxMsgType> 5 <WxMsgType type="voice" url="forward:/voiceMsgController/msgDeal.htmls"></WxMsgType> 6 <WxMsgType type="video" url="forward:/videoMsgController/msgDeal.htmls"></WxMsgType> 7 <WxMsgType type="shortvideo" url="forward:/shortvideoMsgController/msgDeal.htmls"></WxMsgType> 8 <WxMsgType type="location" url="forward:/locationMsgController/msgDeal.htmls"></WxMsgType> 9 <WxMsgType type="link" url="forward:/linkMsgController/msgDeal.htmls"></WxMsgType> 10 <WxMsgType type="event" url="forward:/eventMsgController/msgDeal.htmls"></WxMsgType> 11 12 </WxDispather>
Dom4jUtils.java
1 package com.sxd.util; 2 3 import java.util.List; 4 5 import org.dom4j.Document; 6 import org.dom4j.DocumentException; 7 import org.dom4j.Element; 8 import org.dom4j.io.SAXReader; 9 10 import com.sxd.test.util.Dom4jTest; 11 12 /** 13 * 根据微信端发送的消息,解析出消息类型,加载配置文件,根据消息类型,将消息转发到对应 14 * 消息类型对应的Controller中进行响应处理 15 * @author SXD 16 * 17 */ 18 public class Dom4jUtils { 19 20 /** 21 * 使用dom4j解析消息类型配置文件,解析获得的相对应的服务器端的地址,进行访问 22 * @param msgType 23 * @return 24 */ 25 public String msgDispather(String msgType){ 26 SAXReader sReader = new SAXReader(); 27 Document document; 28 try { 29 document = sReader.read(Dom4jUtils.class.getResourceAsStream("/msgTypeDispather.xml")); 30 List<Element> list = document.getRootElement().elements(); 31 for (Element element : list) { 32 if(msgType.equals(element.attributeValue("type"))){ 33 return element.attributeValue("url"); 34 } 35 } 36 } catch (DocumentException e) { 37 e.printStackTrace(); 38 } 39 return null; 40 } 41 }
EventMsgController.java
1 package com.sxd.message.controller; 2 3 import java.util.stream.Stream; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 import me.chanjar.weixin.common.exception.WxErrorException; 9 import me.chanjar.weixin.mp.bean.WxMpXmlMessage; 10 11 import org.springframework.stereotype.Controller; 12 import org.springframework.web.bind.annotation.RequestMapping; 13 14 import com.sxd.material.PermanentMaterialManager; 15 16 /** 17 * event事件的服务端 18 * @author SXD 19 * 20 */ 21 @Controller 22 @RequestMapping("eventMsgController") 23 public class EventMsgController { 24 25 26 @RequestMapping("msgDeal") 27 public void msgDeal(HttpServletRequest request, HttpServletResponse response) throws WxErrorException{ 28 WxMpXmlMessage message = (WxMpXmlMessage) request.getAttribute("message"); 29 //取消关注 30 if("unsubscribe".equals(message.getEvent())){ 31 System.out.println("事件类型:"+message.getEvent()); 32 }else if("subscribe".equals(message.getEvent())){//关注公众号 33 System.out.println("事件类型:"+message.getEvent()); 34 }else{ //按钮点击事件 35 System.out.println("按钮的EventType:"+message.getEvent()); 36 System.out.println("按钮的buttonKey:"+message.getEventKey()); 37 } 38 } 39 }
TextMsgController.java
1 package com.sxd.message.controller; 2 3 import java.io.IOException; 4 5 import javax.servlet.http.HttpServletRequest; 6 import javax.servlet.http.HttpServletResponse; 7 8 import me.chanjar.weixin.mp.api.WxMpService; 9 10 import org.springframework.stereotype.Controller; 11 import org.springframework.web.bind.annotation.RequestMapping; 12 13 import com.sxd.controller.CenterController; 14 import com.sxd.util.RuleManager; 15 16 /** 17 * Text文本类型消息的服务端 18 * @author SXD 19 * 20 */ 21 @Controller 22 @RequestMapping("textMsgController") 23 public class TextMsgController { 24 25 /** 26 * Text消息处理逻辑 27 * @throws IOException 28 */ 29 @RequestMapping("msgDeal") 30 public void msgDeal(HttpServletRequest request, HttpServletResponse response) throws IOException{ 31 WxMpService wxMpService = CenterController.wxMpService; 32 RuleManager rm = new RuleManager(); 33 rm.dealRule(wxMpService, request, response); 34 } 35 }
RuleManager.java
1 package com.sxd.util; 2 3 import java.io.IOException; 4 import java.util.Map; 5 6 import javax.servlet.http.HttpServletRequest; 7 import javax.servlet.http.HttpServletResponse; 8 9 import me.chanjar.weixin.common.api.WxConsts; 10 import me.chanjar.weixin.common.exception.WxErrorException; 11 import me.chanjar.weixin.common.session.WxSessionManager; 12 import me.chanjar.weixin.mp.api.WxMpMessageHandler; 13 import me.chanjar.weixin.mp.api.WxMpMessageRouter; 14 import me.chanjar.weixin.mp.api.WxMpService; 15 import me.chanjar.weixin.mp.bean.WxMpXmlMessage; 16 import me.chanjar.weixin.mp.bean.WxMpXmlOutMessage; 17 import me.chanjar.weixin.mp.bean.WxMpXmlOutTextMessage; 18 19 public class RuleManager { 20 21 /** 22 * 消息处理逻辑 23 * Text消息处理规则 24 */ 25 public void dealRule(WxMpService wxMpService,HttpServletRequest request, HttpServletResponse response) throws IOException{ 26 27 WxMpMessageHandler handlerText = new WxMpMessageHandler() { 28 29 @Override 30 public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 31 Map<String, Object> context, WxMpService wxMpService, 32 WxSessionManager sessionManager) throws WxErrorException { 33 34 WxMpXmlOutTextMessage outMessage = new WxMpXmlOutTextMessage(); 35 outMessage.setToUserName(wxMessage.getFromUser()); 36 outMessage.setFromUserName(wxMessage.getToUser()); 37 outMessage.setCreateTime(System.currentTimeMillis()/1000); 38 outMessage.setContent("你发送的<"+wxMessage.getContent()+">是一首歌么"); 39 return outMessage; 40 } 41 }; 42 WxMpMessageHandler handlerText2 = new WxMpMessageHandler() { 43 44 @Override 45 public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, 46 Map<String, Object> context, WxMpService wxMpService, 47 WxSessionManager sessionManager) throws WxErrorException { 48 49 WxMpXmlOutTextMessage outMessage = new WxMpXmlOutTextMessage(); 50 outMessage.setToUserName(wxMessage.getFromUser()); 51 outMessage.setFromUserName(wxMessage.getToUser()); 52 outMessage.setCreateTime(System.currentTimeMillis()/1000); 53 outMessage.setContent("第二个满足了"); 54 return outMessage; 55 } 56 }; 57 58 59 /** 60 * 消息处理规则,下面示例两个并列的规则,粗细粒度 61 */ 62 WxMpMessageRouter router = new WxMpMessageRouter(wxMpService); 63 router.rule() 64 .async(false) 65 .msgType(WxConsts.XML_MSG_TEXT) 66 .content("我") 67 .handler(handlerText) 68 .end() 69 .rule() 70 .async(false) 71 .msgType(WxConsts.XML_MSG_TEXT) 72 .rContent(".*(我|你|他).*") 73 .handler(handlerText2) 74 .end(); 75 76 WxMpXmlMessage message = (WxMpXmlMessage) request.getAttribute("message"); 77 WxMpXmlOutMessage outMessage = router.route(message); 78 if(outMessage==null){ 79 WxMpXmlOutTextMessage outMessageCopy = new WxMpXmlOutTextMessage(); 80 outMessageCopy.setToUserName(message.getFromUser()); 81 outMessageCopy.setFromUserName(message.getToUser()); 82 outMessageCopy.setCreateTime(System.currentTimeMillis()/1000); 83 outMessageCopy.setContent(message.getContent()); 84 response.getWriter().write(outMessageCopy.toXml()); 85 return ; 86 } 87 response.getWriter().write(outMessage.toXml()); 88 } 89 }
在这里,不仅验证了服务器,也初始化了 自定义菜单,并且微信端的消息都进行了 分发!
3.服务器端代码写好后,启动服务器,然后再回头点击微信公众平台这里的提交按钮【此处使用测试号】
提示提交成功后就知道配置成功与否了。