微信公眾號實現回覆圖文訊息
阿新 • • 發佈:2019-02-07
圖文訊息的主要引數說明
通過微信官方的訊息介面指南,可以看到對圖文訊息的引數介紹,如下圖所示:
從上圖可以瞭解到:
1、圖文訊息的個數限制為10,也就是圖文中ArticleCount的值(圖文訊息的個數,限制在10條以內)
2、對於圖文訊息,第一條圖文的圖片顯示為大圖,其他圖文的圖片顯示為小圖。
3、第一條圖文的圖片大小建議為640*320,其他圖文的圖片建議為80*80
下面開始實現:
請求訊息的基類:
import com.thoughtworks.xstream.annotations.XStreamAlias; import java.io.Serializable; /** * @author inchlifc */ public class BaseMessage implements Serializable { @XStreamAlias("ToUserName") @XStreamCDATA private String ToUserName; @XStreamAlias("FromUserName") @XStreamCDATA private String FromUserName; @XStreamAlias("CreateTime") private Long CreateTime; @XStreamAlias("MsgType") @XStreamCDATA private String MsgType; public BaseMessage() { super(); } public BaseMessage(String fromUserName, String toUserName) { super(); FromUserName = fromUserName; ToUserName = toUserName; CreateTime = System.currentTimeMillis(); } public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public Long getCreateTime() { return CreateTime; } public void setCreateTime(Long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } }
圖文訊息類:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.util.List;
@XStreamAlias("xml")
public class ArticlesMessage extends BaseMessage {
@XStreamAlias("ArticleCount")
private int ArticleCount;
@XStreamAlias("Articles")
private List<ArticlesItem> Articles;
public int getArticleCount() {
return ArticleCount;
}
public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
}
public List<ArticlesItem> getArticles() {
return Articles;
}
public void setArticles(List<ArticlesItem> articles) {
Articles = articles;
}
}
圖文訊息中的Articles類:
import com.thoughtworks.xstream.annotations.XStreamAlias; import java.util.List; @XStreamAlias("Articles") public class Articles { private List<ArticlesItem> Articles; }
圖文訊息中的ArticlesItem類:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import java.io.Serializable;
@XStreamAlias("item")
public class ArticlesItem implements Serializable {
@XStreamAlias("Title")
@XStreamCDATA
private String Title;
@XStreamAlias("Description")
@XStreamCDATA
private String Description;
@XStreamAlias("PicUrl")
@XStreamCDATA
private String PicUrl;
@XStreamAlias("Url")
@XStreamCDATA
private String Url;
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
service層實現方法:
封裝方法
/**
* 獲取部落格圖文訊息
*
* @param custermName
* @param serverName
* @param createTime
* @return
*/
private ArticlesMessage getBlogMessage(String custermName, String serverName, Long createTime) {
ArticlesMessage outputMsg = new ArticlesMessage();
outputMsg.setFromUserName(serverName);
outputMsg.setToUserName(custermName);
outputMsg.setCreateTime(createTime);
outputMsg.setMsgType(MsgType.NEWS.getValue());
List<ArticlesItem> articles = new ArrayList<>();
ArticlesItem item1 = new ArticlesItem();
item1.setTitle("晚天吹涼風");
item1.setDescription("點選進入晚天吹涼風部落格");
item1.setPicUrl(WechatConstant.BASE_SERVER + "resources/images/wechat/a.png");
item1.setUrl("https://my.oschina.net/inchlifc/blog");
articles.add(item1);
outputMsg.setArticles(articles);
outputMsg.setArticleCount(articles.size());
return outputMsg;
}
判斷如果輸入數字1,返回圖文訊息推送
// 處理接收訊息
ServletInputStream in = request.getInputStream();
// 將POST流轉換為XStream物件
XStream xs = new XStream();
xs = SerializeXmlUtil.createXstream();
XStream.setupDefaultSecurity(xs);
xs.allowTypes(new Class[]{TextMessage.class, InputMessage.class, ArticlesMessage.class});
xs.processAnnotations(InputMessage.class);
xs.processAnnotations(ArticlesMessage.class);
xs.processAnnotations(ImageMessage.class);
// 將指定節點下的xml節點資料對映為物件
xs.alias("xml", InputMessage.class);
// 將流轉換為字串
StringBuilder xmlMsg = new StringBuilder();
byte[] b = new byte[4096];
for (int n; (n = in.read(b)) != -1; ) {
xmlMsg.append(new String(b, 0, n, "UTF-8"));
}
logger.info("收到訊息====" + xmlMsg.toString());
// 將xml內容轉換為InputMessage物件
InputMessage inputMsg = (InputMessage) xs.fromXML(xmlMsg.toString());
// 服務端
String servername = inputMsg.getToUserName();
// 客戶端
String custermname = inputMsg.getFromUserName();
// 接收時間
long createTime = inputMsg.getCreateTime();
// 返回時間
Long returnTime = Calendar.getInstance().getTimeInMillis() / 1000;
//接手文字內容
String content = inputMsg.getContent();
// 取得訊息型別
String msgType = inputMsg.getMsgType();
if (MsgType.TEXT.getValue().equals(msgType)) {
//輸入1 推送部落格資訊
if ("1".equals(content)) {
logger.info("收到文字1");
ArticlesMessage outputMsg = getBlogMessage(custermname, servername, returnTime);
logger.info("返回部落格圖文訊息===" + xs.toXML(outputMsg));
response.getWriter().write(xs.toXML(outputMsg));
}
}