【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程【验证服务器、自定义菜单、微信端消息分发】

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

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>

View Code

 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 }

View Code

  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 }

View Code

  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 }

View Code

  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>

View Code

  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 }

View Code

  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 }

View Code

  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 }

View Code

  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 }

View Code

 

 

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

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

 

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

				
时间: 2024-11-08 19:58:12

【微信Java开发 --2】接入微信公众平台开发,配置自己的服务器,验证过程【验证服务器、自定义菜单、微信端消息分发】的相关文章

服务器-关于用java开发微信公众平台开发 token验证失败的问题

问题描述 关于用java开发微信公众平台开发 token验证失败的问题 大家好,最近在学习用java开发微信公众平台,第一次写的代码token验证通过了,用的是阿里云的服务器换系统(server2008->2003)后就怎么也通过不过验证.直接输入域名www.zhenggufang.com/aip/longin网页显示404.域名也已经备过案.服务器上的tomcat也启动正常tomcat/conf/server也修改了.多谢提交还是token验证失败.请各位帮忙看看代码如下: package s

微信公众平台开发实战Java版之微信获取用户基本信息_java

在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据OpenID获取用户基本信息,包括昵称.头像.性别.所在城市.语言和关注时间. 开发者可通过OpenID来获取用户基本信息.请使用https协议. 我们可以看看官方的文档:获取用户的基本信息. 接口调用请求说明  http请求方式: GET https://api.weixin.qq.com/cgi-

微信公众平台开发问答

微信公众平台开发问答是一个微信知识问答区,专注于提供微信应用及开发技术知识的整理.归类和检索.   主题:新手常见问题 问:我是新手,没有开发基础,应该如何学习微信公众平台的开发?答:先学习PHP和Mysql,可以在网上找相应的教程,了解一下大致语法,先不用深究:再学习方倍工作室的微信公众平台开发入门教程,了解微信收发消息原理及回复:然后根据微信开发文档,熟悉接口,并在此基础上实现一些基本的小功能,并扩展到更复杂的功能上.推荐图书<微信公众平台开发最佳实践>.适合从0基础到高手用框架开发全部过

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M

微信公众平台开发 JS-SDK开发(图像接口实例)

本文并非是对微信JS-SDK说明文档的复制,而是通过一个简单的例子来更深入的了解使用微信JS-SDK,具体文档请参考官方说明文档<微信JS-SDK说明文档>.微信公众平台面向开发者开放微信内网页开发工具包(微信JS-SDK),通过微信JS-SDK提供的11类接口集,开发者不仅能够在网页上使用微信本身的拍照.选图.语音.位置等基本能力,还可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 微信JS-SDK提供的11类接口(分享接口.图像接口.音频接口.智能

基于php的微信公众平台开发入门实例_php实例

本文实例讲述了基于php的微信公众平台开发方法.分享给大家供大家参考.具体如下: 最近在做微信公众平台开发,一口气写了二十几个功能,挺有意思的- 今天来分享一下开发经验~ 微信公众平台提供的接口很简单,先看看消息交互流程: 说的通俗一些,用户使用微信发送消息 -> 微信将数据发送给开发者 -> 开发者处理消息并返回数据至微信 -> 微信把返回数据发送给用户,期间数据交互通过XML完成,就这么简单.   下面写个实例,开发微信智能聊天机器人:  1. 注册微信公众平台账号 微信公众平台:

《微信公众平台开发最佳实践》——导读

前 言 出版说明 自从方倍工作室在博客园推出微信公众平台开发系列教程后,受到广大微信开发人员及爱好者的热情关注,相关文章的日访问量高达2万人次,而<微信公众平台开发入门教程>的阅读量超过50万,博客访问量总计超过500万,成为微信公众平台开发更新最快,传播最广.受众最多.资料最全的博客,很多博文被许多有影响力的网站转载,并被各大搜索引擎收录且排名靠前,这些是我们始料未及的. 然而更让人高兴的是,很多开发者通过学习我们的教程掌握了微信公众平台开发技术,并且通过微信开发赚到了钱.2013年10月1

微信公众平台开发问答-20161215

================================================================ 消息分组:QQ群 518924126================================================================消息对象:微信平台开发有问必答群================================================================ 2016-11-16 18:15:33 [师

《微信公众平台开发:从零基础到ThinkPHP5高性能框架实践》——2.2 程序开发基础

2.2 程序开发基础 PHP(超文本预处理器,Hypertext Preprocessor)于1994年由Rasmus Lerdorf创建,他也被称为"PHP之父".PHP是一种通用开源脚本语言.其语法吸收了C语言.Java和Perl的特点,便于学习,使用广泛,主要适用于Web开发领域.PHP是最受欢迎的Web开发语言之一,也是微信公众平台开发使用最广泛的语言. SQL是结构化查询语言(Structured Query Language)的简称,它是一种数据库查询和程序设计语言,用于存