收藏
回答

被动回复消息无反应?

服务器(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>



回答关注问题邀请回答
收藏

1 个回答

  • 沐千熏
    沐千熏
    2023-10-17

    问题找到了?ToUserName与FromUserName的数据写反了

    错误:textMessage.setFromUserName(inMessage.getFromUser());
    textMessage.setToUserName(inMessage.getToUser());
    

    <xml>

      <ToUserName><![CDATA[gh_]]></ToUserName>

      <FromUserName><![CDATA[olB_]]></FromUserName>

      <CreateTime>1697533625457</CreateTime>

      <MsgType><![CDATA[text]]></MsgType>

      <Content><![CDATA[90]]></Content>

    </xml>

    正确:

    textMessage.setFromUserName(inMessage.getToUser());
    textMessage.setToUserName(inMessage.getFromUser());
    


    <xml>

      <ToUserName><![CDATA[olB_]]></ToUserName>

      <FromUserName><![CDATA[gh_]]></FromUserName>

      <CreateTime>1697533625457</CreateTime>

      <MsgType><![CDATA[text]]></MsgType>

      <Content><![CDATA[90]]></Content>

    </xml>

    还有我传过来的数据是加密的,所以返回的数据也是加密的


    2023-10-17
    有用
    回复
登录 后发表内容