接收微信公众号的事件推送并且回复消息

配置公众号回调地址

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
在这里插入图片描述

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值