0
点赞
收藏
分享

微信扫一扫

JAVA微信公众号输入选择回复文本或者图文,列输入1回复一图文或者文本

云卷云舒xj 2022-01-31 阅读 60
javaxmljson


先写一个servlet接口,传入选择1,2.... 

package com.wx.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.bochiot.amain.HttpGyRentUserService;
import com.bochiot.amain.StringConst;
import com.bochiot.znys.config.ENUM_BOZHI_RESULT;
import com.project.util.L;
import com.wx.message.resp.Article;
import com.wx.util.MessageUtil;
import com.wx.util.WeixinMessageUtil;

import net.sf.json.JSONObject;

/**
* 处理微信的操作
*
*
* @author Administrator
*
*/
public class WeixinService {

public static String TAG = "WeixinService";


/**
* 处理微信发来的请求
*
* @param request
* @return
* @throws Exception
*/
public static String processRequest(HttpServletRequest request) throws Exception {
L.i(TAG, "processRequest "); // 默认返回的文本消息内容

// xml请求解析
Map<String, String> requestMap = MessageUtil.parseXml(request);

// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");


try {
L.i(TAG, "FromUserName: " + fromUserName + " toUserName: " + toUserName + " msgType: " + msgType);

// 文本消息
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
String content = requestMap.get("Content").trim();
if(Integer.valueOf(content)==1) {
// return doTextMessage(fromUserName, toUserName, content);
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_BLACKLIST_DEFALUT);
}else if(Integer.valueOf(content)==2) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_NEWS_QUERY_ORDER_TITLE);
}else if(Integer.valueOf(content)==3) {
Article article=WeixinMessageUtil.createArticle("铂智科技有限公司","铂智宣传视频","http://nhbtek.com/bzser/assets/images/logo.png","http://nhbtek.com/bzser/assets/images/videobochiot.mp4");
List<Article> list=WeixinMessageUtil.createArticleList(article);
return WeixinMessageUtil.createNewsMessage(fromUserName, toUserName, list);
}
}
// 图片消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_IMAGE_DEFALUT);
}
// 地理位置消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_LOCATION_DEFALUT);
}
// 链接消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_LINK_DEFALUT);
}
// 音频消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_VOICE_DEFALUT);
}

// 事件推送
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {

// 事件类型
String eventType = requestMap.get("Event");
System.out.println(" eventType = "+ eventType);
for(String s:requestMap.keySet()){
System.out.println( s + ":" + requestMap.get(s));
}

System.out.println(" KeyStandard = "+ requestMap.get("KeyStandard"));
System.out.println(" KeyStr = "+ requestMap.get("KeyStr"));
System.out.println(" ExtInfo = "+ requestMap.get("ExtInfo"));
System.out.println(" EventKey = "+ requestMap.get("EventKey"));


// 订阅 关注
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
//添加 微信信息
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_EVENT_SUBSCRIBE);
}

// 取消订阅
else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}

// 扫描 事件 我们的前台业务申请和微信开门都是通过SCAN事件完成的
else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN2)) {
String eventKey = requestMap.get("EventKey");
System.out.println("扫描 EventKey"+ eventKey);
if(eventKey==null){
// eventKey = "123456790"; //测试 1001
}else{
return doScan(fromUserName, toUserName, eventKey);
}

} else if (eventType.equals(MessageUtil.EVENT_TYPE_Shake)) {
// 摇一摇

}
// 自定义菜单点击事件
else if (eventType.equalsIgnoreCase(MessageUtil.EVENT_TYPE_CLICK)) {
String eventKey = requestMap.get("EventKey");

return doClick(fromUserName, toUserName, eventKey);

}
}

} catch (Exception e) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, StringConst.WEIXIN_TEXT_ERR_DEFALUT);
}
// 回复文本
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, StringConst.WEIXIN_TEXT_DEFAULT);
}//..



//扫描事件
public static String doScan(String fromUserName, String toUserName, String eventKey) throws IOException {
L.i(TAG, "zc scan eventKey="+ eventKey);
//123456790
Integer iEventKey = 0;
try {
iEventKey = Integer.valueOf(eventKey);
} catch (Exception e) {
iEventKey = 10;
}
String response = "";


long startTime = System.currentTimeMillis();
//扫一扫开门
JSONObject jsonObject = HttpGyRentUserService.sendCmd_OPEN_SCAN( eventKey, fromUserName);
ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));

if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS) {

JSONObject data = jsonObject.getJSONObject("data");
int room_number = 0;
try {
room_number = data.getInt("room_number");
} catch (Exception e) {
e.printStackTrace();
}
response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_SUCCESSED, room_number);
} else {
response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_FAILED, eventKey,
jsonObject.get("message") );
}
L.i(TAG, "saomiao opendoor use time : " + (System.currentTimeMillis() - startTime) + " ms");


/*
// 微信开门业务申请的scene_id是由32位的int组成,高16位是房间号,低16位是手机的CRC16值,由临时二维码生成的。

if (iEventKey > 100000) {
int iRoomNumber = 0;
iRoomNumber = iEventKey / 65536;

ENUM_BOZHI_RESULT respCode = bindRoom(iEventKey, fromUserName);
if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS) {
response = String.format(StringConst.WEIXIN_TEXT_BINDROOM_SCAN_SUCCESSED, iRoomNumber);
} else {
response = String.format(StringConst.WEIXIN_TEXT_BINDROOM_SCAN_FAIL, iRoomNumber,
ENUM_BOZHI_RESULT.getStatusString(respCode, "", ""));
}
}//..


// 微信开门动作的scene_id是四位长度的数字,格式如下:XXXX,是永久二维码生成的。
else if (iEventKey <= 100000) {

if (iEventKey == 3) {
// 关注
response = "欢迎回来~";
} else if (iEventKey == 1) {
// 餐券管理员登记
MainConst.couponManagerOpenID = fromUserName;
MainConst.couponManager_KFSendMSG_Num = 0;
response = StringConst.WEIXIN_TEXT_COUPON_MANAGER_SUCCESSED;
} else if (iEventKey == 2) {// 餐券扫一扫
response = useCoupon(fromUserName);

//开门
} else {
long startTime = System.currentTimeMillis();

// JSONObject jsonObject = HttpBC_ZNYS_Service.sendCmd_OPEN_SCAN( iEventKey, fromUserName);
JSONObject jsonObject = HttpBC_ZNYS_Service.sendCmd_OPEN_SCAN( eventKey, fromUserName);

int room_number = 0;
try {
room_number = jsonObject.getInt("room_number");
} catch (Exception e) {
// TODO: handle exception
}

ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));
;

if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS
|| respCode == ENUM_BOZHI_RESULT.MSG_ERR_NETWORK_TIMEOUT) {
response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_SUCCESSED, room_number);
} else {
response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_FAILED, room_number,
ENUM_BOZHI_RESULT.getStatusString(respCode, "", ""));

}
L.i(TAG, "saomiao opendoor use time : " + (System.currentTimeMillis() - startTime) + " ms");
}





} else {
response = StringConst.WEIXIN_TEXT_EVENT_SCAN_DEFALUT;
}

*/

return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, response);
}


public static String doClick(String fromUserName, String toUserName, String eventKey) throws IOException {
L.i(TAG, "doClick "+ eventKey);

// 处理用户菜单开门命令
String response = "";

if (eventKey.equals("35")) { //一键开门
System.out.println("点击了 一键开门 fromUserName=" + fromUserName);

// JSONObject jsonObject = HttpGyRentUserService.sendCmd_OPEN_ONE( fromUserName);
// ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));
//
// if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS ) {
// int roomNo = jsonObject.getInt("data");
// System.out.println("一键开门成功 roomNo" + roomNo);
// response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_TEXT_SUCCESSED, roomNo) ;
//
// } else {
// String errorMsg = jsonObject.getString("message");
// response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_MENU_FAILED, errorMsg);
// }

} else if (eventKey.equals("22")) {
response = "谢谢你的支持,这是测试菜单";
return response;

} else {
response = StringConst.WEIXIN_TEXT_EVENT_CLICK_DEFALUT;

}
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, response);

}






}//end

1.重点代码,传入文本,我这边用枚举的文本,和图文自己定义 


// 文本消息
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
String content = requestMap.get("Content").trim();
if(Integer.valueOf(content)==1) {
// return doTextMessage(fromUserName, toUserName, content);
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_TEXT_BLACKLIST_DEFALUT);
}else if(Integer.valueOf(content)==2) {
return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
StringConst.WEIXIN_NEWS_QUERY_ORDER_TITLE);
}else if(Integer.valueOf(content)==3) {
Article article=WeixinMessageUtil.createArticle("铂智科技有限公司","铂智宣传视频","http://nhbtek.com/bzser/assets/images/logo.png","http://nhbtek.com/bzser/assets/images/videobochiot.mp4");
List<Article> list=WeixinMessageUtil.createArticleList(article);
return WeixinMessageUtil.createNewsMessage(fromUserName, toUserName, list);


调用的创建文本或者图文的

package com.wx.util;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.wx.message.resp.Article;
import com.wx.message.resp.NewsMessage;
import com.wx.message.resp.TextMessage;





public class WeixinMessageUtil {

public static String createNewsMessage(String fromUserName, String toUserName, List<Article> articles) {
NewsMessage newsMessage = new NewsMessage();
newsMessage.setToUserName(fromUserName);
newsMessage.setFromUserName(toUserName);
newsMessage.setCreateTime(new Date().getTime());
newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS );

newsMessage.setArticleCount(articles.size());
newsMessage.setArticles(articles);

return MessageUtil.newsMessageToXml(newsMessage);
}

public static List<Article> createArticleList(Article... articles) {
List<Article> articleList = new ArrayList<Article>();

for (Article article : articles) {
articleList.add(article);
}
return articleList;

}

public static Article createArticle(String title, String des, String picUrl, String url) {
Article article = new Article();
article.setTitle(title);
article.setDescription(des);

article.setPicUrl(picUrl);
article.setUrl(url);

return article;
}

public static Article createArticle1(String title, String des,String picUrl) {
Article article = new Article();
article.setTitle(title);
article.setDescription(des);
article.setPicUrl(picUrl);

return article;
}


public static String createTextMessage(String fromUserName,String toUserName,String respContent){
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setContent(respContent);
return MessageUtil.textMessageToXml(textMessage);
}




}

 实体类

package com.wx.message.resp;
import java.util.List;

/**
* 文本消息
*
* @author liufeng
* @date 2013-05-19
*/
public class NewsMessage extends BaseMessage {
// 图文消息个数,限制为10条以内
private int ArticleCount;
// 多条图文消息信息,默认第一个item为大图
private List<Article> Articles;


public int getArticleCount() {
return ArticleCount;
}

public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
}

public List<Article> getArticles() {
return Articles;
}

public void setArticles(List<Article> articles) {
Articles = articles;
}
}
public class Article {  

// 图文消息名称
private String Title;
// 图文消息描述
private String Description;
// 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致
private String PicUrl;
// 点击图文消息跳转链接
private String Url;

public String getTitle() {
return Title;
}

public void setTitle(String title) {
Title = title;
}

public String getDescription() {
return null == Description ? "" : Description;
}

public void setDescription(String description) {
Description = description;
}

public String getPicUrl() {
return null == PicUrl ? "" : PicUrl;
}

public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}

public String getUrl() {
return null == Url ? "" : Url;
}

public void setUrl(String url) {
Url = url;
}

}

 转成xml

public class MessageUtil {  

/**
* 返回消息类型:文本
*/
public static final String RESP_MESSAGE_TYPE_TEXT = "text";

/**
* 返回消息类型:音乐
*/
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";

/**
* 返回消息类型:图文
*/
public static final String RESP_MESSAGE_TYPE_NEWS = "news";

/**
* 请求消息类型:文本
*/
public static final String REQ_MESSAGE_TYPE_TEXT = "text";

/**
* 请求消息类型:图片
*/
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";

/**
* 请求消息类型:链接
*/
public static final String REQ_MESSAGE_TYPE_LINK = "link";

/**
* 请求消息类型:地理位置
*/
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";

/**
* 请求消息类型:音频
*/
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";

/**
* 请求消息类型:推送
*/
public static final String REQ_MESSAGE_TYPE_EVENT = "event";

/**
* 事件类型:subscribe(订阅)
*/
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";

/**
* 事件类型:unsubscribe(取消订阅)
*/
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";

/**
* 事件类型:CLICK(自定义菜单点击事件)
*/
public static final String EVENT_TYPE_CLICK = "CLICK";

/**
* 事件类型:SCAN(扫一扫事件)
*/
public static final String EVENT_TYPE_SCAN = "SCAN";
public static final String EVENT_TYPE_SCAN2 = "scancode_push";


/**
* 事件类型:Shake(摇一摇事件)
*/
public static final String EVENT_TYPE_Shake = "ShakearoundUserShake";


/**
* 解析微信发来的请求(XML)
*
* @param request
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();

// 从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) {
map.put(e.getName(), e.getText());
}

// 释放资源
inputStream.close();
inputStream = null;

return map;
}

/**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
}

/**
* 音乐消息对象转换成xml
*
* @param musicMessage 音乐消息对象
* @return xml
*/
public static String musicMessageToXml(MusicMessage musicMessage) {
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
}

/**
* 图文消息对象转换成xml
*
* @param newsMessage 图文消息对象
* @return xml
*/
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
}

/**
* 扩展xstream,使其支持CDATA块
*
* @date 2013-05-19
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;

@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}

protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
}


这样就ok了

JAVA微信公众号输入选择回复文本或者图文,列输入1回复一图文或者文本_xml



举报

相关推荐

0 条评论