微信扫码登陆 — 1 相关概念


消息加密方式配置:可 明文密文

服务器地址:为自定义回调接口,必须可以 公网访问,端口必须为 80443 !!!

官方参数示例

参数分为:param 形式 和 body形式(xml),上面参数和 现实调用也有差距!!

回调接口 controller

@PostMapping(value = "/receive", consumes = MediaType.TEXT_XML_VALUE, produces = MediaType.TEXT_XML_VALUE)
@Operation(summary = "9 消息接受接口")
@ApiOperationSupport(order = 9)
public Object receive(WechatReceiveParam param, @RequestBody WechatReceiveBody body) {
    log.info("消息接受接口,参数:{},body:{}", JSONUtil.toJsonStr(param), JSONUtil.toJsonStr(body));
    return wechatMpService.receive(param, body);
}

param参数

@Data
public class WechatReceiveParam {

    /**
     * 微信加密签名
     */
    private String signature;

    /**
     * 时间戳
     */
    private String timestamp;

    /**
     * 随机数
     */
    private String nonce;

    /**
     * 微信用户id
     */
    private String openid;

    /**
     * 加密类型
     */
    private String encrypt_type;

    /**
     * 消息签名
     */
    private String msg_signature;

}

body参数

需引入解析xml

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-xml</artifactId>
    <version>2.19.2</version>
</dependency>
@Data
@EqualsAndHashCode(callSuper = true)
@JacksonXmlRootElement(localName = "xml")
public class WechatReceiveBody extends WechatMsgInfo {

    /**
     * 密文:安全模式下,会把父类字段放在加密消息中
     */
    @JacksonXmlProperty(localName = "Encrypt")
    private String encrypt;

}
@Data
@JacksonXmlRootElement(localName = "xml")
public class WechatMsgInfo {

    /**
     * 接收者
     */
    @JacksonXmlProperty(localName = "ToUserName")
    private String toUserName;

    /**
     * 发送者
     */
    @JacksonXmlProperty(localName = "FromUserName")
    private String fromUserName;

    /**
     * 时间戳
     */
    @JacksonXmlProperty(localName = "CreateTime")
    private String createTime;

    /**
     * 消息类型:普通消息 和 事件(关注,取消关注,扫码 等)
     */
    @JacksonXmlProperty(localName = "MsgType")
    private String msgType;

    /**
     * 消息内容
     */
    @JacksonXmlProperty(localName = "Content")
    private String content;

    /**
     * 消息id
     */
    @JacksonXmlProperty(localName = "MsgId")
    private String msgId;

    /**
     * 订阅:subscribe,取消订阅:unsubscribe,。。。
     */
    @JacksonXmlProperty(localName = "Event")
    private String event;

    @JacksonXmlProperty(localName = "EventKey")
    private String eventKey;

}

密文解密

官方的示例解密代码,下载解压之后:

需要用到上述代码,其中 WXBizMsgCryptTest.java ,为官方示例解密代码,可以参考!

应用实例   service

import com.fasterxml.jackson.dataformat.xml.XmlMapper;

private WXBizMsgCrypt msgCrypt;

@PostConstruct
public void init() throws AesException {
    msgCrypt = new WXBizMsgCrypt(properties.getToken(), properties.getEncodingAesKey(), properties.getAppId());
}

@Override
public Object receive(WechatReceiveParam param, WechatReceiveBody body) {
    String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
    String fromXML = String.format(format, body.getEncrypt());

    WechatMsgInfo msgInfo;
    try {
        String result = msgCrypt.decryptMsg(param.getMsg_signature(), param.getTimestamp(), param.getNonce(), fromXML);
        XmlMapper xmlMapper = new XmlMapper();
        msgInfo = xmlMapper.readValue(result, WechatMsgInfo.class);
    } catch (AesException | JsonProcessingException e) {
        log.error("微信消息解密失败,{}",e.getMessage(), e);
        return null;
    }

    // ... 根据 msgInfo 进行正常业务


    // 回复消息来源
    WechatMsgInfo replyMsgInfo = new WechatMsgInfo();
    replyMsgInfo.setToUserName(msgInfo.getFromUserName());
    replyMsgInfo.setFromUserName(msgInfo.getToUserName());
    replyMsgInfo.setMsgType("text");
    replyMsgInfo.setContent("你的回复内容");
    return replyMsgInfo;
}

省略部分代码

new WXBizMsgCrypt() 的参数为,微信开发接口管理 中配置的!

方法直接返回就相当于 回复 !!!

回复实体定义,同微信发送消息实体!偷懒写法。

可回复消息类型

根据自己业务回复相应类型的消息!!!

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐