java微信自动回复开发,Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点:

1. url 仍然不变,还是开发配置里的url

2. 微信采用 xml 格式传输数据

3.微信服务器传给我们的参数主要有(如图):

java微信自动回复开发,Java微信公众号开发----关键字自动回复消息_第1张图片

附上解析xml类的依赖:

1

2

3 dom4j

4 dom4j

5 2.0.0

6

7

8 com.thoughtworks.xstream

9 xstream

10 1.4.9

11

第一步:建立model 类接收参数(基本信息类,子类,子类包括文本信息类,图片信息类,语音信息类等,本人暂时只写了文本的信息类)

基类:

1 package com.encore.model;

2

3 import lombok.*;

4

5 /**

6 * 微信公众号消息的基类

7 */

8

9 @Setter

10 @Getter

11 @ToString

12 @AllArgsConstructor

13 @NoArgsConstructor

14 @Builder

15 public class WxMessage {

16 // 开发者微信号

17 private String ToUserName;

18 // 发送方帐号(一个OpenID)

19 private String FromUserName;

20 // 消息创建时间 (整型)

21 private long CreateTime;

22 // 消息类型(text/image/location/link)

23 private String MsgType;

24 // 消息id,64位整型

25 private long MsgId;

26 }

文本信息类 继承自基类:

1 package com.encore.model;

2

3 import lombok.Getter;

4 import lombok.NoArgsConstructor;

5 import lombok.Setter;

6 import org.springframework.beans.BeanUtils;

7

8 /**

9 * 文本消息

10 */

11

12 @Getter

13 @Setter

14 @NoArgsConstructor

15 public class TextMessage extends WxMessage {

16

17 private String Content;// 文本消息内容

18

19 //用来把基类的属性值复制给子类

20 public static TextMessage adapt(WxMessage msg){

21 TextMessage textMessage = new TextMessage();

22 BeanUtils.copyProperties(msg, textMessage);

23 return textMessage;

24 }

25 }

第二步: controller post接收方式,中间会涉及到读取和写入xml,util类会在最后附上

1 @RequestMapping(value = "/view.json", method = RequestMethod.POST, produces = "application/json;charset=UTF-8")

2 @ResponseBody

3 public String receiveMessage(HttpServletRequest request){

4

5 //1. 获取微信服务器发送的消息,转换成map对象

6 Map map = MessageUtil.parseXmlToMap(request);

7 // 2. 获取详细的信息

8 // 发送方帐号(open_id)

9 String fromUserName = map.get("FromUserName");

10 // 公众帐号

11 String toUserName = map.get("ToUserName");

12 // 消息类型

13 String msgType = map.get("MsgType");

14 // 消息内容

15 String content = map.get("Content");

16 // 消息id

17 String msgId = map.get("MsgId");

18

19 //3. 定义回复消息对象

20 String respMsg = "";

21

22 // 也可以用new,然后一个属性一个属性的set

23 // 微信消息的基类

24 //set属性值的时候,注意:ToUserName 和 FromUserName的值要反过来!是坑!是坑!是坑!

25 WxMessage msg = WxMessage.builder().FromUserName(toUserName).ToUserName(fromUserName).MsgType(msgType).MsgId(Long.parseLong(msgId))

26 .CreateTime(new Date().getTime()).build();

27

28 if (RESP_MESSAGE_TYPE_TEXT.equals(msgType)){//文本消息

29 //要回复的消息内容

30 String resultContent = "";

31 if ("python".equals(content)){

32 resultContent = "人生苦短,我用python";

33 }else if ("php".equals(content) || "PHP".equals(content)){

34 resultContent = "PHP是世界上最好的语言";

35 }else if ("java".equals(content) || "JAVA".equals(content)){

36 resultContent = "JAVA太特么复杂了";

37 }else if ("js".equals(content) || "javascript".equals(content)){

38 resultContent = "老子是脚本!跟java没半毛钱关系!";

39 }else {

40 resultContent = "您的开发语言是:"+content;

41 }

42 TextMessage textMessage = TextMessage.adapt(msg);

43 textMessage.setContent(resultContent);

44 respMsg = MessageUtil.parseMsgToXml(textMessage, TextMessage.class);

45 }

46

47 return respMsg;

48 }

最后附上读取和写入xml的工具类:

1 package com.encore.util;

2

3 import com.encore.model.WxMessage;

4 import com.thoughtworks.xstream.XStream;

5 import org.dom4j.Document;

6 import org.dom4j.DocumentException;

7 import org.dom4j.Element;

8 import org.dom4j.io.SAXReader;

9

10 import javax.servlet.http.HttpServletRequest;

11 import java.io.IOException;

12 import java.io.InputStream;

13 import java.util.HashMap;

14 import java.util.List;

15 import java.util.Map;

16

17 public class MessageUtil {

18

19

20 /**

21 * 接收request对象,读取xml内容,转换成map对象

22 * @param request

23 * @return

24 */

25 public static Map parseXmlToMap(HttpServletRequest request){

26 Map map = new HashMap<>();

27 SAXReader reader = new SAXReader();

28 InputStream ins = null;

29 try {

30 ins = request.getInputStream();

31 } catch (IOException e1) {

32 e1.printStackTrace();

33 }

34 Document doc = null;

35 try {

36 doc = reader.read(ins);

37 Element root = doc.getRootElement();

38 List list = root.elements();

39 for (Element e : list) {

40 map.put(e.getName(), e.getText());

41 }

42 return map;

43 } catch (DocumentException e1) {

44 e1.printStackTrace();

45 }finally{

46 try {

47 if (null != ins){

48 ins.close();

49 }

50 } catch (IOException e) {

51 e.printStackTrace();

52 }

53 }

54 return null;

55 }

56

57 /**

58 * 将消息转换成xml格式的字符串

59 * @param msg 各种信息类,如文本信息类,图片信息类,音频信息类等。(都是WxMessage的子类)

60 * @param child 用来确定到底是哪一种子类

61 * @return

62 */

63 public static String parseMsgToXml(WxMessage msg, Class child){

64 XStream xstream = new XStream();

65 xstream.alias("xml", child);

66 return xstream.toXML(msg);

67 }

68 }

至此基本步骤已经完成,具体什么关键字回复什么内容全屏自己设置。

你可能感兴趣的:(java微信自动回复开发)