暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Java开发微信公众平台之接收消息并处理(三)

沉默木头人 2020-09-03
1297

在之前已经介绍了如何接入微信公众号,那么接入之后我们首先要从哪里进行开发呢?

本章来讲解如何接收微信推送的事件消息及处理。


前言:

在公众号正常运营的情况下它是如何与用户进行数据交互的呢?

在这中间通过微信的服务器将用户的操作或消息都会转发到我们自己的公众号后台由我们自行做出处理。

那么在公众号接入开发后这些操作我们希望让他在我们自己的项目中实现。那么用户的操作或消息在我们自己的开发项目中是怎么接收到的呢?只有接收到这些数据我们才能对之做出处理操作;


在上篇Java开发微信公众平台之接入开发(二)中介绍到公众号接入开发时需要配置一个url来验证tocken以此来完成接入。

当验证通过后进入开发状态或正式生产状态微信服务会将用户的操作或消息以json或xml的形式发送到我们配置的url地址中;


下面找到之前配置验证的请求接口:

说明一下为什么用RequestMapping标注请求:因为在第一次接入验证的时候微信会像该接口发送一个Get请求,以后每次推送的事件都会以Post请求。但是还必须保证该接口必须都可以接收这两种情况的请求,不能标注为某一个请求。

沉默木头人


如何接收到请求:

可以看到该接口的参数是request,所以每次我们需要从request中拿出想要的数据参数。

 /**
* 接收微信推送的事件消息并处理
* @return
*/
@RequestMapping(value = "/wechat")
public String checkToken(HttpServletRequest request) {


//给微信返回消息数据
String msg = null;


// 获得微信端返回的xml数据
InputStream is = null;
InputStreamReader isr = null;
BufferedReader br = null;


try {


is = request.getInputStream();
isr = new InputStreamReader(is, "utf-8");
br = new BufferedReader(isr);
String str = null;
StringBuffer returnXml= new StringBuffer();
while ((str = br.readLine()) != null) {
//返回的是xml数据
returnXml.append(str);
}


//将得到的xml数据转换为map
Map<String, String> map = WechatUtil.xmlToMap(returnXml.toString());
log.info("接收事件消息:{}",map);

//拿出消息类型,event为事件消息
            String msgType = map.get("MsgType");
            if("event".equals) {
             //拿出具体的事件名称
String event = map.get("Event");

              //-------此处编写处理事件消息的具体逻辑----
            }
            
            //------------此处编写其他消息的处理逻辑---------

}catch (Exception e) {
log.error("处理微信公众号接收事件消息失败!",e);
}finally {
if (null != is) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != isr) {
try {
isr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (null != br) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
log.info("被动回复的消息为:{}",msg);
return msg;
}


通过以上方式就可以拿到用户对公众的操作行为或消息,有关具体的事件或消息格式可以参考公众号后台开发者工具中的开发者文档。

需要注意的是代码逻辑编写完后将服务部署到我们配置在服务器上才可正常接收到消息,该服务器地址必须是配置在微信公众号后台的服务器地址。


回复消息:

上面介绍完如何接收到消息,那么我们想要处理完接收到的消息后还想给对应的用户做出回复,同样也是可以实现的。

有两种方式:

1、可以在接收消息的这个方法中处理完业务后直接回复一个String字符串。

2、也可以使用客服消息进行异步回复消息。

但需要如果接收消息的方法处理完后没有回复具体的消息可以返回"success"或null否则微信会提示用户该服务异常。


1、直接回复:

在处理完业务后可以根据业务逻辑给用户回复不用的消息类型,但是微信约束的是该字符串是一段xml数据(详情查看开发者文档中消息管理的被动回复用户消息)。这里我是将要回复的数据先封装到Map中再将Map转换为xml进行返回。(可以参考本次分享的子文章:xml数据和Map互转


2、客服异步回复:
这里也可以选择使用客服消息进行异步给用户回复消息,这里就不是返回xml数据了,而是向微信发送一个post请求将要返回的数据传过去,(详情查看开发者文档中消息管理的客服消息)。但也需要在接收消息的方法中做出返回值处理。


以上就完成了在接入微信公众号开发后如何在我们自己的服务中与用户进行交互,只是简单的介绍了大概的流程。如有其他复杂业务可以查考微信开发者文档来实现自己的业务功能。



---------------------

公众号:沉默木头人

CSDN:沉默木头人(ID:qq_44322555)

喜欢感兴趣长按下面二维码关注吧!

原创不易,不喜勿喷,如果能够帮助到你或对你有所启发欢迎下方留言。

喜欢就开始你无情的三连击:点赞、分享、关注。这将是我写作更多有趣有益有知的好文章的动力;

文章转载自沉默木头人,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论