亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java微信公眾平臺之消息管理

2024-07-14 08:40:42
字體:
來源:轉載
供稿:網友

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;  } } 

只是提供個思路,如若參考代碼請移步

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区久久精品| 国产一区二区视频在线观看| 国内免费久久久久久久久久久| 欧美一级淫片aaaaaaa视频| 久久影视电视剧免费网站清宫辞电视| 国产69精品久久久| 日韩欧美成人区| 国产精品久久久久久久久影视| 久久亚洲一区二区三区四区五区高| 成人亲热视频网站| 国产丝袜视频一区| 国产精品网红福利| 精品亚洲一区二区三区在线播放| 久久视频在线观看免费| 欧美日韩亚洲一区二区三区| 最近2019好看的中文字幕免费| 国产mv免费观看入口亚洲| 日韩精品中文在线观看| 国产精品福利网站| 亚洲欧美一区二区激情| 久久成人综合视频| 亚洲一区二区日本| 欧美在线视频一二三| 日韩精品高清在线观看| 国产精品久久久久久久7电影| 久久久国产一区二区三区| 成人中文字幕在线观看| 久久久久久久一区二区| 日本高清视频精品| 日韩成人在线免费观看| 国产精品日韩欧美综合| 久热在线中文字幕色999舞| xxxxx成人.com| 国产精品啪视频| 国产不卡精品视男人的天堂| 日韩av大片在线| 国产精品久久久久福利| 国产精品一区久久久| 永久555www成人免费| 中文字幕亚洲在线| 一区二区三区视频免费在线观看| 中文字幕最新精品| 欧美中文字幕在线观看| 欧美视频中文字幕在线| 欧美猛男性生活免费| 欧美激情喷水视频| 2019日本中文字幕| 亚洲情综合五月天| 性欧美xxxx视频在线观看| 国产精品吊钟奶在线| 欧美放荡办公室videos4k| 中文欧美在线视频| 日韩精品免费看| 日韩免费观看视频| 人人爽久久涩噜噜噜网站| 91av在线精品| 欧美一区第一页| 亚洲激情第一页| 日韩69视频在线观看| 欧美专区福利在线| 啪一啪鲁一鲁2019在线视频| 777午夜精品福利在线观看| 精品国产网站地址| 日韩av在线一区| 午夜精品一区二区三区在线| 亚洲性xxxx| 欧美在线一区二区三区四| 日韩国产欧美精品在线| 国产精品∨欧美精品v日韩精品| 亚洲深夜福利视频| 久久亚洲成人精品| 亚洲国产日韩欧美综合久久| 欧美大尺度激情区在线播放| 国产精品99久久久久久久久久久久| 91香蕉电影院| 一色桃子一区二区| 国产欧美一区二区三区久久| 91精品国产91久久久久久不卡| 亚洲美女在线观看| 福利一区视频在线观看| 欧美激情成人在线视频| 91在线观看欧美日韩| 国模精品系列视频| 久久久国产精品x99av| 九九精品在线视频| 欧美裸体xxxxx| 精品国产乱码久久久久久天美| 97视频在线观看成人| 精品亚洲永久免费精品| 亚洲精选在线观看| 日韩中文在线中文网三级| 国产精品一区二区久久久久| 久久精品国产v日韩v亚洲| 亚洲图中文字幕| 欧洲日韩成人av| 色综合天天综合网国产成人网| 久久久久九九九九| 成人在线国产精品| 国产精品欧美在线| 18一19gay欧美视频网站| 久久综合五月天| 成人欧美在线视频| 国产精品网站入口| 亚洲精品免费av| 欧美国产日本在线| 国产99久久精品一区二区| 91精品久久久久久| 中文字幕亚洲一区| 国产69精品久久久| 国产精品aaa| 尤物99国产成人精品视频| 亚洲黄色成人网| 欧美日韩国产成人高清视频| 91国产视频在线播放| 日韩欧美中文第一页| 国产精品日韩欧美综合| 亚洲福利影片在线| 亚洲成人1234| 日韩视频精品在线| 久久久精品中文字幕| 日韩av大片免费看| 亚洲美女精品久久| 青草成人免费视频| 国产成人精品视频在线观看| 日韩欧美国产中文字幕| 日本道色综合久久影院| 色一区av在线| 日韩欧美成人精品| 亚洲影院色在线观看免费| 在线成人一区二区| 日韩最新免费不卡| 美女福利精品视频| 亚洲国产高清高潮精品美女| 日日狠狠久久偷偷四色综合免费| 国产不卡精品视男人的天堂| 日韩av黄色在线观看| 国产精品高潮在线| 成人精品久久av网站| 国产精品av在线播放| 亚洲视频国产视频| 国产精品一区二区3区| 久久全球大尺度高清视频| 国产精品自产拍高潮在线观看| 亚洲www在线观看| 精品欧美一区二区三区| 亚洲精品国产精品乱码不99按摩| 国产精品久久久av| 国产成人精品最新| 国产精品久久久久久久久久三级| 欧美日韩国产页| 日本一区二区三区在线播放| 亚洲人线精品午夜| 色偷偷91综合久久噜噜| 欧洲亚洲免费视频| 国语自产偷拍精品视频偷| 亚洲视频欧美视频| 欧美资源在线观看| 国产精品入口免费视频一| 国产一区二区三区四区福利| 91九色精品视频| 国产精品美女主播在线观看纯欲| 欧美日韩综合视频网址| 欧美性猛交xxxx黑人猛交| 51色欧美片视频在线观看|