天天看点

微信公众号开发——接收用户消息和回复消息

接收用户消息和回复消息

接收用户消息

  • 文档地址:接收普通消息
  • 消息类型
    • 文本
      微信公众号开发——接收用户消息和回复消息
    • 图片
      微信公众号开发——接收用户消息和回复消息
    • 语音
    • 视频
    • 视频
    • 地理位置

回复消息

  • 文档地址:被动回复用户信息
  • 文本回复
    微信公众号开发——接收用户消息和回复消息
  • 图片
    微信公众号开发——接收用户消息和回复消息

**这里只展开文本和图片,其他几种类型用法相似**

代码

  • url地址说明:
与 接口配置信息中一致,只是请求方式是POST
微信公众号开发——接收用户消息和回复消息
微信公众号开发——接收用户消息和回复消息
  • controller
@PostMapping("/wxchat/access")
    public void doPost(HttpServletRequest request, HttpServletResponse response) {

        try {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println(wxMessService.getMess(request));
        } catch (Exception e) {
            System.out.println(e.toString());
        }

    }
           
  • WxMessService
//接收普通消息
    public String getMess(HttpServletRequest request){
        try
        {
            request.setCharacterEncoding("UTF-8");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(request.getInputStream());
            Element root = document.getDocumentElement();
            return xmlParse(root);
        }
        catch(Exception e)
        {
            System.out.println(e.toString());
        }
        // 异常微信建议返回值
        return "success";
    }




 private String xmlParse( Element root){
        String xml="";
        if(root!=null){
            String  msgType = root.getElementsByTagName("MsgType").item(0).getTextContent();
            String  wechatId = root.getElementsByTagName("ToUserName").item(0).getTextContent();
            String  openid = root.getElementsByTagName("FromUserName").item(0).getTextContent();
            String  msgId = root.getElementsByTagName("MsgId").item(0).getTextContent();
            switch (MsgTypeEnum.getByType(msgType)){
                case TEXT:
                    String  msg = root.getElementsByTagName("Content").item(0).getTextContent();
                    System.out.println(msg);
                    xml=receiveContentText(wechatId,openid,msg,msgId);
                    break;
                case IMAGE:
                    String  picUrl = root.getElementsByTagName("PicUrl").item(0).getTextContent();
                    System.out.println("PicUrl:"+picUrl);
                    String  mediaId = root.getElementsByTagName("MediaId").item(0).getTextContent();
                    System.out.println("mediaId:"+mediaId);
                    xml=sendImageMess(openid,wechatId,mediaId);
                    break;
                default:
                    break;

            }
        }
        return xml;
    }



/**
     * 发送图片消息
     * @param toUserName
     * @param fromUserName
     * @param mediaId  微信素材id
     * @author zzg
     * @date 2021/2/24
     * @return java.lang.String
     * @throws
     */
    private String sendImageMess(String toUserName,String fromUserName,String mediaId){

        return String.format(MsgTypeReturnEnum.IMAGE.getTypeXml(), toUserName,fromUserName,System.currentTimeMillis(),mediaId);
    }

    private String  receiveContentText(String toUserName,String fromUserName,String content,String msgId){
        String mes="";
        if(content.matches("喜欢"))
        {
            mes="我也喜欢你";
        }
        else
        {
            mes=content;
        }
        return sendTextMess(fromUserName,toUserName,mes,msgId);
    }

    private String sendTextMess(String toUserName,String fromUserName,String content,String msgId){

        return String.format(MsgTypeReturnEnum.TEXT.getTypeXml(), toUserName,fromUserName,System.currentTimeMillis(),content,msgId);
    }


           
  • 两enum
    • 回复
/**
 * 消息类型返回
 *
 * @program: wxchat
 * @author: zzg
 * @create: 2021-02-08 15:37
 */
public enum MsgTypeReturnEnum {
    TEXT("text","文本","<xml>\n" +
            "  <ToUserName><![CDATA[%1$s]]></ToUserName>\n" +
            "  <FromUserName><![CDATA[%2$s]]></FromUserName>\n" +
            "  <CreateTime>%3$d</CreateTime>\n" +
            "  <MsgType><![CDATA[text]]></MsgType>\n" +
            "  <Content><![CDATA[%4$s]]></Content>\n" +
            "</xml>"),
    IMAGE("image","图片"," <xml>\n" +
            "  <ToUserName><![CDATA[%1$s]]></ToUserName>\n" +
            "  <FromUserName><![CDATA[%2$s]]></FromUserName>\n" +
            "  <CreateTime>%3$d</CreateTime>\n" +
            "   <MsgType><![CDATA[image]]></MsgType>\n" +
            "  <Image>\n" +
            "    <MediaId><![CDATA[%4$s]]></MediaId>\n" +
            "  </Image>\n" +
            "</xml>");

    /**
     * 类型
     */
    private   String type;

    /**
     * 类型名
     */
    private String typeName;


    /**
     * xml文本
     */
    private String typeXml;

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }

    public String getTypeXml() {
        return typeXml;
    }

    public void setTypeXml(String typeXml) {
        this.typeXml = typeXml;
    }

    MsgTypeReturnEnum(String type, String typeName, String typeXml) {
        this.type = type;
        this.typeName = typeName;
        this.typeXml = typeXml;
    }


    public static MsgTypeReturnEnum getByType(String type){
        MsgTypeReturnEnum[] values = MsgTypeReturnEnum.values();
        for (MsgTypeReturnEnum value : values) {
            if (value.getType().equals(type)) {
                return value;
            }
        }
        return null;
    }
}

           
  • 接收
/**
   * 消息类型
   *
   * @program: wxchat
   * @author: zzg
   * @create: 2021-02-08 15:37
   */
  public enum MsgTypeEnum {
      /**
       * 文本
       */
      TEXT("text","文本","<xml> <ToUserName><![CDATA[%1$s]]></ToUserName>  <FromUserName><![CDATA[%2$s]]></FromUserName> <CreateTime>%3$s</CreateTime>  <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%4$s]]></Content>  <MsgId>%5$s</MsgId>  </xml>"),
  
      /**
       * 图片
       */
      IMAGE("image","图片"," <xml><ToUserName><![CDATA[%1$s]]></ToUserName> <FromUserName><![CDATA[%2$s]]></FromUserName> <CreateTime>%3$s</CreateTime><MsgType><![CDATA[image]]></MsgType><PicUrl><![CDATA[%4$s]]></PicUrl><MediaId><![CDATA[%5$s]]></MediaId><MsgId>%6$s</MsgId></xml>");
  
      /**
       * 类型
       */
      private   String type;
  
      /**
       * 类型名
       */
      private String typeName;
  
  
      /**
       * xml文本
       */
      private String typeXml;
  
      public String getType() {
          return type;
      }
  
      public void setType(String type) {
          this.type = type;
      }
  
      public String getTypeName() {
          return typeName;
      }
  
      public void setTypeName(String typeName) {
          this.typeName = typeName;
      }
  
      public String getTypeXml() {
          return typeXml;
      }
  
      public void setTypeXml(String typeXml) {
          this.typeXml = typeXml;
      }
  
      MsgTypeEnum(String type, String typeName, String typeXml) {
          this.type = type;
          this.typeName = typeName;
          this.typeXml = typeXml;
      }
  
  
      public static MsgTypeEnum getByType(String type){
          MsgTypeEnum[] values = MsgTypeEnum.values();
          for (MsgTypeEnum value : values) {
              if (value.getType().equals(type)) {
                  return value;
              }
          }
          return null;
      }
  }

           
关于回复图片中的MediaId,这个值,可以在素材管理中获取图片素材来获取。有个讨巧的方法,就是直接在发送图片给测试公众号来获取mediaId(临时的,有效期是3天)
  • 消息加密

    加解密说明

    建议下载示例代码

    demo
  • maven 引入
<dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>
           
  • 引入demo中的类
    微信公众号开发——接收用户消息和回复消息
  • controller
@PostMapping("/wxchat/access/encoding1")
    public String wxAccessEncoding(HttpServletRequest request, HttpServletResponse response) {
        String encryMess = wxMessService.getEncryMess(request);
        System.out.println(encryMess);
        return encryMess;
    }
           
  • service
/**
     * 读取加密的信息
     * @Param [request]
     * @author zzg
     * @date 2021/2/7
     * @return java.lang.String
     * @throws
     */
    public String getEncryMess(HttpServletRequest request){
        try {


            String encodingAesKey = wxConfig.getEncodingAesKey();
            String token = wxConfig.getToken();
            String appId = wxConfig.getAppId();

            request.setCharacterEncoding("UTF-8");
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            Document document = db.parse(request.getInputStream());
            Element root = document.getDocumentElement();
            String  encrypt = root.getElementsByTagName("Encrypt").item(0).getTextContent();

            Map<String, String[]> parameterMap = request.getParameterMap();
            String  nonce = parameterMap.get("nonce")[0];
            String  msgSignature = parameterMap.get("msg_signature")[0];
            String  timeStamp = parameterMap.get("timestamp")[0];

            WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId);
            String format = "<xml><ToUserName><![CDATA[toUser]]></ToUserName><Encrypt><![CDATA[%1$s]]></Encrypt></xml>";
            String fromXML = String.format(format, encrypt);
            String result2 = pc.decryptMsg(msgSignature, timeStamp, nonce, fromXML);
            System.out.println("解密后明文: " + result2);

            String s = xmlParse(result2);
            String mingwen = pc.encryptMsg(s, String.valueOf(System.currentTimeMillis()), nonce);
            System.out.println("加密后: " + mingwen);
            return mingwen;
        }catch (Exception e){

        }
       return "";
    }




    private String xmlParse( String xmlString){
        try {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            DocumentBuilder db = dbf.newDocumentBuilder();
            StringReader sr = new StringReader(xmlString);
            InputSource is = new InputSource(sr);
            Document document = db.parse(is);
            Element root = document.getDocumentElement();
            return xmlParse(root);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
           
  • 校验

    微信公众平台接口调试工具

微信公众号开发——接收用户消息和回复消息
微信公众号开发——接收用户消息和回复消息

上一篇,微信公众号开发——接口配置信息的开发