1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 微信公众号-关注取消关注后图文和普通消息自动回复

微信公众号-关注取消关注后图文和普通消息自动回复

时间:2022-08-13 21:45:09

相关推荐

微信公众号-关注取消关注后图文和普通消息自动回复

当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

微信服务器在将用户的消息发给公众号的开发者服务器地址(开发者中心处配置)后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次,如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。关于重试的消息排重,有msgid的消息推荐使用msgid排重。事件类型消息推荐使用FromUserName + CreateTime 排重。

如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给公众号的消息以及公众号被动回复用户消息都会继续加密,详见被动回复消息加解密说明。

假如服务器无法保证在五秒内处理并回复,必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试(这种情况下,可以使用客服消息接口进行异步回复),否则,将出现严重的错误提示。详见下面说明:

1、直接回复success(推荐方式) 2、直接回复空串(指字节长度为0的空字符串,而不是XML结构体中content字段的内容为空)

一旦遇到以下情况,微信都会在公众号会话中,向用户下发系统提示“该公众号暂时无法提供服务,请稍后再试”:

1、开发者在5秒内未回复任何内容 2、开发者回复了异常数据,比如JSON数据等

另外,请注意,回复图片(不支持gif动图)等多媒体消息时需要预先通过素材管理接口上传临时素材到微信服务器,可以使用素材管理中的临时素材,也可以使用永久素材。

各消息类型需要的XML数据包结构如下:

文章目录

回复文本消息回复图片消息回复语音消息回复视频消息回复音乐消息回复图文消息**ArticleItem**InMsgEntityOutMsgEntityEchostrController

1 回复文本消息

2 回复图片消息

3 回复语音消息

4 回复视频消息

5 回复音乐消息

6 回复图文消息

回复文本消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[你好]]></Content></xml>

参数 是否必须 描述

ToUserName 是 接收方帐号(收到的OpenID)

FromUserName 是 开发者微信号

CreateTime 是 消息创建时间 (整型)

MsgType 是 消息类型,文本为text

Content 是 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

回复图片消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[image]]></MsgType><Image><MediaId><![CDATA[media_id]]></MediaId></Image></xml>

参数 是否必须 说明

ToUserName 是 接收方帐号(收到的OpenID) FromUserName 是 开发者微信号

CreateTime 是 消息创建时间 (整型) MsgType 是 消息类型,图片为image

MediaId 是 通过素材管理中的接口上传多媒体文件,得到的id。

回复语音消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[voice]]></MsgType><Voice><MediaId><![CDATA[media_id]]></MediaId></Voice></xml>

参数 是否必须 说明 ToUserName 是 接收方帐号(收到的OpenID) FromUserName 是 开发者微信号

CreateTime 是 消息创建时间戳 (整型) MsgType 是 消息类型,语音为voice

MediaId 是 通过素材管理中的接口上传多媒体文件,得到的id

回复视频消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[video]]></MsgType><Video><MediaId><![CDATA[media_id]]></MediaId><Title><![CDATA[title]]></Title><Description><![CDATA[description]]></Description></Video></xml>

参数 是否必须 说明 ToUserName 是 接收方帐号(收到的OpenID) FromUserName 是 开发者微信号

CreateTime 是 消息创建时间 (整型) MsgType 是 消息类型,视频为video

MediaId 是 通过素材管理中的接口上传多媒体文件,得到的id Title 否 视频消息的标题

Description 否 视频消息的描述

回复音乐消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[TITLE]]></Title><Description><![CDATA[DESCRIPTION]]></Description><MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl><HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl><ThumbMediaId><![CDATA[media_id]]></ThumbMediaId></Music></xml>

参数 是否必须 说明

ToUserName 是 接收方帐号(收到的OpenID) FromUserName 是 开发者微信号

CreateTime 是 消息创建时间 (整型) MsgType 是 消息类型,音乐为music Title 否 音乐标题

Description 否 音乐描述 MusicURL 否 音乐链接

HQMusicUrl 否 高质量音乐链接,WIFI环境优先使用该链接播放音乐

ThumbMediaId 是 缩略图的媒体id,通过素材管理中的接口上传多媒体文件,得到的id

回复图文消息

<xml><ToUserName><![CDATA[toUser]]></ToUserName><FromUserName><![CDATA[fromUser]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[title1]]></Title><Description><![CDATA[description1]]></Description><PicUrl><![CDATA[picurl]]></PicUrl><Url><![CDATA[url]]></Url></item></Articles></xml>

参数 是否必须 说明

ToUserName 是 接收方帐号(收到的OpenID)

FromUserName 是 开发者微信号

CreateTime 是 消息创建时间 (整型)

MsgType 是 消息类型,图文为news

ArticleCount 是 图文消息个数;当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息

Articles 是 图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数

Title 是 图文消息标题

Description 是 图文消息描述

PicUrl 是 图片链接,支持JPG、PNG格式,较好的效果为大图360200,小图200200

Url 是 点击图文消息跳转链接

代码:

ArticleItem

package com.camel.ssm.bean;import lombok.Getter;import lombok.Setter;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;import java.util.List;/*** 接收普通消息*/@XmlRootElement(name="xml")@XmlAccessorType(XmlAccessType.FIELD)@Setter@Getterpublic class OutMsgEntity {// 如果要是小写的话 在每个字段都填上// @XmlRootElement(name="ToUserName")private String ToUserName;//开发者微信号private String FromUserName;//发送方帐号(一个OpenID)private Long CreateTime;//消息创建时间 (整型)private String Content;//文本消息内容private String MsgType;//消息类型,文本为text@XmlElementWrapper(name="Image")private String[] MediaId;//图片消息媒体id,可以调用获取临时素材接口拉取数据。private String ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。private String Scale;//地图缩放大小private String Label;//地理位置信息private String Title;//消息标题private String Description;//消息描述private String Url;//消息链接private String MusicURL;//否音乐链接private String HQMusicUrl;//否高质量音乐链接,WIFI环境优先使用该链接播放音乐//图文消息private int ArticleCount;//是图文消息个数;当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息private List<ArticleItem> Articles;//是图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数 多条图文消息信息,默认第一个item为大图private String PicUrl;//是图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200//图文列表明细@XmlElementWrapper(name="Articles")private ArticleItem[] item;}

InMsgEntity

package com.camel.ssm.bean;import lombok.Getter;import lombok.Setter;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlRootElement;/*** 接收普通消息*/@Getter@Setter@XmlRootElement(name="xml")@XmlAccessorType(XmlAccessType.FIELD)public class InMsgEntity {// 如果要是小写的话 在每个字段都填上// @XmlRootElement(name="ToUserName")private String ToUserName;//开发者微信号private String FromUserName;//发送方帐号(一个OpenID)private Long CreateTime;//消息创建时间 (整型)private String MsgType;//消息类型,文本为textprivate String Content;//文本消息内容private Long MsgId;//,64位整型private String PicUrl;//图片链接(由系统生成)// 图片消息媒体id,可以调用多媒体文件下载接口拉取数据private String MediaId;private String Format;//语音格式,如amr,speex等private String Recognition;//语音识别结果,UTF8编码private String ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。private String Location_X;//地理位置纬度private String Location_Y;;//地理位置经度private String Scale;//地图缩放大小private String Label;//地理位置信息private String Title;//消息标题private String Description;//消息描述private String Url;//消息链接private String Event; 事件类型,subscribe(订阅)、unsubscribe(取消订阅/click)private String EventKey; //菜单的KEY值}

OutMsgEntity

package com.camel.ssm.bean;import lombok.Getter;import lombok.Setter;import javax.xml.bind.annotation.XmlAccessType;import javax.xml.bind.annotation.XmlAccessorType;import javax.xml.bind.annotation.XmlElementWrapper;import javax.xml.bind.annotation.XmlRootElement;import java.util.List;/*** 接收普通消息*/@XmlRootElement(name="xml")@XmlAccessorType(XmlAccessType.FIELD)@Setter@Getterpublic class OutMsgEntity {// 如果要是小写的话 在每个字段都填上// @XmlRootElement(name="ToUserName")private String ToUserName;//开发者微信号private String FromUserName;//发送方帐号(一个OpenID)private Long CreateTime;//消息创建时间 (整型)private String Content;//文本消息内容private String MsgType;//消息类型,文本为text@XmlElementWrapper(name="Image")private String[] MediaId;//图片消息媒体id,可以调用获取临时素材接口拉取数据。private String ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。private String Scale;//地图缩放大小private String Label;//地理位置信息private String Title;//消息标题private String Description;//消息描述private String Url;//消息链接private String MusicURL;//否音乐链接private String HQMusicUrl;//否高质量音乐链接,WIFI环境优先使用该链接播放音乐//图文消息private int ArticleCount;//是图文消息个数;当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时,开发者只能回复1条图文消息;其余场景最多可回复8条图文消息private List<ArticleItem> Articles;//是图文消息信息,注意,如果图文数超过限制,则将只发限制内的条数 多条图文消息信息,默认第一个item为大图private String PicUrl;//是图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200//图文列表明细@XmlElementWrapper(name="Articles")private ArticleItem[] item;}

EchostrController

package com.camel.ssm.controller;import com.camel.ssm.bean.ArticleItem;import com.camel.ssm.bean.InMsgEntity;import com.camel.ssm.bean.OutMsgEntity;import com.camel.ssm.util.SecurityUtil;import com.camel.ssm.util.WeChatUtil;import org.aspectj.bridge.MessageUtil;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestBody;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.ResponseBody;import javax.xml.bind.annotation.XmlElementWrapper;import java.util.ArrayList;import java.util.Arrays;import java.util.Date;import java.util.List;/***开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:** 1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信***/@Controllerpublic class EchostrController {@RequestMapping(value = "wechat", method = RequestMethod.GET)@ResponseBodypublic String vailidate(String signature, String timestamp, String nonce, String echostr) {// 1)将token、timestamp、nonce三个参数进行字典序排序String[] arr = {WeChatUtil.TOKKN, timestamp, nonce};Arrays.sort(arr);// 2)将三个参数字符串拼接成一个字符串进行sha1加密StringBuilder scs = new StringBuilder();for (String temp : arr) {scs.append(temp);}//获得自己的加密String mySignature = SecurityUtil.stringMD5(scs.toString());// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if (mySignature.equals(signature)) {System.out.println("接入成功");return echostr;}System.out.println("接入失败");return null;}/*** 普通消息*/@RequestMapping(value = "wechat", method = RequestMethod.POST)@ResponseBodypublic Object handleMessage(@RequestBody InMsgEntity ime) {String outcontent = null;OutMsgEntity outMsg = new OutMsgEntity();//发送方outMsg.setFromUserName(ime.getToUserName());//接收方outMsg.setToUserName(ime.getFromUserName());//消息创建时间outMsg.setCreateTime(new Date().getTime());//判断一下回复的图片还是文本String msgType = ime.getMsgType();if (msgType.equals("text")) {//设置消息类型outMsg.setMsgType("text");// 关键字回复String content = ime.getContent();//回复的信息if (content.contains("开班")) {outcontent = "ddd";} else if (content.contains("地址")) {outcontent = "cccc";} else {//设置消息内容outcontent = ime.getContent();}outMsg.setContent(outcontent);} else if (msgType.equals("image")) {outMsg.setMsgType("image");outMsg.setMediaId(new String[]{ime.getMediaId()});}else if (msgType.equals("event")) {//判断关注的事件if (ime.getEvent().equals("subscribe")) {//回复普通消息//outMsg.setContent("欢迎关注");//outMsg.setMsgType("text");//回复图文消息outMsg.setMsgType("news");////设置图文个数outMsg.setArticleCount(1);////设置图文明细列表ArticleItem articleitem = new ArticleItem();articleitem.setTitle("欢迎关注KingYiFan's Blog");articleitem.setPicUrl("/wp-content/uploads//12/12-130Q0221Q5602.jpg");articleitem.setDescription("点击进入详情");articleitem.setUrl("/");outMsg.setItem(new ArticleItem[]{articleitem});}// else if (ime.getEvent().equals("click")){// String eventkey=ime.getEventKey();////判断按钮的key值//if("V1001_TODAY_MUSIC".equals(eventkey)){//outcontent="vvv";//}else if("V1001_GOOD".equals(eventkey)){//outcontent="www";//}//outMsg.setContent(outcontent);//outMsg.setMsgType("text");// }//}return outMsg;}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。