欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java微信公众平台之消息管理

程序员文章站 2023-12-10 15:03:04
java微信公众平台开发之消息管理,一定要先看下 微信消息管理分为接收普通消息、接收事件推送、发送消息(被动回复)、客服消息、群发消息、模板消息这几部分 一、接收普通消...

java微信公众平台开发之消息管理,一定要先看下

微信消息管理分为接收普通消息、接收事件推送、发送消息(被动回复)、客服消息、群发消息、模板消息这几部分

一、接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将post消息的xml数据包到开发者填写的url上。

关于msgid,官方给出解释,相当于每个消息id,关于重试的消息排重,推荐使用msgid排重。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

比如文本消息的xml示例

<xml> 
 <tousername><![cdata[touser]]></tousername> 
 <fromusername><![cdata[fromuser]]></fromusername> 
 <createtime>1348831860</createtime> 
 <msgtype><![cdata[text]]></msgtype> 
 <content><![cdata[this is a test]]></content> 
 <msgid>1234567890123456</msgid> 
 </xml> 

其他的消息去官方文档查看,简单封装如下
消息抽象基类abstractmsg.java

package com.phil.wechat.msg.model.req; 
 
import java.io.serializable; 
 
/** 
 * 基础消息类 
 * 
 * @author phil 
 * 
 */ 
public abstract class abstractmsg implements serializable { 
  
 private static final long serialversionuid = -6244277633057415731l; 
 private string tousername; // 开发者微信号 
 private string fromusername; // 发送方帐号(一个openid) 
 private string msgtype = setmsgtype(); // 消息类型 例如 /text/image 
 private long createtime; // 消息创建时间 (整型) 
 private long msgid; // 消息id,64位整型 
 /** 
  * 消息类型 
  * 
  * @return 
  */ 
 public abstract string setmsgtype(); 
} 

文本消息textmsg.java

package com.phil.wechat.msg.model.req; 
 
/** 
 * 文本消息 
 * @author phil 
 * @date 2017年6月30日 
 * 
 */ 
public class textmsg extends abstractmsg { 
 
 private static final long serialversionuid = -1764016801417503409l; 
 private string content; // 文本消息 
 @override 
 public string setmsgtype() { 
  return "text"; 
 } 
} 

其他的依样画葫芦......

二、被动回复用户消息

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

如果出现“该公众号暂时无法提供服务,请稍后再试”,原因有两个

  • 开发者在5秒内未回复任何内容
  • 开发者回复了异常数据

比如回复的文本消息xml示例

<xml> 
<tousername><![cdata[touser]]></tousername> 
<fromusername><![cdata[fromuser]]></fromusername> 
<createtime>12345678</createtime> 
<msgtype><![cdata[text]]></msgtype> 
<content><![cdata[你好]]></content> 
</xml> 

简单封装下

回复消息抽象基类respabstractmsg.java

package com.phil.wechat.msg.model.resp; 
 
import java.io.serializable; 
 
/** 
 * 消息基类(公众帐号 -> 普通用户) 
 * 
 * @author phil 
 * 
 */ 
public abstract class respabstractmsg{ 
 // 接收方帐号(收到的openid) 
 private string tousername; 
 // 开发者微信号 
 private string fromusername; 
 // 消息创建时间 (整型) 
 private long createtime; 
 // 消息类型(text/music/news) 
 private string msgtype = setmsgtype(); // 消息类型 
 public abstract string setmsgtype(); 
} 

回复文本消息resptextmsg.java

package com.phil.wechat.msg.model.resp; 
 
/** 
 * 回复图片消息 
 * 
 * @author phil 
 * @data 2017年3月26日 
 * 
 */ 
public class respimagemsg extends respabstractmsg { 
 private image image; 
 @override 
 public string setmsgtype() { 
  return "image"; 
 } 
 
 /** 
  * 
  * @author phil 
  * @date 2017年7月19日 
  * 
  */ 
 public class image { 
 
  // 通过素材管理中的接口上传多媒体文件,得到的id。 
  private string mediaid; 
 
  public string getmediaid() { 
   return mediaid; 
  } 
 
  public void setmediaid(string mediaid) { 
   mediaid = mediaid; 
  } 
 } 
} 

其他消息类型依样画葫芦......

三、消息的处理

掌握xml解析

package com.phil.wechat.msg.controller; 
 
import java.io.ioexception; 
import java.io.inputstream; 
import java.util.map; 
import java.util.objects; 
 
import org.apache.commons.lang3.stringutils; 
import org.dom4j.documentexception; 
import org.slf4j.logger; 
import org.slf4j.loggerfactory; 
import org.springframework.beans.factory.annotation.autowired; 
import org.springframework.stereotype.controller; 
import org.springframework.web.bind.annotation.requestmapping; 
import org.springframework.web.bind.annotation.requestmethod; 
 
import com.phil.modules.config.wechatconfig; 
import com.phil.modules.util.msgutil; 
import com.phil.modules.util.signatureutil; 
import com.phil.modules.util.xmlutil; 
import com.phil.wechat.base.controller.basecontroller; 
import com.phil.wechat.base.result.wechatresult; 
import com.phil.wechat.msg.model.req.basicmsg; 
import com.phil.wechat.msg.model.resp.respabstractmsg; 
import com.phil.wechat.msg.model.resp.respnewsmsg; 
import com.phil.wechat.msg.service.wechatmsgservice; 
 
/** 
 * @author phil 
 * @date 2017年9月19日 
 * 
 */ 
@controller 
@requestmapping("/wechat") 
public class wechatmsgcontroller extends basecontroller { 
  
 private logger logger = loggerfactory.getlogger(this.getclass()); 
  
 @autowired 
 private wechatmsgservice wechatmsgservice; 
  
 /** 
  * 校验信息是否是从微信服务器发出,处理消息 
  * @param out 
  * @throws ioexception 
  */ 
 @requestmapping(value = "/handler", method = { requestmethod.get, requestmethod.post }) 
 public void processpost() throws exception { 
  this.getrequest().setcharacterencoding("utf-8"); 
  this.getresponse().setcharacterencoding("utf-8"); 
  boolean ispost = objects.equals("post", this.getrequest().getmethod().touppercase()); 
  if (ispost) { 
   logger.debug("接入成功,正在处理逻辑"); 
   string respxml = defaultmsgdispose(this.getrequest().getinputstream());//processrequest(request, response); 
   if (stringutils.isnotblank(respxml)) { 
    this.getresponse().getwriter().write(respxml); 
   } 
  } else { 
   string signature = this.getrequest().getparameter("signature"); 
   // 时间戳 
   string timestamp = this.getrequest().getparameter("timestamp"); 
   // 随机数 
   string nonce = this.getrequest().getparameter("nonce"); 
   // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 
   if (signatureutil.checksignature(signature, timestamp, nonce)) { 
    // 随机字符串 
    string echostr = this.getrequest().getparameter("echostr"); 
    logger.debug("接入成功,echostr {}", echostr); 
    this.getresponse().getwriter().write(echostr); 
   } 
  } 
 } 
 
 /** 
  * 默认处理方法 
  * @param input 
  * @return 
  * @throws exception 
  * @throws documentexception 
  */ 
 private string defaultmsgdispose(inputstream inputstream) throws exception { 
  string result = null; 
  if (inputstream != null) { 
   map<string, string> params = xmlutil.parsestreamtomap(inputstream); 
   if (params != null && params.size() > 0) { 
    basicmsg msginfo = new basicmsg(); 
    string createtime = params.get("createtime"); 
    string msgid = params.get("msgid"); 
    msginfo.setcreatetime((createtime != null && !"".equals(createtime)) ? integer.parseint(createtime) : 0); 
    msginfo.setfromusername(params.get("fromusername")); 
    msginfo.setmsgid((msgid != null && !"".equals(msgid)) ? long.parselong(msgid) : 0); 
    msginfo.settousername(params.get("tousername")); 
    wechatresult resultobj = corehandler(msginfo, params); 
    if(resultobj == null){ // 
     return null; 
    } 
    boolean success = resultobj.issuccess(); //如果 为true,则表示返回xml文件, 直接转换即可,否则按类型 
    if (success) { 
     result = resultobj.getobject().tostring(); 
    } else { 
     int type = resultobj.gettype(); // 这里规定 1 图文消息 否则直接转换 
     if (type == wechatresult.newsmsg) { 
      respnewsmsg newsmsg = (respnewsmsg) resultobj.getobject(); 
      result = msgutil.newsmsgtoxml(newsmsg); 
     } else { 
      respabstractmsg basicmsg = (respabstractmsg) resultobj.getobject(); 
      result = msgutil.msgtoxml(basicmsg); 
     } 
    } 
   } else { 
    result = "msg is wrong"; 
   } 
  } 
  return result; 
 } 
  
 /** 
  * 核心处理 
  * 
  * @param msg 
  *   消息基类 
  * @param params 
  *   xml 解析出来的 数据 
  * @return 
  */ 
 private wechatresult corehandler(basicmsg msg, map<string, string> params) { 
  wechatresult result = null; 
  string msgtype = params.get("msgtype"); 
  if (stringutils.isempty(msgtype)) { 
   switch (msgtype) { 
   case wechatconfig.req_message_type_text: // 文本消息 
    result = wechatmsgservice.textmsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_image: // 图片消息 
    result = wechatmsgservice.imagemsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_link: // 链接消息 
    result = wechatmsgservice.linkmsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_location: // 地理位置 
    result = wechatmsgservice.locationmsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_voice: // 音频消息 
    result = wechatmsgservice.voicemsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_shortvideo: // 短视频消息 
    result = wechatmsgservice.shortvideo(msg, params); 
    break; 
   case wechatconfig.req_message_type_video: // 视频消息 
    result = wechatmsgservice.videomsg(msg, params); 
    break; 
   case wechatconfig.req_message_type_event: // 事件消息 
    string eventtype = params.get("event"); // 
    if (eventtype != null && !"".equals(eventtype)) { 
     switch (eventtype) { 
     case wechatconfig.event_type_subscribe: 
      result = wechatmsgservice.subscribe(msg, params); 
      break; 
     case wechatconfig.event_type_unsubscribe: 
      result = wechatmsgservice.unsubscribe(msg, params); 
      break; 
     case wechatconfig.event_type_scan: 
      result = wechatmsgservice.scan(msg, params); 
      break; 
     case wechatconfig.event_type_location: 
      result = wechatmsgservice.eventlocation(msg, params); 
      break; 
     case wechatconfig.event_type_click: 
      result = wechatmsgservice.eventclick(msg, params); 
      break; 
     case wechatconfig.event_type_view: 
      result = wechatmsgservice.eventview(msg, params); 
      break; 
     case wechatconfig.kf_create_session: 
      result = wechatmsgservice.kfcreatesession(msg, params); 
      break; 
     case wechatconfig.kf_close_session: 
      result = wechatmsgservice.kfclosesession(msg, params); 
      break; 
     case wechatconfig.kf_switch_session: 
      result = wechatmsgservice.kfswitchsession(msg, params); 
      break; 
     default: 
      wechatmsgservice.eventdefaultreply(msg, params); 
      break; 
     } 
    } 
    break; 
   default: 
    wechatmsgservice.defaultmsg(msg, params); 
   } 
  } 
  return result; 
 } 
} 

只是提供个思路,如若参考代码请移步

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。