服务器(Controller)代码
@RequestMapping(value = "getToken")
@GetMapping(produces = "text/plain;charset=utf-8")
@ResponseBody
public void getToken(HttpServletRequest request, HttpServletResponse response) {
if (StringUtils.isBlank(request.getParameter("signature"))) {
return;
}
String msgSignature = request.getParameter("msg_signature");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
try {
if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息签名不正确,说明不是公众平台发过来的消息
response.getWriter().println("非法请求");
return;
}
if (StringUtils.isNotBlank(echostr)) {
// 说明是一个仅仅用来验证的请求,回显echostr
response.getWriter().println(Long.valueOf(echostr));
return;
}
String encryptType =
StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw" : request.getParameter("encrypt_type");
WxMpXmlMessage inMessage = null;
if ("raw".equals(encryptType)) {
// 明文传输的消息
inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
} else if ("aes".equals(encryptType)) {
// 是aes加密的消息
inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(), weixinService.getWxMpService().getWxMpConfigStorage(), timestamp, nonce, msgSignature);
} else {
response.getWriter().println("不可识别的加密类型");
return;
}
log.debug("__获取到的消息__"+inMessage.toString());
String event = inMessage.getEvent();
// 判定是关注公众号操作还是 对公众进行发送消息
if(StringUtils.isNotBlank(event)){
// 这个是关注与取消关注的逻辑操作
this.attentionGzh(inMessage,event);
}else {
// 回复消息
gzhUserService.passiveReplyMessage(inMessage, response);
}
inMessage.getEvent();
} catch (Exception e) {
e.printStackTrace();
}
}
// 回复消息 service
public String passiveReplyMessage(WxMpXmlMessage inMessage, HttpServletResponse response){
String msgType = inMessage.getMsgType();
if (msgType.equals("text")){
String content = inMessage.getContent();
String xmlTextString = "";
if (content.equals("绑定账号")){
xmlTextString = xmlText(inMessage.getToUser(), inMessage.getFromUser(), "好的");
}
if (content.equals("1")){
xmlTextString = xmlText(inMessage.getToUser(), inMessage.getFromUser(), "好的");
}
// 回复消息
if (StringUtils.isNotBlank(xmlTextString)){
try {
response.setCharacterEncoding("UTF-8");
response.getWriter().println(xmlTextString);
}catch (IOException e){
throw new IORuntimeException(e);
}
}
return xmlTextString;
}
return "";
}
接受数据 xlm已转对象
{"allFieldsMap":{"Content":"1","CreateTime":"1695626434","ToUserName":"gh_","FromUserName":"olB_","MsgType":"text","MsgId":"24275533520139327"},"toUser":"gh_","fromUser":"olB_","createTime":1695626434,"msgType":"text","content":"1","msgId":242,"scanCodeInfo":{},"sendPicsInfo":{"picList":[]},"sendLocationInfo":{},"hardWare":{}}
返回的XML (我服务器的xml名称) xmlTextString
<xml><ToUserName><![CDATA[gh_]]></ToUserName><FromUserName><![CDATA[olB_]]></FromUserName><CreateTime>1695626435704</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[好的]]></Content></xml>
问题找到了?ToUserName与FromUserName的数据写反了
<xml>
<ToUserName><![CDATA[gh_]]></ToUserName>
<FromUserName><![CDATA[olB_]]></FromUserName>
<CreateTime>1697533625457</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[90]]></Content>
</xml>
正确:
<xml>
<ToUserName><![CDATA[olB_]]></ToUserName>
<FromUserName><![CDATA[gh_]]></FromUserName>
<CreateTime>1697533625457</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[90]]></Content>
</xml>
还有我传过来的数据是加密的,所以返回的数据也是加密的