JAVA微信公众号输入选择回复文本或者图文,列输入1回复一图文或者文本
先写一个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了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统