微信扫码登陆 — 4 接收消息
·
消息加密方式配置:可 明文 或 密文

服务器地址:为自定义回调接口,必须可以 公网访问,端口必须为 80 或 443 !!!
官方参数示例:

参数分为: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() 的参数为,微信开发接口管理 中配置的!
方法直接返回就相当于 回复 !!!
回复实体定义,同微信发送消息实体!偷懒写法。
可回复消息类型

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


所有评论(0)