java版微信公众号开发(四)回复客户消息
当用户发送消息给公众号时,会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。客户发送的消息会默认转到配置的url初始路径。以文本为例接下来以文本为例进行测试。
·
当用户发送消息给公众号时,会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
以文本为例接下来以文本为例进行测试。
/**
* 回复消息
*/
@PostMapping("/")
public String receiveMessageService( HttpServletRequest request) {
return messageService.receiveMessageService(request);
}
客户发送的消息会默认转到配置的url初始路径
/**
* 处理用户发送信息的业务服务层方法实现
* @param request
*/
@Override
public String receiveMessageService(HttpServletRequest request) {
logger.info("【消息模块】开始处理用户发送信息的业务");
ServletInputStream inputStream = null;
try {
inputStream = request.getInputStream();
} catch (IOException e) {
logger.info(e.getMessage());
}
Map<String,String> map = new HashMap<>();
SAXReader reader = new SAXReader();
try {
Document document = reader.read(inputStream);
Element root = document.getRootElement();
List<Element> elements = root.elements();
for (Element element:elements
) {
map.put(element.getName(),element.getStringValue());
}
} catch (DocumentException e) {
logger.info(e.getMessage());
}
//1.从文本中获取用户的openid
String openid = map.get("FromUserName");
logger.info("【消息模块】request流中信息:===>【{}】",map);
if(openid == null ){
String message = "获取用户openid失败";
logger.warn(message);
throw new ServiceException(ServiceCode.ERROR_SERVICE, message);
}
//3.回复用户消息
return getReplyMessage(map);
}
/**
* 回复消息的方法
*/
private String getReplyMessage(Map<String, String> map) {
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(map.get("FromUserName"));
textMessage.setFromUserName(map.get("ToUserName"));
textMessage.setMsgType("text");
textMessage.setContent("欢迎关注本公众号---消息自动回复");
textMessage.setCreateTime(System.currentTimeMillis()/1000);
//XML转换成Java对象
// 缺少判断如果用户发送的不是text文本的判断处理
XStream xStream = new XStream();
xStream.processAnnotations(TextMessage.class);
String xml = xStream.toXML(textMessage);
logger.info("消息返回的信息: ===>");
logger.info("{}",xml);
return xml;
}
TextMessage这个类需要自己定义:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
//需要回复的消息样式
// String message ="<xml>\n" +
// " <ToUserName><![CDATA[oBjyN6KSlSUGWOWCVbNZXrviueD0]]></ToUserName>\n" +
// " <FromUserName><![CDATA[gh_d263783aa70c]]></FromUserName>\n" +
// " <CreateTime>1693999561</CreateTime>\n" +
// " <MsgType><![CDATA[text]]></MsgType>\n" +
// " <Content><![CDATA[你好]]></Content>\n" +
// "</xml>";
@XStreamAlias("xml")
@Data
public class TextMessage {
@XStreamAlias("ToUserName")
private String toUserName;
@XStreamAlias("FromUserName")
private String fromUserName;
@XStreamAlias("CreateTime")
private Long createTime;
@XStreamAlias("MsgType")
private String msgType;
@XStreamAlias("Content")
private String content;
}
接下来是请求与响应:
更多推荐
已为社区贡献4条内容
所有评论(0)