事件类型包括:
在service中统一处理的
//事件消息
if(XMLUtils.c_xml_msg_type_event.equals(msgType)){
// 处理订阅事件
if(XMLUtils.c_xml_msg_event_subscribe.equals(event)){
doSubscribe(queryString, reqXmlData, openId,formUser,response);
}else if(XMLUtils.c_xml_msg_event_unsubscribe.equals(event)){ // 取消订阅
doUnSubscribe(queryString, reqXmlData, openId);
}else if(XMLUtils.c_xml_msg_event_scan.equals(event)){ // 扫描
doScan(queryString, reqXmlData, openId,formUser,response,eventKey);
}else if(XMLUtils.c_xml_msg_event_click.equals(event)){//点击事件
doClick(reqXmlData, openId,formUser,response,eventKey);
}else if(XMLUtils.c_xml_msg_event_photo.equals(event)){//系统拍照发图事件
doPhoto(queryString, reqXmlData, openId,formUser,response,eventKey);
}
}
根据事件的类型不同,然后来进行不同的业务处理
首先关注事件:
/**
* 关注事件
* @param queryString
* @param reqXmlData
* @param openId
*/
private void doSubscribe(String queryString, Map<String, String> reqXmlData, String openId,String formUser,HttpServletResponse response) {
MsgUtil.sendTextMsgToUser("您好,欢迎关注本公众号!! ‘?’调取帮助信息", openId,formUser,response);
}
取消关注事件:这个暂时没有做处理,只能在控制台观看效果
/**
* 取消关注事件
* @param queryString
* @param reqXmlData
* @param openId
*/
private void doUnSubscribe(String queryString, Map<String, String> reqXmlData, String openId) {
System.out.println("取消关注事件");
}
接收位置
/**
* 接收用户发的位置消息
* @param reqXmlData
* @param response
* @param openId
* @param formUser
*/
private void doLocation(Map<String, String> reqXmlData, HttpServletResponse response, String openId,
String formUser) {
String x = reqXmlData.get("Location_X");
String y = reqXmlData.get("Location_Y");
String Label = reqXmlData.get("Label");
MsgUtil.sendTextMsgToUser("x坐标"+x+"y坐标"+y+"地址:"+Label,
openId, formUser, response);
}
系统拍照发图事件(这个本人调试的时候发现文本消息发送不出去,但是封装的消息完全没有问题,暂时没有解决,网上部分解释是这个不能处理,具体还望各路大神指点)
/**
* 系统拍照发图事件
* @param queryString
* @param reqXmlData
* @param openId
* @param formUser
* @param response
* @param eventKey
*/
private void doPhoto(String queryString, Map<String, String> reqXmlData, String openId, String formUser,
HttpServletResponse response, String eventKey) {
MsgUtil.sendTextMsgToUser(eventKey, openId,formUser,response);
System.out.println("相册发图事件");
}
点击事件
/**
* 点击事件
* @param reqXmlData
* @param openId
* @param eventKey
* @param response
* @param formUser
*/
private void doClick(Map<String, String> reqXmlData, String openId, String formUser, HttpServletResponse response, String eventKey) {
MsgUtil.sendTextMsgToUser("感谢您的支持"+eventKey, openId, formUser, response);
System.out.println("点击事件");
}
扫码事件
/**
* 扫码事件
* @param queryString
* @param reqXmlData
* @param openId
*/
private void doScan(String queryString, Map<String, String> reqXmlData, String openId,String formUser,HttpServletResponse response,String eventKey) {
System.out.println("扫码事件");
MsgUtil.sendTextMsgToUser(eventKey, openId, formUser, response);
}
接收位置消息和相册发图以及点击是开始创建菜单的时候我直接放在自定义菜单里面的,可以直接测试
总的来说,相对应的时间类型和消息类型以及时间中绑定的key都可以获取,你可以根据不同的类型不同的参数来进行不同的处理;比如你有两个二维码:一个绑定的是123,一个是456,然后你可以判断是否是扫码事件,然后获取是否是123或者456来分别处理你的业务
最后只验证一下扫码事件和之前我们放进去的那个test,如果扫描成功,会返回一个test,因为在代码中我把它封装成一条文本消息发送回去了
扫描之后的结果正常,注意我这个生成的是临时的,有过期时间,如果发生扫码错误,注意对照错误码表排查。
至此:关于微信公众号的一般业务功能也就介绍完了,希望对有需要的人有所帮助,另外这里可能会出现某些bug,还望各路大神指出,我会尽快改正。文笔不是太好,希望各位不要介意。
最后源码奉上:这是源码