前言:
眼前我们对“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素材