龙空技术网

Java使用springMVC开发微信公众号自动回复图片消息

一点热 245

前言:

眼前我们对“java素材”大概比较关心,小伙伴们都想要知道一些“java素材”的相关文章。那么小编同时在网摘上搜集了一些关于“java素材””的相关内容,希望兄弟们能喜欢,大家快快来了解一下吧!

上一节我已经对文本消息类做了一个处理把它封装成一个类,这样看起来比较容易接受,然后对里面的类的部分信息和基类的自动回复的判断还不够完善,那么我这一节继续对文本和图片类的设计做个介绍,如果对我的文章感兴趣,欢迎订阅我的头条号,一点热,

上一节文章快速入口

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做一个微信回复机器人。

标签: #java素材