微信公众号回调我们配置的服务器url
- 配置公众号回调地址
- 新建配置URL的接口
- XML转java Bean工具类
- 演示
配置公众号回调地址
URL配置微信会验证此地址,直接返回微信的echostr参数即可。
这里是用的测试环境,正式环境的话会提示:
是否确定开启服务器配置?
请注意:开启后,用户发送的消息将自动转发到该配置地址,并且在网站中设置的自动回复和自定义菜单将失效。也可使用微信云托管免服务器免鉴权接收用户消息及开发者事件推送。
/**
* 微信服务器触发get请求用于检测签名
*/
@GetMapping("/handleWxCheckSignature")
@ResponseBody
public String handlewxCheckSignature(HttpServletRequest request){
// 获取微信请求参数
String signature = request.getParameter ("signature");
String timestamp = request.getParameter ("timestamp");
String nonce = request.getParameter ("nonce");
String echostr = request.getParameter ("echostr");
log.info("开始校验此次消息是否来自微信服务器,param->signature:{},\ntimestamp:{},\nnonce:{},\nechostr:{}",
signature, timestamp, nonce, echostr);
if (CheckWXTokenUtil.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
return "";
}
新建配置URL的接口
接口的访问地址要和配置的URL一致,注意是post请求
@RequestMapping(value = "/handleWxCheckSignature", method = RequestMethod.POST)
@ResponseBody
public String wechatEvent(@RequestBody String param) {
log.error("--------------------接收微信推送事件-----------------------");
try {
log.info(param);
WxEventPush testDemo = JaxbUtil.converyToJavaBean(param, WxEventPush.class);
log.info(testDemo.toString());
//回复消息
testDemo.setContent("欢迎使用柳城智慧招商平台!");
String xmlString = getXmlString(testDemo);
log.info(xmlString);
return xmlString;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
封装XML返回给微信,微信接收到XML,就会根据XML的值发送响应的消息
public String getXmlString(WxEventPush eventPush) {
String xml = "";
if (eventPush != null) {
xml = "<xml>";
xml += "<ToUserName><![CDATA[";
xml += eventPush.getToUserName();
xml += "]]></ToUserName>";
xml += "<FromUserName><![CDATA[";
xml += eventPush.getFromUserName();
xml += "]]></FromUserName>";
xml += "<CreateTime>";
xml += eventPush.getCreateTime();
xml += "</CreateTime>";
xml += "<MsgType><![CDATA[";
xml += eventPush.getMsgType();
xml += "]]></MsgType>";
xml += "<Content><![CDATA[";
xml += eventPush.getContent();
xml += "]]></Content>";
xml += "</xml>";
}
return xml;
}
注意:微信回调的是XML参数,所以实体类要接收XML类型
package vo;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
* @explain: 接收微信消息推送的实体类
*/
@Data
@XmlRootElement(name="xml")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "xml", propOrder = { "ToUserName", "FromUserName", "MsgType", "Event","CreateTime", "EventKey", "Ticket", "Content","MsgId" })
public class WxEventPush {
/**
* 开发者微信号
*/
private String ToUserName;
/**
* 发送方帐号(一个OpenID)
*/
private String FromUserName ;
/**
* 消息类型 event(关注/取消关注事件)
*/
private String MsgType ;
/**
* 事件类型,subscribe(订阅)、unsubscribe(取消订阅)
*/
private String Event ;
/**
* 消息创建时间 (整型)时间戳
*/
private Long CreateTime ;
/**
* 事件 KEY 值,qrscene_为前缀,后面为二维码的参数值
*/
private String EventKey ;
/**
* 二维码的ticket,可用来换取二维码图片
*/
private String Ticket ;
/**
* 接收到的消息内容
*/
private String Content ;
/**
* 消息id
*/
private String MsgId ;
}
XML转java Bean工具类
package util;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
/**
* @author : wangchao
* @date : 2023/2/15 11:41
* @explain:
*/
public class JaxbUtil {
/**
* xml装换成JavaBean
*
* @param xml
* @param c
* @return
*/
@SuppressWarnings("unchecked")
public static <T> T converyToJavaBean(String xml, Class<T> c) {
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T) unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
}
演示
扫码关注,退订,给公众号发送消息,微信都会调用配置的URL,根据微信不同的参数去做业务区分,返回不同的XML就能让微信公众号做不同的操作。
详情请看微信公众号官方文档:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_event_pushes.html