本文为博主原创 转载请注明出处 尊重笔者劳动成果 十分感谢
场景:用户关注公众号后给用户回复一个消息
效果如下:
实现公众号和用户产生特定动作的交互有两种方式可以实现:
1. 被动回复用户消息
2. 客服消息
这两种有何不同呢? 被动消息回复本质是对微信服务器发过来消息的一次回复。因此需要开发者在5秒内做出响应 否则将会提示“该公众号暂时无法提供服务” 而客服消息其实是一个接口 当不能保证5秒内对为微信服务器响应的时候可以先回复“success”然后调用发送客服消息异步发送消息
注意:客服消息是有次数限制的!!! 具体查看接口权限处的次数 且开发者收到微信服务的推送在48小时内可以调用客服接口
发送客服消息需要先检查公众号是否有客服消息权限 查看客服消息权限可以在微信公众号控制台 最后一个接口权限查看,如下图:
下面附上被动消息回复以及客服消息的代码 此处被动消息未做排重处理
被动消息回复
1.构造一个消息 例如文本消息
2.响应消息 即发送消息给微信服务器
定义一个消息类型枚举类
package com.net.wx;
/**
* 被动回复消息类型
* Created by zhangq on 2019/1/23.
*/
public enum MessageType {
TEXT,IMAGE,VOICE,VIDEO,MUSIC,NEWS
}
编写构造消息的工具类 注意此处的字段 FromUserName 和 ToUserName 这两个数据来自微信服务器给开发者服务器推送的XML中的字段,因此响应微信服务器消息的时候,发送方和接受方反过来即可
package com.net.wx;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 构造被动回复工具类
* Created by zhangq on 2019/1/23.
*/
public class MessageUtil {
/**
* 根据消息类型 构造返回消息数据
* @param jsonObject 承装消息数据
* @param msgType 消息类型 取自消息类型枚举类
* @return 构造后消息数据结构
*/
public static String buildXml(JSONObject jsonObject, MessageType msgType) {
String result = "";
switch (msgType) {
case TEXT:
result =buildTextMessage(jsonObject);
break;
case IMAGE:
result =buildImageMessage(jsonObject);
break;
case NEWS:
result =buildNewsMessage(jsonObject);
break;
default:
break;
}
return result;
}
/**
* 构造文本消息
* @param json 文本消息参数
* @return String
*/
private static String buildTextMessage(JSONObject json) {
String fromUserName = json.get("FromUserName").toString();
String toUserName = json.get("ToUserName").toString();
String content = json.get("content").toString();
return String.format("<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%s</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>",
fromUserName, toUserName, g