接收用户消息和回复消息
接收用户消息
- 文档地址:接收普通消息
- 消息类型
- 文本
微信公众号开发——接收用户消息和回复消息 - 图片
微信公众号开发——接收用户消息和回复消息 - 语音
- 视频
- 视频
- 地理位置
- 文本
回复消息
- 文档地址:被动回复用户信息
- 文本回复
微信公众号开发——接收用户消息和回复消息 - 图片
微信公众号开发——接收用户消息和回复消息
**这里只展开文本和图片,其他几种类型用法相似**
代码
- url地址说明:
与 接口配置信息中一致,只是请求方式是POST
- controller
@PostMapping("/wxchat/access")
public void doPost(HttpServletRequest request, HttpServletResponse response) {
try {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println(wxMessService.getMess(request));
} catch (Exception e) {
System.out.println(e.toString());
}
}
- WxMessService
//接收普通消息
public String getMess(HttpServletRequest request){
try
{
request.setCharacterEncoding("UTF-8");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(request.getInputStream());
Element root = document.getDocumentElement();
return xmlParse(root);
}
catch(Exception e)
{
System.out.println(e.toString());
}
// 异常微信建议返回值
return "success";
}
private String xmlParse( Element root){
String xml="";
if(root!=null){
String msgType = root.getElementsByTagName("MsgType").item(0).getTextContent();
String wechatId = root.getElementsByTagName("ToUserName").item(0).getTextContent();
String openid = root.getElementsByTagName("FromUserName").item(0).getTextContent();
String msgId = root.getElementsByTagName("MsgId").item(0).getTextContent();
switch (MsgTypeEnum.getByType(msgType)){
case TEXT:
String msg = root.getElementsByTagName("Content").item(0).getTextContent();
System.out.println(msg);
xml=receiveContentText(wechatId,openid,msg,msgId);
break;
case IMAGE:
String picUrl = root.getElementsByTagName("PicUrl").item(0).getTextContent();
System.out.println("PicUrl:"+picUrl);
String mediaId = root.getElementsByTagName("MediaId").item(0).getTextContent();
System.out.println("mediaId:"+mediaId);
xml=sendImageMess(openid,wechatId,mediaId);
break;
default:
break;
}
}
return xml;
}
/**
* 发送图片消息
* @param toUserName
* @param fromUserName
* @param mediaId 微信素材id
* @author zzg
* @date 2021/2/24
* @return java.lang.String
* @throws
*/
private String sendImageMess(String toUserName,String fromUserName,String mediaId){
return String.format(MsgTypeReturnEnum.IMAGE.getTypeXml(), toUserName,fromUserName,System.currentTimeMillis(),mediaId);
}
private String receiveContentText(String toUserName,String fromUserName,String content,String msgId){
String mes="";
if(content.matches("喜欢"))
{
mes="我也喜欢你";
}
else
{
mes=content;
}
return sendTextMess(fromUserName,toUserName,mes,msgId);
}
private String sendTextMess(String toUserName,String fromUserName,String content,String msgId){
return String.format(MsgTypeReturnEnum.TEXT.getTypeXml(), toUserName,fromUserName,System.currentTimeMillis(),content,msgId);
}
- 两enum
- 回复
/**
* 消息类型返回
*
* @program: wxchat
* @author: zzg
* @create: 2021-02-08 15:37
*/
public enum MsgTypeReturnEnum {
TEXT("text","文本","<xml>\n" +
" <ToUserName><![CDATA[%1$s]]></ToUserName>\n" +
" <FromUserName><![CDATA[%2$s]]></FromUserName>\n" +
" <CreateTime>%3$d</CreateTime>\n" +
" <MsgType><![CDATA[text]]></MsgType>\n" +
" <Content><![CDATA[%4$s]]></Content>\n" +
"</xml>"),
IMAGE("image","图片"," <xml>\n" +
" <ToUserName><![CDATA[%1$s]]></ToUserName>\n" +
" <FromUserName><![CDATA[%2$s]]></FromUserName>\n" +
" <CreateTime>%3$d</CreateTime>\n" +
" <MsgType><![CDATA[image]]></MsgType>\n" +
" <Image>\n" +
" <MediaId><![CDATA[%4$s]]></MediaId>\n" +
" </Image>\n" +
"</xml>");
/**
* 类型
*/
private String type;
/**
* 类型名
*/
private String typeName;
/**
* xml文本
*/
private String typeXml;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getTypeXml() {
return typeXml;
}
public void setTypeXml(String typeXml) {
this.typeXml = typeXml;
}
MsgTypeReturnEnum(String type, String typeName, String typeXml) {
this.type = type;
this.typeName = typeName;
this.typeXml = typeXml;
}
public static MsgTypeReturnEnum getByType(String type){
MsgTypeReturnEnum[] values = MsgTypeReturnEnum.values();
for (MsgTypeReturnEnum value : values) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
}
}
- 接收
/**
* 消息类型
*
* @program: wxchat
* @author: zzg
* @create: 2021-02-08 15:37
*/
public enum MsgTypeEnum {
/**
* 文本
*/
TEXT("text","文本","<xml> <ToUserName><![CDATA[%1$s]]></ToUserName> <FromUserName><![CDATA[%2$s]]></FromUserName> <CreateTime>%3$s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%4$s]]></Content> <MsgId>%5$s</MsgId> </xml>"),
/**
* 图片
*/
IMAGE("image","图片"," <xml><ToUserName><![CDATA[%1$s]]></ToUserName> <FromUserName><![CDATA[%2$s]]></FromUserName> <CreateTime>%3$s</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[%4$s]]></PicUrl><MediaId><![CDATA[%5$s]]></MediaId><MsgId>%6$s</MsgId></xml>");
/**
* 类型
*/
private String type;
/**
* 类型名
*/
private String typeName;
/**
* xml文本
*/
private String typeXml;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public String getTypeXml() {
return typeXml;
}
public void setTypeXml(String typeXml) {
this.typeXml = typeXml;
}
MsgTypeEnum(String type, String typeName, String typeXml) {
this.type = type;
this.typeName = typeName;
this.typeXml = typeXml;
}
public static MsgTypeEnum getByType(String type){
MsgTypeEnum[] values = MsgTypeEnum.values();
for (MsgTypeEnum value : values) {
if (value.getType().equals(type)) {
return value;
}
}
return null;
}
}
关于回复图片中的MediaId,这个值,可以在素材管理中获取图片素材来获取。有个讨巧的方法,就是直接在发送图片给测试公众号来获取mediaId(临时的,有效期是3天)
-
消息加密
加解密说明
demo建议下载示例代码
- maven 引入
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
- 引入demo中的类
微信公众号开发——接收用户消息和回复消息 - controller
@PostMapping("/wxchat/access/encoding1")
public String wxAccessEncoding(HttpServletRequest request, HttpServletResponse response) {
String encryMess = wxMessService.getEncryMess(request);
System.out.println(encryMess);
return encryMess;
}
- service
/**
* 读取加密的信息
* @Param [request]
* @author zzg
* @date 2021/2/7
* @return java.lang.String
* @throws
*/
public String getEncryMess(HttpServletRequest request){
try {
String encodingAesKey = wxConfig.getEncodingAesKey();
String token = wxConfig.getToken();
String appId = wxConfig.getAppId();
request.setCharacterEncoding("UTF-8");
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(request.getInputStream());
Element root = document.getDocumentElement();
String encrypt = root.getElementsByTagName("Encrypt").item(0).getTextContent();
Map<String, String[]> parameterMap = request.getParameterMap();
String nonce = parameterMap.get("nonce")[0];
String msgSignature = parameterMap.get("msg_signature")[0];
String timeStamp = parameterMap.get("timestamp")[0];
WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
String fromXML = String.format(format, encrypt);
String result2 = pc.decryptMsg(msgSignature, timeStamp, nonce, fromXML);
System.out.println("解密后明文: " + result2);
String s = xmlParse(result2);
String mingwen = pc.encryptMsg(s, String.valueOf(System.currentTimeMillis()), nonce);
System.out.println("加密后: " + mingwen);
return mingwen;
}catch (Exception e){
}
return "";
}
private String xmlParse( String xmlString){
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
StringReader sr = new StringReader(xmlString);
InputSource is = new InputSource(sr);
Document document = db.parse(is);
Element root = document.getDocumentElement();
return xmlParse(root);
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
-
校验
微信公众平台接口调试工具
上一篇,微信公众号开发——接口配置信息的开发