上一节内容:
微信开发学习总结(三)——消息管理(1)
https://blog.csdn.net/qq_29914837/article/details/82903594
消息管理具有的各个子模块功能,现在我们将一个详细介绍如何使用
一、接受普通消息接口介绍
1.1、接受普通消息
接收到的普通消息的消息类型目前有以下几种:
①文本消息
②图片消息
③语音消息
④视频消息
⑤小视频消息
⑥地理位置消息
⑦链接消息
每一种消息类型都有其指定的XML数据格式,在官方文档上都有具体的格式定义和属性说明。
当普通微信用户向公众账号发消息时,微信服务器会先接收到用户发送的消息,然后将用户消息按照指定的XML格式组装好数据,最后POST消息的XML数据包到开发者填写的URL上。
接收消息的整个过程:就是获取post请求的这个xml,然后对这个xml进行分析的过程。post请求的入口还是之前提到的微信公众号接入的那个地址,整个公众号的所有请求都会走这个入口,只是接入时是get请求,其它情况下是post请求。
二、被动回复用户消息接口介绍
2.1、被动回复用户消息
被动回复用户消息的消息类型目前有以下几种:
①回复文本消息
②回复图片消息
③回复语音消息
④回复视频消息
⑤回复音乐消息
⑥回复图文消息
微信服务器在将用户的消息发给公众号的开发者服务器地址后,会等待开发者服务器回复响应消息。微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。
假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。详见下面说明:
1、(推荐方式)直接回复success
2、直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)
一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:
1、开发者在5秒内未回复任何内容
2、开发者回复了异常数据,比如JSON数据等
另外,请注意,回复图片等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。
消息回复目前支持回复文本、图片、图文、语音、视频、音乐,每一种类型的消息都有特定的XML数据格式。
三、微信公众号的普通消息的接收和回复的实现
接收消息和被动回复消息这两个动作是不分家的,这本来就是一个交互场景,一般情况就是公众号通过分析接收到的消息,会给出对应的回复。
3.1、微信公众号的普通消息的接收和回复的实现的开发流程思路
(1)微信服务器发送post请求的xml数据到微信公众号服务器
(2)微信公众号服务器需要解析xml格式的数据
(3)根据微信公众号被动回复用户消息接口中回复消息的xml格式,构建回复消息的格式内容
(4)返回构建的消息xml格式的消息内容到微信服务器,由微信服务器转发到微信公众号回复
3.2、现在我将一个个步骤进行模拟代码实现:
(1)当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
/**
* 处理微信服务器发post请求发来的xml格式消息
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
long startTime=System.currentTimeMillis(); //获取开始时间
// TODO 接收、处理、响应由微信服务器转发的用户发送给公众帐号的消息
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
System.out.println("微信的post请求进入了本地服务器了");
String result = "";
try {
Map<String,String> map = WeiXinCheck.parseXml(request);
System.out.println("微信公众号要开始发送消息");
result = WeiXinCheck.buildResponseMessage(map);
if(result.equals("")){
result = "未正确响应";
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("发生异常:"+ e.getMessage());
}
response.getWriter().println(result);
System.out.println( result) ;
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(endTime-startTime)+"ms");
}
(2)然后我们需要对这个xml数据进行解析处理,这样才可以得知微信服务器转发的消息内容。
/**
* 解析微信发来的请求(XML)并且转换为Map
* @param request
* @return map
* @throws Exception
*/
public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String,String> map = new HashMap();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList) {
System.out.println(e.getName() + "|" + e.getText());
map.put(e.getName(), e.getText());
}
// 释放资源
inputStream.close();
return map;
}
这样我们就完成了post传递到URL的xml格式的消息的接收。
(3)根据微信公众号被动回复用户消息接口中回复消息的xml格式,构建回复消息的格式内容
代码结构图:
公共实体类
package weixin.entity.message.common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-公用消息实体类
* @author yilei
* @version:1.0
*/
public class Common {
private String toUserName;//消息接收方
private String fromUserName;//消息发送方
private String createTime;//消息创建时间 (整型)
private String msgType;//消息类型
private String msgId;//消息id,64位整型
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMsgType() {
return msgType;
}
public void setMsgType(String msgType) {
this.msgType = msgType;
}
public String getMsgId() {
return msgId;
}
public void setMsgId(String msgId) {
this.msgId = msgId;
}
public Common(String toUserName, String fromUserName, String createTime, String msgType, String msgId) {
this.toUserName = toUserName;
this.fromUserName = fromUserName;
this.createTime = createTime;
this.msgType = msgType;
this.msgId = msgId;
}
public Common(String toUserName, String fromUserName, String createTime ) {
this.toUserName = toUserName;
this.fromUserName = fromUserName;
this.createTime = createTime;
}
public Common(){
}
}
①构造文本消息
package weixin.entity.message.text;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-文本消息
* @author yilei
* @version:1.0
*/
public class Text {
private Common common;//公用消息实体类
private String content;//文本消息内容
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public Text(){
}
/**
* @param common
* @param content
*/
public Text(Common common, String content) {
this.common = common;
this.content = content;
}
}
/**
* 构造文本消息
* @param text 封装了解析结果的Text对象
* @return 文本消息XML字符串
*/
private static String buildTextMessage(Text text) {
String result = "";
if(text!=null){
result=String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[text]]></MsgType>" +
"<Content><![CDATA[%s]]></Content>" + "</xml>",
text.getCommon().getFromUserName(), text.getCommon().getToUserName(), text.getCommon().getCreateTime(), text.getContent());
}
return result;
}
②构建图片消息
package weixin.entity.message.image;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-图片消息
* @author yilei
* @version:1.0
*/
public class Image {
private Common common;//公用消息实体类
private String mediaId;//图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getMediaId() {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
/**
* @param common
* @param mediaId
*/
public Image(Common common, String mediaId) {
this.common = common;
this.mediaId = mediaId;
}
public Image(){
}
}
/**
* 构造图片消息
* @param image 封装了解析结果的Image对象
* @return 图片消息XML字符串
*/
public static String buildImageMessage(Image image) {
String result = "";
if(image!=null){
result= String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[image]]></MsgType>" +
"<Image>"+
" <MediaId><![CDATA[%s]]></MediaId>" +
"</Image>"+
"</xml>",
image.getCommon().getFromUserName(), image.getCommon().getToUserName(),image.getCommon().getCreateTime(),image.getMediaId());
}
return result;
}
③构建语言消息
package weixin.entity.message.voice;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-语音消息
* @author yilei
* @version:1.0
*/
public class Voice {
private Common common;//公用消息实体类
private String mediaId;//语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getMediaId() {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
/**
* @param common
* @param mediaId
*/
public Voice(Common common, String mediaId) {
this.common = common;
this.mediaId = mediaId;
}
public Voice(){
}
}
/**
* 构造语音消息
* @param voice 封装了解析结果的Voice对象
* @return 视频消息XML字符串
*/
public static String buildVoiceMessage(Voice voice) {
String result = "";
if(voice!=null){
result= String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[voice]]></MsgType>" +
"<Voice>"+
" <MediaId><![CDATA[%s]]></MediaId>" +
"</Voice>"+
"</xml>",
voice.getCommon().getFromUserName(), voice.getCommon().getToUserName(), voice.getCommon().getCreateTime(),voice.getMediaId());
}
return result;
}
④构建视频消息
package weixin.entity.message.video;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-视频消息
* @author yilei
* @version:1.0
*/
public class Video {
private Common common;//公用消息实体类
private String mediaId;//通过素材管理中的接口上传多媒体文件,得到的id
private String title;//视频消息的标题
private String description;//视频消息的描述
/**
* @param common
* @param mediaId
* @param title
* @param description
*/
public Video(Common common, String mediaId, String title, String description) {
this.common = common;
this.mediaId = mediaId;
this.title = title;
this.description = description;
}
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getMediaId() {
return mediaId;
}
public void setMediaId(String mediaId) {
this.mediaId = mediaId;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Video(){
}
}
/**
* 构造视频消息
* @param video 封装了解析结果的Video对象
* @return 视频消息XML字符串
*/
public static String buildVideoMessage(Video video) {
String result = "";
if(video!=null){
result= String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[video]]></MsgType>" +
"<Video>" +
" <MediaId><![CDATA[%s]]></MediaId>" +
" <Title><![CDATA[%s]]></Title>" +
" <Description><![CDATA[%s]]></Description>" +
"</Video>" +
"</xml>",
video.getCommon().getFromUserName(), video.getCommon().getToUserName(), video.getCommon().getCreateTime(),video.getMediaId(),video.getTitle(),video.getDescription());
}
return result;
}
⑤构建音乐消息
package weixin.entity.message.music;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-音乐消息
* @author yilei
* @version:1.0
*/
public class Music {
private Common common;//公用消息实体类
private String title;//音乐标题
private String description;//音乐描述
private String musicURL;//音乐链接
private String hQMusicUrl;//高质量音乐链接,WIFI环境优先使用该链接播放音乐
private String thumbMediaId;//缩略图的媒体id,通过素材管理中的接口上传多媒体文件,得到的id
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getMusicURL() {
return musicURL;
}
public void setMusicURL(String musicURL) {
this.musicURL = musicURL;
}
public String gethQMusicUrl() {
return hQMusicUrl;
}
public void sethQMusicUrl(String hQMusicUrl) {
this.hQMusicUrl = hQMusicUrl;
}
public String getThumbMediaId() {
return thumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
this.thumbMediaId = thumbMediaId;
}
/**
* @param common
* @param title
* @param description
* @param musicURL
* @param hQMusicUrl
* @param thumbMediaId
*/
public Music(Common common, String title, String description, String musicURL, String hQMusicUrl,
String thumbMediaId) {
this.common = common;
this.title = title;
this.description = description;
this.musicURL = musicURL;
this.hQMusicUrl = hQMusicUrl;
this.thumbMediaId = thumbMediaId;
}
public Music(){
}
}
/**
* 构造音乐消息
* @param music 封装了解析结果的Music对象
* @return 音乐消息XML字符串
*/
public static String buildMusicMessage(Music music) {
String result = "";
if(music!=null){
result= String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[music]]></MsgType>" +
"<Music>"+
" <Title><![CDATA[%s]]></Title>"+
" <Description><![CDATA[%s]]></Description>"+
" <MusicUrl><![CDATA[%s]]></MusicUrl>"+
" <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>" +
" <ThumbMediaId><![CDATA[%s]]></ThumbMediaId>" +
"</Music>"+
"</xml>",
music.getCommon().getFromUserName(), music.getCommon().getToUserName(), music.getCommon().getCreateTime(),music.getTitle(),music.getDescription(),music.getMusicURL(),music.gethQMusicUrl(),music.getThumbMediaId());
}
return result;
}
⑥构建图文消息
package weixin.entity.message.news;
import weixin.entity.message.articles.Articles;
import weixin.entity.message.common.Common;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-图文消息
* @author yilei
* @version:1.0
*/
public class News {
private Common common;//公用消息实体类
private String articleCount;//图文消息个数,限制为1条以内
private Articles articles;//图文消息信息,注意,如果图文数超过1,则将只发第1条
private String articlesXml;//图文消息信息,注意,如果图文数超过1,则将只发第1条(xml格式)
public String getArticlesXml() {
return articlesXml;
}
public void setArticlesXml(String articlesXml) {
this.articlesXml = articlesXml;
}
public Common getCommon() {
return common;
}
public void setCommon(Common common) {
this.common = common;
}
public String getArticleCount() {
return articleCount;
}
public void setArticleCount(String articleCount) {
this.articleCount = articleCount;
}
public Articles getArticles() {
return articles;
}
public void setArticles(Articles articles) {
this.articles = articles;
}
/**
* @param common
* @param articleCount
* @param articles
*/
public News(Common common, String articleCount, Articles articles,String articlesXml) {
this.common = common;
this.articleCount = articleCount;
this.articles = articles;
this.articlesXml = articlesXml;
}
/**
* @param common
* @param articleCount
* @param articlesXml
*/
public News(Common common, String articleCount,String articlesXml) {
this.common = common;
this.articleCount = articleCount;
this.articlesXml = articlesXml;
}
public News(){
}
}
package weixin.entity.message.articles;
/**
* @所属类别:实体类
* @用途:微信公众号开发中消息管理-图文消息-文章试题类
* @author yilei
* @version:1.0
*/
public class Articles {
private String title;//图文消息标题
private String description;//图文消息描述
private String picUrl;//图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
private String url;//点击图文消息跳转链接
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
/**
* @param title
* @param description
* @param picUrl
* @param url
*/
public Articles(String title, String description, String picUrl, String url) {
this.title = title;
this.description = description;
this.picUrl = picUrl;
this.url = url;
}
public Articles(){
}
}
/**
* 构造图文消息
* @param news 封装了解析结果的News对象
* @return 图文消息XML字符串
*/
public static String buildNewsMessage(News news) {
String result = "";
if(news!=null){
result= String.format(
"<xml>" +
"<ToUserName><![CDATA[%s]]></ToUserName>" +
"<FromUserName><![CDATA[%s]]></FromUserName>" +
"<CreateTime>%s</CreateTime>" +
"<MsgType><![CDATA[news]]></MsgType>" +
"<ArticleCount>%s</ArticleCount>" +
"<Articles>%s</Articles>" +
"</xml>",
news.getCommon().getFromUserName(), news.getCommon().getToUserName(), news.getCommon().getCreateTime(),news.getArticleCount(),news.getArticlesXml());
}
return result;
}
/**
* 构造图文消息-一条消息记录
* @param news 封装了解析结果的News对象
* @return 图文消息XML字符串
*/
private static String buildArticlesMessage(Articles articles) {
String result = "";
if(articles!=null){
result= String.format("<item>\n" +
"<Title><![CDATA[%s]]></Title> \n" +
"<Description><![CDATA[%s]]></Description>\n" +
"<PicUrl><![CDATA[%s]]></PicUrl>\n" +
"<Url><![CDATA[%s]]></Url>\n" +
"</item>", articles.getTitle(), articles.getDescription(),articles.getPicUrl(),articles.getUrl());
}
return result;
}
(4)返回构建的消息xml格式的消息内容到微信服务器,由微信服务器转发到微信公众号回复
/**
* Token可由开发者可以任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性)
* 这里和你服务器配置-令牌(token)一致
*/
public static final String TOKEN ="yilei";
/**
* 第三方用户唯一凭证
*/
public static final String APPID="wxc931e30eb7da614b";
/**
* 第三方用户唯一凭证密钥,即appsecret
*/
public static final String APPSECRET="ae68f7583fda08460e116fc02780aab8";
/**
* 获取access_token的调用接口
*/
public static final String ACCESS_TOKEN_URL="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
/**
* 接收到的消息类型-文本消息
*/
public static final String TEXT="TEXT";
/**
* 接收到的消息类型-图片消息
*/
public static final String IMAGE="IMAGE";
/**
* 接收到的消息类型-语音消息
*/
public static final String VOICE="VOICE";
/**
* 接收到的消息类型-视频消息
*/
public static final String VIDEO="VIDEO";
/**
* 接收到的消息类型-小视频消息
*/
public static final String SHORTVIDEO="SHORTVIDEO";
/**
* 接收到的消息类型-地理位置消息
*/
public static final String LOCATION="LOCATION";
/**
* 接收到的消息类型-链接消息
*/
public static final String LINK="LINK";
/**
* 事件类型-事件消息
*/
public static final String EVENT="EVENT";
/**
* 素材你管理-新增临时素材接口
*/
public static final String New_Temporary_Material_Interface = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE";
/**
* 根据消息内容构造返回消息
* @param map 封装了解析结果的Map
* @return responseMessage(响应消息)
*/
public static String buildResponseMessage(Map map) {
//响应消息
String responseMessage="";
//得到消息类型
String msgType = map.get("MsgType").toString().toUpperCase();
Common common = new Common(map.get("ToUserName").toString(), map.get("FromUserName").toString(), WeiXinCheck.getCreateTime());
if("TEXT".equals(msgType)){
// 消息内容
String content = map.get("Content").toString();
switch (content) {
case "文本":
//处理文本消息
Text text = new Text(common, "欢迎猪牧狼马蜂!");
responseMessage = WeiXinCheck.buildTextMessage(text);
break;
case "图片":
//处理图片消息
Image image = new Image(common, "f8nhXwittsvHHMxjRjLyIh969fQbsfIsNLhamifwxVqoZTyuEgMg8Il7WG0-1vZ_");
responseMessage = WeiXinCheck.buildImageMessage(image);
break;
case "语音":
//处理语音消息
Voice voice = new Voice(common, "zzefkVeuF0ZSGZ39B3rzbo9243uyksewR682A3leU9jNSoMrQG0ErkvO2qtptNnr");
responseMessage = WeiXinCheck.buildVoiceMessage(voice);
break;
case "视频":
//处理视频消息
Video video = new Video(common, "mQr8c5NqywVyLhwMT1j5mhi03jSvK19MvLTcqFRej_PoW8Uai5H-7lHMk8XL14B5", "《微信公众号开发学习视频》","本视频详细的介绍了微信公众号开发流程和步骤,可以更好帮助你快速的学会开发微信公众号。");
responseMessage = WeiXinCheck.buildVideoMessage(video);
break;
case "音乐":
//处理音乐消息
Music music = new Music(common, "音乐标题", "音乐描述", "http://www.ytmp3.cn/down/53421.mp3","http://www.ytmp3.cn/down/53420.mp3","f8nhXwittsvHHMxjRjLyIh969fQbsfIsNLhamifwxVqoZTyuEgMg8Il7WG0-1vZ_");
responseMessage = WeiXinCheck.buildMusicMessage(music);
break;
case "图文":
//处理音乐消息
Articles articles1 = new Articles("图文消息标题1", "图文消息描述","http://e5cd1621.ngrok.io/weixin/media/image/image.JPG", "https://www.baidu.com");
Articles articles2 = new Articles("图文消息标题1", "图文消息描述","http://e5cd1621.ngrok.io/weixin/media/image/image.JPG", "https://www.baidu.com");
Articles articles3 = new Articles("图文消息标题1", "图文消息描述","http://e5cd1621.ngrok.io/weixin/media/image/image.JPG", "https://www.baidu.com");
List<Articles> list = new ArrayList<Articles>();
list.add(articles1);list.add(articles2);list.add(articles3);
StringBuffer articlesXml= new StringBuffer( );
for (Articles articles : list) {
articlesXml.append(WeiXinCheck.buildArticlesMessage(articles));
}
News news = new News(common,String.valueOf(list.size()),articlesXml.toString());
responseMessage = WeiXinCheck.buildNewsMessage(news);
break;
default:
//处理文本消息
Text text1 = new Text(common, "请回复如下关键词:\n文本\n图片\n语音\n视频\n音乐\n图文");
responseMessage = WeiXinCheck.buildTextMessage(text1);
break;
}
}
//返回响应消息
return responseMessage;
}
四、项目运行结果
五、素材管理-新增临时素材
上述中回复的图片、视频、语言等多媒体消息都需要media_id,而media_id可以调用素材管理接口来获取,本例中我使用的时新增临时素材接口
具体调用方式请参考
微信开发学习总结(五)——素材管理(1)—获取临时素材和新增永久素材
https://blog.csdn.net/qq_29914837/article/details/82923132
本节代码:
微信开发学习总结(三)——消息管理(2)-接受普通消息和被动回复用户消息——项目源码
下载地址:
https://download.csdn.net/download/qq_29914837/10699782
下一节内容:
微信开发学习总结(三)——消息管理(3)-接收事件推送
https://blog.csdn.net/qq_29914837/article/details/82925451