网站首页 > 技术教程 正文
上一节我已经对文本消息类做了一个处理把它封装成一个类,这样看起来比较容易接受,然后对里面的类的部分信息和基类的自动回复的判断还不够完善,那么我这一节继续对文本和图片类的设计做个介绍,如果对我的文章感兴趣,欢迎订阅我的头条号,一点热,www.yeehot.com
上一节文章快速入口
java使用springMVC开发微信公众号文本消息类的设计
我们知道,图片回复的内容主要在mediaid上一级中多了一个类型,是指明为Image类型。
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>
那么我们可以这样写一个图片类
/**
* Created by yeehot.com on 16/7/31.
*/
public class ImageMessage extends BaseMessage{
private String PicUrl;
private String MediaId;
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public ImageMessage() {
super();
}
public ImageMessage(String toUserName, String fromUserName, String createTime, String msgType, String msgId, String picUrl, String mediaId) {
super(toUserName, fromUserName, createTime, msgType, msgId);
PicUrl = picUrl;
MediaId = mediaId;
}
public ImageMessage(Map<String, String> info) {
super(info);
this.MediaId=info.get("MediaId");
this.PicUrl=info.get("PicUrl");
}
@Override
public Map<String, String> MessageToMap() {
Map<String,String> map=new HashMap<String, String>();
map.put("MediaId",this.MediaId);
map.put("PicUrl",this.PicUrl);
Map<String,String> map2=super.MessageToMap();
if (map!=null){
map.putAll(map2);
}
return map;
}
}
BaseMessage基类,我在上一级也做过介绍,不过为了方便大家还是继续写一下
/**
* Created by yeehot.com on 16/7/30.
*/
public class BaseMessage {
protected String ToUserName;
protected String FromUserName;
protected String CreateTime;
protected String MsgType;
protected String MsgId;
public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getCreateTime() {
return CreateTime;
}
public void setCreateTime(String createTime) {
CreateTime = createTime;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getMsgId() {
return MsgId;
}
public void setMsgId(String msgId) {
MsgId = msgId;
}
public BaseMessage() {
}
public BaseMessage(String toUserName, String fromUserName, String createTime, String msgType, String msgId) {
ToUserName = toUserName;
FromUserName = fromUserName;
CreateTime = createTime;
MsgType = msgType;
MsgId = msgId;
}
public BaseMessage(Map<String ,String> info) {
this.CreateTime=info.get("CreateTime");
this.MsgId=info.get("MsgId");
this.MsgType=info.get("MsgType");
this.FromUserName=info.get("FromUserName");
this.ToUserName=info.get("ToUserName");
}
public Map<String,String> MessageToMap(){
Map<String,String> map=new HashMap<String, String>();
map.put("FromUserName",this.getFromUserName());
map.put("ToUserName",this.getToUserName());
map.put("CreateTime",this.getCreateTime());
map.put("MsgType",this.getMsgType());
map.put("MsgId",this.getMsgId());
return map;
}
}
接着,我们需要继续对我们的验证token的入口修改一下,这里主要是实现,我们回复文本内容,就直接打印我的头条号,一点热,如果文本内容有图片,那么就返回,我之前已经上传的一个临时素材图片。如果用户上传图片,那么我就直接返回用户的图片。这个controller的方法修改成如下:
@ResponseBody
@RequestMapping(value = "/wx/developer", produces = "text/plain;charset=utf-8")
public String index(HttpServletRequest request) {
//
String method=request.getMethod();
System.out.print(method+"?");
if (method.equals("GET")) {
//此处省略验证的步骤
}
else {
Map<String,String> postmessage=new HashMap<String, String>();
Map<String,String> responsemessage=new HashMap<String, String>();
StringBuffer jb = new StringBuffer();
String line = null;
BufferedReader reader = null;
try {
reader = request.getReader();
while ((line = reader.readLine()) != null)
{
jb.append(line);
}
postmessage=XmlParseTool.doXMLParse(jb.toString());
String messagetype=postmessage.get("MsgType");
if (messagetype.equals("text"))
{
YhTextMessage RecivetextMessage=new YhTextMessage(postmessage);
if (
RecivetextMessage.getContent().equals("图片")){
ImageMessage imageMessage=new ImageMessage();
imageMessage.setFromUserName(RecivetextMessage.getToUserName());
imageMessage.setCreateTime(String.valueOf(System.currentTimeMillis()));
imageMessage.setToUserName(RecivetextMessage.getFromUserName());
imageMessage.setMsgType(RecivetextMessage.getMsgType());
// imageMessage.setMsgId(System.currentTimeMillis()+"00");
imageMessage.setMediaId("nEQXRooIfTR-yNXQK0mUnoyZs7gQ2_agbhY2UHr1jLATlCqLpPtVJqJWFftV8d92");
responsemessage=imageMessage.MessageToMap();
}
else {
YhTextMessage sendMessage=new YhTextMessage();
sendMessage.setContent("你好,我的头条号:一点热");
sendMessage.setToUserName(RecivetextMessage.getFromUserName());
sendMessage.setMsgType(RecivetextMessage.getMsgType());
// sendMessage.setMsgId(System.currentTimeMillis()+"10");
sendMessage.setFromUserName(RecivetextMessage.getToUserName());
sendMessage.setCreateTime(String.valueOf(System.currentTimeMillis()));
responsemessage=sendMessage.MessageToMap();
}
}
else if (messagetype.equals("image")){
ImageMessage RecivetextMessage=new ImageMessage(postmessage);
ImageMessage imageMessage=new ImageMessage();
imageMessage.setFromUserName(RecivetextMessage.getToUserName());
imageMessage.setCreateTime(String.valueOf(System.currentTimeMillis()));
imageMessage.setToUserName(RecivetextMessage.getFromUserName());
imageMessage.setMsgType(RecivetextMessage.getMsgType());
// imageMessage.setMsgId(System.currentTimeMillis()+"10");
imageMessage.setMediaId(RecivetextMessage.getMediaId());
// imageMessage.setPicUrl("");//这个是发送消息要带上的参数的。由于我们这里是回复信息的,所以不用
responsemessage=imageMessage.MessageToMap();
}
else if (messagetype.equals("voice")){
}
return XmlParseTool.RequestXml2StringByType(responsemessage);
}
catch (JDOMException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
return "success";
}
}
我对这个XML转换工具的格式进行了修改,对消息内容为空的,我们就不加进返回的数据,主要是收和发的内容不一样,所以我们根据为空的键值,我们就不加进去,还有就是CreateTime,我们也处理为不加CDATA.
public static String RequestXml2StringByType(Map<String, String> params ) {
StringBuffer sb = new StringBuffer();
sb.append("<xml>");
Set es = params.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
//判断是不是CreateTime,将它过滤CDATA
if ("CreateTime".equalsIgnoreCase(k)) {
sb.append("<"+k+">"+v+"</"+k+">");
}
else {
if (v!=null) {
//如果是文本内容
if (params.get("MsgType").equals("text")) {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
}
else if (params.get("MsgType").equals("image")) { //如果是图片内容
System.out.print("图片内容");
if ("MediaId".equalsIgnoreCase(k)) {
sb.append("<Image>" + "<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">" + "</Image>");
} else {
sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">");
}
}
}
}
}
sb.append("</xml>");
return sb.toString();
}
我们在开发的时候也可以本地测试一下:
我们看到输出的数据格式没有什么错误,应该就没有什么问题的,要注意的就是接受者和公众号的设置。那么我们部署到服务器的结果可以这样
今天就讲到这里,欢迎继续关注我的头条号:一点热,如果有什么问题,欢迎留言咨询,我看到之后会第一时间回复大家的。也欢迎收藏与转发,如果需要转载到其他网站,请与我联系。 下一节使用api做一个微信回复机器人。
猜你喜欢
- 2025-07-21 “很快”“《欢乐颂》微信公众号热点洞察”报告发布
- 2025-07-21 微信公众号现全国性瘫痪 开发哥为鹅厂庆生耽误事?
- 2025-07-21 心理测评测试h5公众号字节微信小程序app开源版开发
- 2025-07-21 微信订阅号和服务号有什么区别?什么是微信公众号
- 2025-07-21 公众号+微商城+小程序+视频号+直播+朋友圈+企业微信...
- 2025-07-21 微信公众号如何选择推送内容,淄博微信开发
- 2025-07-21 微信公众号开发出现 cURL error 60: SSL certificate problem ssl证书
- 2025-07-21 Zoho CRM如何无需API开发连接OA系统、公众号、钉钉、企业微信?
- 2025-07-21 “西安交警”微信公众号将开发新功能
- 2025-07-21 nodejs微信公众号开发上传图文消息素材报错-40007
你 发表评论:
欢迎- 07-23NAS实现自己的网盘搜索网站,网盘搜索程序——爱盼
- 07-23不再下载垃圾,快速找到下载链接秘诀
- 07-23软件下载精准查找下载链接终极大招
- 07-23吾爱大佬魔改,这个软件太有料(吾爱修改)
- 07-23全能下载神器文件蜈蚣体验(全能工具箱软件下载)
- 07-23跨域问题解决方案:开发代理(本地开发跨域问题)
- 07-23在群晖NAS上搭建网站的完整指南(群晖nas部署)
- 07-23Nginx负载均衡:nginx.conf配置文件说明!
- 最近发表
- 标签列表
-
- sd分区 (65)
- raid5数据恢复 (81)
- 地址转换 (73)
- 手机存储卡根目录 (55)
- tcp端口 (74)
- project server (59)
- 双击ctrl (55)
- 鼠标 单击变双击 (67)
- debugview (59)
- 字符动画 (65)
- flushdns (57)
- ps复制快捷键 (57)
- 清除系统垃圾代码 (58)
- web服务器的架设 (67)
- 16进制转换 (69)
- xclient (55)
- ps源文件 (67)
- filezilla server (59)
- 句柄无效 (56)
- word页眉页脚设置 (59)
- ansys实例 (56)
- 6 1 3固件 (59)
- sqlserver2000挂起 (59)
- vm虚拟主机 (55)
- config (61)
本文暂时没有评论,来添加一个吧(●'◡'●)