接入微信公众平台开发,开发者需要按照如下步骤完成:

  1. 1、填写服务器配置
  2. 2、验证服务器地址的有效性
  3. 3、依据接口文档实现业务逻辑
  4.  
  5. 好我们就开始:
    1.登录微信公众平台,进入基本配置

修改配置,将自己的服务器的URL地址,配置在此处:

填写完成后,【先不用 提交】,先进行第二步 服务器端代码的配置

注意:

如果想使用  自定义菜单等相关接口权限,需要注意:

可以看到  个人订阅号是没有 使用自定义菜单的相关接口能力的,如果需要使用的话,需要注册服务号或使用测试号:

那么 在服务器端代码中使用的 测试AppId/Secret/Token等都需要重新设置为测试号的相关信息!

2.服务器端配置相关

服务器端相关代码 思路:

  1>首先搭建web项目,使用maven管理架包,项目架构用spring+spring MVC+hibernate,pom.xml文件中,关于微信端开发的配置就是,就是使用weixin-java-tools项目使用java进行微信端开发

  1. <!-- 微信开发工具包 -->
  2.  
  3. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common -->
  4. <dependency>
  5. <groupId>com.github.binarywang</groupId>
  6. <artifactId>weixin-java-common</artifactId>
  7. <version>2.2.0</version>
  8. </dependency>
  9. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp -->
  10. <dependency>
  11. <groupId>com.github.binarywang</groupId>
  12. <artifactId>weixin-java-mp</artifactId>
  13. <version>2.2.0</version>
  14. </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. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-common -->
  48. <dependency>
  49. <groupId>com.github.binarywang</groupId>
  50. <artifactId>weixin-java-common</artifactId>
  51. <version>2.2.0</version>
  52. </dependency>
  53. <!-- https://mvnrepository.com/artifact/com.github.binarywang/weixin-java-mp -->
  54. <dependency>
  55. <groupId>com.github.binarywang</groupId>
  56. <artifactId>weixin-java-mp</artifactId>
  57. <version>2.2.0</version>
  58. </dependency>
  59.  
  60. <!-- junit -->
  61. <dependency>
  62. <groupId>junit</groupId>
  63. <artifactId>junit</artifactId>
  64. <version>4.12</version>
  65. <scope>test</scope>
  66. </dependency>
  67.  
  68. <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
  69. <dependency>
  70. <groupId>com.github.pagehelper</groupId>
  71. <artifactId>pagehelper</artifactId>
  72. <version>4.1.4</version>
  73. </dependency>
  74.  
  75. <!-- spring -->
  76. <dependency>
  77. <groupId>org.springframework</groupId>
  78. <artifactId>spring-core</artifactId>
  79. <version>${spring.version}</version>
  80. </dependency>
  81.  
  82. <dependency>
  83. <groupId>org.springframework</groupId>
  84. <artifactId>spring-beans</artifactId>
  85. <version>${spring.version}</version>
  86. </dependency>
  87.  
  88. <dependency>
  89. <groupId>org.springframework</groupId>
  90. <artifactId>spring-context</artifactId>
  91. <version>${spring.version}</version>
  92. </dependency>
  93.  
  94. <dependency>
  95. <groupId>org.springframework</groupId>
  96. <artifactId>spring-tx</artifactId>
  97. <version>${spring.version}</version>
  98. </dependency>
  99.  
  100. <dependency>
  101. <groupId>org.springframework</groupId>
  102. <artifactId>spring-web</artifactId>
  103. <version>${spring.version}</version>
  104. </dependency>
  105.  
  106. <dependency>
  107. <groupId>org.springframework</groupId>
  108. <artifactId>spring-test</artifactId>
  109. <version>${spring.version}</version>
  110. <scope>test</scope>
  111. </dependency>
  112.  
  113. <!-- 使用SpringMVC需配置 -->
  114. <dependency>
  115. <groupId>org.springframework</groupId>
  116. <artifactId>spring-webmvc</artifactId>
  117. <version>${spring.version}</version>
  118. </dependency>
  119. <!-- spring cglib 代理 -->
  120. <dependency>
  121. <groupId>cglib</groupId>
  122. <artifactId>cglib</artifactId>
  123. <version>2.2.2</version>
  124. </dependency>
  125. <!-- 关系型数据库整合时需配置 如hibernate jpa等 -->
  126. <dependency>
  127. <groupId>org.springframework</groupId>
  128. <artifactId>spring-orm</artifactId>
  129. <version>${spring.version}</version>
  130. </dependency>
  131.  
  132. <!-- hibernate -->
  133. <dependency>
  134. <groupId>org.hibernate</groupId>
  135. <artifactId>hibernate-core</artifactId>
  136. <version>${hibernate.version}</version>
  137. </dependency>
  138.  
  139. <dependency>
  140. <groupId>org.hibernate</groupId>
  141. <artifactId>hibernate-ehcache</artifactId>
  142. <version>${hibernate.version}</version>
  143. </dependency>
  144.  
  145. <!-- 二级缓存ehcache -->
  146. <dependency>
  147. <groupId>net.sf.ehcache</groupId>
  148. <artifactId>ehcache</artifactId>
  149. <version>2.9.0</version>
  150. </dependency>
  151.  
  152. <!-- log4j -->
  153. <dependency>
  154. <groupId>log4j</groupId>
  155. <artifactId>log4j</artifactId>
  156. <version>1.2.17</version>
  157. </dependency>
  158.  
  159. <!-- mysql连接 -->
  160. <dependency>
  161. <groupId>mysql</groupId>
  162. <artifactId>mysql-connector-java</artifactId>
  163. <version>5.1.34</version>
  164. </dependency>
  165.  
  166. <!-- c3p0数据源 -->
  167. <dependency>
  168. <groupId>com.mchange</groupId>
  169. <artifactId>c3p0</artifactId>
  170. <version>0.9.5-pre10</version>
  171. </dependency>
  172.  
  173. <!-- json -->
  174.  
  175. <!-- 1号 -->
  176. <dependency>
  177. <groupId>com.fasterxml.jackson.core</groupId>
  178. <artifactId>jackson-core</artifactId>
  179. <version>2.8.1</version>
  180. </dependency>
  181. <!-- 2号 -->
  182. <dependency>
  183. <groupId>com.fasterxml.jackson.core</groupId>
  184. <artifactId>jackson-annotations</artifactId>
  185. <version>2.8.1</version>
  186. </dependency>
  187.  
  188. <!-- 3号 -->
  189. <dependency>
  190. <groupId>com.fasterxml.jackson.core</groupId>
  191. <artifactId>jackson-databind</artifactId>
  192. <version>2.8.1</version>
  193. <exclusions>
  194. <exclusion>
  195. <artifactId>jackson-core</artifactId>
  196. <groupId>com.fasterxml.jackson.core</groupId>
  197. </exclusion>
  198. <exclusion>
  199. <artifactId>jackson-annotations</artifactId>
  200. <groupId>com.fasterxml.jackson.core</groupId>
  201. </exclusion>
  202. </exclusions>
  203. </dependency>
  204.  
  205. <!-- 4号 -->
  206. <dependency>
  207. <groupId>com.google.code.gson</groupId>
  208. <artifactId>gson</artifactId>
  209. <version>2.7</version>
  210. </dependency>
  211. <!-- 5号 -->
  212. <dependency>
  213. <groupId>net.sf.json-lib</groupId>
  214. <artifactId>json-lib</artifactId>
  215. <version>2.4</version>
  216. <classifier>jdk15</classifier>
  217. </dependency>
  218. <!-- 5号json-lib还需要以下依赖包 -->
  219. <dependency>
  220. <groupId>commons-lang</groupId>
  221. <artifactId>commons-lang</artifactId>
  222. <version>2.5</version>
  223. </dependency>
  224. <dependency>
  225. <groupId>commons-beanutils</groupId>
  226. <artifactId>commons-beanutils</artifactId>
  227. <version>1.9.2</version>
  228. </dependency>
  229. <dependency>
  230. <groupId>commons-collections</groupId>
  231. <artifactId>commons-collections</artifactId>
  232. <version>3.2.1</version>
  233. </dependency>
  234. <dependency>
  235. <groupId>commons-logging</groupId>
  236. <artifactId>commons-logging</artifactId>
  237. <version>1.2</version>
  238. </dependency>
  239.  
  240. <!-- aop -->
  241. <dependency>
  242. <groupId>org.aspectj</groupId>
  243. <artifactId>aspectjweaver</artifactId>
  244. <version>1.8.4</version>
  245. </dependency>
  246.  
  247. <!-- servlet -->
  248. <dependency>
  249. <groupId>javax.servlet</groupId>
  250. <artifactId>servlet-api</artifactId>
  251. <version>3.0-alpha-1</version>
  252. <scope>provided</scope>
  253. </dependency>
  254.  
  255. <dependency>
  256. <groupId>javax.servlet</groupId>
  257. <artifactId>jstl</artifactId>
  258. <version>1.2</version>
  259. </dependency>
  260. <!-- guava 集合的交并操作 -->
  261. <dependency>
  262. <groupId>com.google.guava</groupId>
  263. <artifactId>guava</artifactId>
  264. <version>19.0</version>
  265. </dependency>
  266. <dependency>
  267. <groupId>com.google.guava</groupId>
  268. <artifactId>guava-collections</artifactId>
  269. <version>r03</version>
  270. </dependency>
  271.  
  272. <!-- 文件上传 -->
  273. <dependency>
  274. <groupId>commons-fileupload</groupId>
  275. <artifactId>commons-fileupload</artifactId>
  276. <version>1.3.1</version>
  277. </dependency>
  278.  
  279. </dependencies>
  280. </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. * @author Administrator
  39. *
  40. */
  41. @Controller
  42. @RequestMapping("centercontroller")
  43. public class CenterController {
  44.  
  45. public WxMpInMemoryConfigStorage config;//微信基本配置信息+Access Token
  46. public static WxMpService wxMpService; //微信API的Service
  47. public WxMpMessageRouter wxMpMessageRouter;//微信消息路由器
  48. public static String accessToken;
  49.  
  50. /**
  51. * 1.处理微信首次配置信息+创建按钮 【首次创建后可以 注释initWeiXin()方法 不用每次都执行】
  52. * 2.验证接口配置信息 【如果过时重新获取】
  53. * 3.消息转发---中转站 【每次微信端的信息都会从微信服务器转发到这里,然后从这里转发出去】
  54. * @param request
  55. * @param response
  56. * @return
  57. * @throws IOException
  58. * @throws WxErrorException
  59. */
  60. @RequestMapping("test")
  61. public String test1(HttpServletRequest request, HttpServletResponse response) throws IOException, WxErrorException{
  62. /**
  63. * 1.处理微信首次配置信息+创建按钮
  64. */
  65. // initWeiXin();
  66. /**
  67. * 2.验证接口配置信息 如果过时重新获取
  68. */
  69. String echostr = request.getParameter("echostr");
  70. if(echostr != null){
  71. return "forward:/tokenCheckController/tokenCheck.htmls";
  72. }
  73.  
  74. /**
  75. * 3.消息转发---中转站 每次微信端的消息都会来到这里进行分发
  76. */
  77. WxMpXmlMessage message = WxMpXmlMessage.fromXml(request.getInputStream());
  78. String msgType = message.getMsgType();
  79. Dom4jUtils dom4El = new Dom4jUtils();
  80. String url = dom4El.msgDispather(msgType);
  81. if(url != null){
  82. request.setAttribute("message", message);
  83. return url;
  84. }
  85.  
  86. response.getWriter().write("无法辨识消息类型!!");
  87. return null;
  88.  
  89. }
  90.  
  91. /**
  92. * 初始化 微信相关配置 并且创建按钮
  93. * @throws WxErrorException
  94. */
  95. public void initWeiXin() throws WxErrorException{
  96. config = new WxMpInMemoryConfigStorage();
  97. config.setAppId("wx4848686e5bd4efce"); // 设置微信公众号的appid
  98. config.setSecret("fc37ce345b3612d615d4ead83f21bdff"); // 设置微信公众号的app corpSecret
  99. config.setToken("F0932398023"); // 设置微信公众号的token
  100.  
  101. wxMpService = new WxMpServiceImpl();
  102. wxMpService.setWxMpConfigStorage(config);//创建自己的service
  103. if(config.getAccessToken() == null){
  104. accessToken = wxMpService.getAccessToken(true);//手动刷新获取了Access Token
  105. }
  106. //创建菜单按钮
  107. ButtonMenuUtils bm = new ButtonMenuUtils();
  108. WxMenu menu = bm.createButtonMenu();
  109. wxMpService.getMenuService().menuCreate(menu);
  110. }
  111.  
  112. }

  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. @RequestMapping("msgDeal")
  26. public void msgDeal(HttpServletRequest request, HttpServletResponse response) throws WxErrorException{
  27. WxMpXmlMessage message = (WxMpXmlMessage) request.getAttribute("message");
  28. //取消关注
  29. if("unsubscribe".equals(message.getEvent())){
  30. System.out.println("事件类型:"+message.getEvent());
  31. }else if("subscribe".equals(message.getEvent())){//关注公众号
  32. System.out.println("事件类型:"+message.getEvent());
  33. }else{ //按钮点击事件
  34. System.out.println("按钮的EventType:"+message.getEvent());
  35. System.out.println("按钮的buttonKey:"+message.getEventKey());
  36. }
  37. }
  38. }

  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. WxMpMessageRouter router = new WxMpMessageRouter(wxMpService);
  62. router.rule()
  63. .async(false)
  64. .msgType(WxConsts.XML_MSG_TEXT)
  65. .content("我")
  66. .handler(handlerText)
  67. .end()
  68. .rule()
  69. .async(false)
  70. .msgType(WxConsts.XML_MSG_TEXT)
  71. .rContent(".*(我|你|他).*")
  72. .handler(handlerText2)
  73. .end();
  74.  
  75. WxMpXmlMessage message = (WxMpXmlMessage) request.getAttribute("message");
  76. WxMpXmlOutMessage outMessage = router.route(message);
  77. if(outMessage==null){
  78. WxMpXmlOutTextMessage outMessageCopy = new WxMpXmlOutTextMessage();
  79. outMessageCopy.setToUserName(message.getFromUser());
  80. outMessageCopy.setFromUserName(message.getToUser());
  81. outMessageCopy.setCreateTime(System.currentTimeMillis()/1000);
  82. outMessageCopy.setContent(message.getContent());
  83. response.getWriter().write(outMessageCopy.toXml());
  84. return ;
  85. }
  86. response.getWriter().write(outMessage.toXml());
  87. }
  88. }

在这里,不仅验证了服务器,也初始化了 自定义菜单,并且微信端的消息都进行了 分发!

3.服务器端代码写好后,启动服务器,然后再回头点击微信公众平台这里的提交按钮【此处使用测试号】

提示提交成功后就知道配置成功与否了。

  1.  

【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程的更多相关文章

  1. 第二篇 :微信公众平台开发实战Java版之开启开发者模式,接入微信公众平台开发

    第一部分:微信公众号对接的基本介绍 一.填写服务器配置信息的介绍 登录微信公众平台官网后,进入到公众平台后台管理页面. 选择 公众号基本设置->基本配置 ,点击“修改配置”按钮,填写服务器地址( ...

  2. Java微信公众平台开发(一)--接入微信公众平台

    转自:http://www.cuiyongzhi.com/post/38.html (一)接入流程解析 在我们的开发过程中无论如何最好的参考工具当然是我们的官方文档了:http://mp.weixin ...

  3. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  4. 第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

    第一部分:微信JS-SDK介绍 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统 ...

  5. 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息

    第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...

  6. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  7. 第六篇 :微信公众平台开发实战Java版之如何自定义微信公众号菜单

    我们来了解一下 自定义菜单创建接口: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_to ...

  8. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  9. 第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

    温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众 ...

随机推荐

  1. MPlayer-2016 最新版本

    MPlayer 和 FFmpeg 最新版本 运行 Install.cmd 添加右键播放功能 mplayer\outformat.conf 配置视频分割命令参数 ; 往前0.05秒 大概10多个帧 ' ...

  2. Windows 下的 MarkdownPad 2 工具使用

    MarkdownPad 2 工具(windows) 一. 软件下载和安装 下载登陆官网: http://markdownpad.com/ 点击Download,会自动下载.或者直接点击http://m ...

  3. Effective C++ -----条款24:若所有参数皆需类型转换,请为此采用non-member函数

    如果你需要为某个函数的所有参数(包括被this指针所指的那个隐喻参数)进行类型转换,那么这个函数必须是个non-member.

  4. mvc EF

    一:数据库不存在时重新创建数据库 复制内容到剪贴板程序代码 Database.SetInitializer<testContext>(new CreateDatabaseIfNotExis ...

  5. 仿美团外卖,饿了吗 两个ListView联动,左边点击切换右边,右边滑动切换左边

    先上效果图: 实现思路: 1.先说右边标题: 首先,右边的数据源集合中的Javabean中含有三个属性name,type,title,而每个条目中会默认含有一个标题. 如果这是第一个条目,就让标题显示 ...

  6. iOS 日常工作之常用宏定义大全

    转自:http://www.jianshu.com/p/213b3b96cafe 前言: 在工作中, 很多小伙伴都会在PCH文件定义一些常用的宏,但是又怕写这些简单的宏浪费时间,又有时候忘记怎么定义了 ...

  7. 在DB2 for z/os上创建指定pagesize的数据库

    ASNTDIFF的diff table有一列类型为varchar 15000,z上创建db默认的pagesize是4K,无法创建table,所以需要创建一个大pagesize的database. db ...

  8. NYOJ题目766回文数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAHaCAIAAACSPygsAAAgAElEQVR4nO3dO3LqSheG4X8S5AyEWB ...

  9. IOS之笑脸app

    ios笑脸app实现 import UIKit @IBDesignable class FaceView: UIView { @IBInspectable var lineWidth:CGFloat= ...

  10. CSDN-markdown编辑器

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接 ...