微信公众号自动回复

首先,应该建立一个消息与图片的实体,看一下微信公众号的文档:

原网址

回复文本消息
<xml>

<ToUserName><![CDATA[toUser]]></ToUserName>

<FromUserName><![CDATA[fromUser]]></FromUserName>

<CreateTime>12345678</CreateTime>

<MsgType><![CDATA[text]]></MsgType>

<Content><![CDATA[你好]]></Content>

</xml>

参数 是否必须 描述
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 text
Content 是 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
回复图片消息
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<Image>
<MediaId><![CDATA[media_id]]></MediaId>
</Image>
</xml>

参数 是否必须 说明
ToUserName 是 接收方帐号(收到的OpenID)
FromUserName 是 开发者微信号
CreateTime 是 消息创建时间 (整型)
MsgType 是 image
MediaId 是
通过素材管理中的接口上传多媒体文件,得到的id。

之后组装实体,用户发来消息或者事件时候给微信服务器发送请求,服务器把消息返回给在公众号配置的服务器域名处,然后再进行逻辑判断,给微信服务器返回消息,发给用户。

下面给出一般的消息类型:

public static final String MESSAGE_SCAN="SCAN";//未关注公众号扫描二维码
public static final String MESSAGE_TEXT="text";//文本
public static final String MESSAGE_IMAGE="image";//图片
public static final String MESSAGE_VOICE="voice";//语音
public static final String MESSAGE_VIDEO="video";//视频
public static final String MESSAGE_LINK="link";//连接
public static final String MESSAGE_LOCATION="location";//地理位置事件
public static final String MESSAGE_EVENT="event";//事件
public static final String MESSAGE_SUBSCRIBE="subscribe";//关注
public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注
public static final String MESSAGE_CLICK="CLICK";//点击
public static final String MESSAGE_VIEW="VIEW";//t跳转链接url

需要注意的是,发送图片需要先把图片上传到微信服务器获取MediaId,才能发给用户。

/**
* xml转为map集合
* @MethodName:xmlToMap
*@author:maliran
*@ReturnType:Map<String,String>
*@param req
*@return
*@throws IOException
*@throws DocumentException
*/
public static Map<String,String> xmlToMap(HttpServletRequest req) throws IOException, DocumentException{

Map<String,String> map = new HashMap<String,String>();
SAXReader reader = new SAXReader();//log4j.jar
InputStream ins = req.getInputStream();
Document doc = reader.read(ins);
Element root = doc.getRootElement();
List<Element> list = root.elements();
for(Element e:list){
map.put(e.getName(), e.getText());
}
ins.close();
return map;
}
/**
* 文本转换为xml
* @MethodName:textMessageToXml
*@author:maliran
*@ReturnType:String
*@param textMessage
*@return
*/
public static String textMessageToXml(TextMessage textMessage){

XStream xstream = new XStream();//xstream.jar,xmlpull.jar
xstream.alias("xml", textMessage.getClass());//置换根节点
System.out.println(xstream.toXML(textMessage));
return xstream.toXML(textMessage);

}
/**
* 图片转成xml
* @MethodName:textMessageToXml
*@author:maliran
*@ReturnType:String
*@param textMessage
*@return
*/
public static String imageMessageToXml(ImageMessage imageMessage){

XStream xstream = new XStream();//xstream.jar,xmlpull.jar
xstream.alias("xml", imageMessage.getClass());//置换根节点
//System.out.println(xstream.toXML(imageMessage));
return xstream.toXML(imageMessage);

}

/**
* 组装图片xml
* @MethodName:initImageMessage
*@author:maliran
*@ReturnType:String
*@param MediaId
*@param toUserName
*@param fromUserName
*@return
*/
public static String initImageMessage(String MediaId,String toUserName,String fromUserName){
String message = null;
Image image = new Image();
ImageMessage imageMessage = new ImageMessage();
image.setMediaId(MediaId);
imageMessage.setFromUserName(toUserName);
imageMessage.setToUserName(fromUserName);
imageMessage.setCreateTime(new Date().toString());
imageMessage.setImage(image);
imageMessage.setMsgType(MESSAGE_IMAGE);
message = imageMessageToXml(imageMessage);
return message;
}
public static String initTextMessage(String content,String toUserName,String fromUserName){
String message = null;
TextMessage textMessage = new TextMessage();
textMessage.setFromUserName(toUserName);
textMessage.setToUserName(fromUserName);
textMessage.setCreateTime(new Date().toString());
textMessage.setContent(content);
textMessage.setMsgType(MESSAGE_TEXT);
message = textMessageToXml(textMessage);
return message;
}
/**
* 上传本地文件到微信获取mediaId
*/

public static String upload(String filePath, String accessToken,String type) throws IOException, NoSuchAlgorithmException, NoSuchProviderException, KeyManagementException {
File file = new File(filePath);
if (!file.exists() || !file.isFile()) {
throw new IOException("文件不存在");
}

String url = ConfigUtil.UPLOAD_URL.replace("ACCESS_TOKEN", accessToken).replace("TYPE",type);

URL urlObj = new URL(url);
//连接
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();

con.setRequestMethod("POST");
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);

//设置请求头信息
con.setRequestProperty("Connection", "Keep-Alive");
con.setRequestProperty("Charset", "UTF-8");

//设置边界
String BOUNDARY = "----------" + System.currentTimeMillis();
con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);

StringBuilder sb = new StringBuilder();
sb.append("--");
sb.append(BOUNDARY);
sb.append("\r\n");
sb.append("Content-Disposition: form-data;name=\"file\";filename=\"" + file.getName() + "\"\r\n");
sb.append("Content-Type:application/octet-stream\r\n\r\n");

byte[] head = sb.toString().getBytes("utf-8");

//获得输出流
OutputStream out = new DataOutputStream(con.getOutputStream());
//输出表头
out.write(head);

//文件正文部分
//把文件已流文件的方式 推入到url中
DataInputStream in = new DataInputStream(new FileInputStream(file));
int bytes = 0;
byte[] bufferOut = new byte[1024];
while ((bytes = in.read(bufferOut)) != -1) {
out.write(bufferOut, 0, bytes);
}
in.close();

//结尾部分
byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");//定义最后数据分隔线

out.write(foot);

out.flush();
out.close();

StringBuffer buffer = new StringBuffer();
BufferedReader reader = null;
String result = null;
try {
//定义BufferedReader输入流来读取URL的响应
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line = null;
while ((line = reader.readLine()) != null) {
buffer.append(line);
}
if (result == null) {
result = buffer.toString();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
reader.close();
}
}

JSONObject jsonObj = JSONObject.fromObject(result);
System.out.println(jsonObj);
String typeName = "media_id";
if(!"image".equals(type)){
typeName = type + "_media_id";
}
String mediaId = jsonObj.getString(typeName);
return mediaId;
}

public void doPost(HttpServletRequest req,HttpServletResponse resp) throws IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
String serverPath="";
serverPath = req.getServletContext().getRealPath("/").replace("\\", "/");
//Servlet初始化时执行,如果上传文件目录不存在则自动创建
if(!new File(serverPath+"qrimage").isDirectory()){
new File(serverPath+"qrimage").mkdirs();
}
PrintWriter out = resp.getWriter();

//String openId = GetCookie.getCookie(req,resp);
Map<String, String> map;
try {
map = MessageUtil.xmlToMap(req);
String fromUserName = map.get("FromUserName");
System.out.println(fromUserName);
String toUserName = map.get("ToUserName");

String msgType = map.get("MsgType");
//String content = map.get("Content");

String message = "";
if(MessageUtil.MESSAGE_EVENT.equals(msgType)){
System.out.println("事件");
String eventType = map.get("Event");
System.out.println(eventType);
String eventKey = map.get("EventKey");
System.out.println(map.get("EventKey"));
if(MessageUtil.MESSAGE_CLICK.equals(eventType)){
String key = map.get("EventKey");
if(key.equals("1")){
String filePath = serverPath+"qrimage"+"\\"+fromUserName+".jpg";
//String url = "WebContent/qrimage/"+fromUserName+".jpg";
String ticket = wxQRCodeService.createForeverStrTicket(fromUserName);

//System.out.println(url);
//获取access_token
String content = "123456";
String mediaId = MyImageUtil.upload(filePath, accessToken,MessageUtil.MESSAGE_IMAGE);
String imageMessage = MessageUtil.initImageMessage(mediaId, toUserName, fromUserName);

System.out.println(imageMessage);

out.print(imageMessage);
out.close();

}}

}else{
return;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

原文地址:https://www.cnblogs.com/zpbk/p/12699653.html

时间: 2024-10-07 08:04:28

微信公众号自动回复的相关文章

微信公众号自动回复_Java

先声明一下,这是一个maven工程pom文件需要的依赖: 1 <dependency> 2 <groupId>dom4j</groupId> 3 <artifactId>dom4j</artifactId> 4 <version>1.6</version> 5 </dependency> 6 <dependency> 7 <groupId>commons-io</groupId&g

微信公众号自动回复多图文(php)

作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-97-news.html 在这篇微信公众平台开发教程中,我们将介绍如何灵活的使用图文消息功能.我们将只介绍被动回复消息中的图文消息,发送客服消息及高级群发消息接口的发送的图文消息与本文介绍的图文消息的各情况基本一致. 本文分为以下四个部分: 图文消息的定义 图文消息的实现 图文消息的类型 图文消息的回复 一.图文消息的定义 在微信公众平台消息中,发送被动响应消息中的图文消息的XML结构如下所示.

微信公众号自动回复加超链接最新可用实现方案

你在管理微信号时是否会有自动回复或者在关键字触发自动回复加一个超链接的需求呢?例如下图像王者荣耀这样: 很多有开发经验的朋友都知道微信管理平台会类似富文本编辑器,第一想到的解决方案会是在编辑框中加<a href='网址' >显示文字</a>. 没错,实现的方式的确如此,可是此方法在几个月前就被微信官方给屏蔽了,加了超链接代码,出来还是普通文字,这个时候运营者便开始急眼了,难道真的无法实现该需求了么? 如果真的没有解决方案,我也不会在此分享这个方案了.稍安勿躁,接着往下看! 亲试可用

微信公众号自动回复示例代码

<?php define("TOKEN", "weixin"); $wechatObj = new wechatCallbackapiTest(); $wechatObj->responseMsg(); class wechatCallbackapiTest { public function responseMsg() { //get post data, May be due to the different environments $postSt

微信公众号开发之网页授权(获取用户信息)

这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究. 昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇.实现本篇涉及的 功能,还需要完成一些基础.在写完这篇博客后,我会尽快补上. -------------------------废话不多说直入正题 需要的工具: 微信公众号(可以申请,但做开发的,可以申请测试号,申请详细不多说了) 服务器(可以自行购买,我使用的是新浪的sae.) 编辑器(随意,不做推荐) 微信公众号开发文档(地址) ----

C#微信公众号开发 -- (三)用户关注之后自动回复

通过了上一篇文章之后的微信开发者验证之后,我们就可以做微信公众号的代码开发了. 当我们点击关注某个公众号的时候,有时候会发现他会自动给我们回复一条消息,比如欢迎关注XXX公众号.这个功能其实是在点击关注的时候,用户触发了微信定义的事件,同时微信会返回给我们一个XML数据包,微信官方的解释如下: 推送XML数据包示例: <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName>&

Python快速搭建自动回复微信公众号

Python快速搭建自动回复微信公众号 在之前的一篇文章 Python利用 AIML 和 Tornado 搭建聊天机器人微信订阅号 中用 aiml 实现了一个简单的英文聊天机器人订阅号.但是只能处理英文消息,现在用 图灵机器人 来实现一个中文的聊天机器人订阅号. 这里主要介绍如何利用 Python 的 Tornado Web框架以及wechat-python-sdk 微信公众平台 Python 开发包来快速搭建微信公众号. 完整的公众号代码 GitHub 地址:green ,由于目前此公众号有一

[.NET] 简单接入微信公众号开发:实现自动回复

简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定的: 开发者密码:自己扫一下就可以看到: IP白名单:设置自己配置服务器的地址: 服务器地址(URL):稍后详解: 令牌:随便写,按规则: 消息加解密密钥:随便写,或者随机生成: 三.配置服务器地址(URL) 服务器地址(URL)应该怎么配置呢?图片上的配置的地址是:http://www.nidie

Java微信公众号开发----关键字自动回复消息

在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有(如图): 附上解析xml类的依赖: 1 <!-- dom对象读取写入xml文件 --> 2 <dependency> 3 <groupId>dom4j</groupId> 4 <artifactId>dom4j</artifactId>