微信公众号开发-接收与回复消息

微信公众平台:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432&token=&lang=zh_CN

申请测试公众号

微信公众号开发-接收与回复消息

微信公众号开发-接收与回复消息


@Resource
private WechatService wechatService;

/**
 * 验证微信服务器
 * @param out
 * @param response
 * @param signature
 * @param timestamp
 * @param nonce
 * @param echostr
 */
@RequestMapping(value = "/callback",method = RequestMethod.GET)
public void callback(PrintWriter out, HttpServletResponse response,
                       @RequestParam(value = "signature", required = false) String signature, @RequestParam String timestamp,
                       @RequestParam String nonce, @RequestParam String echostr) {
    log.info("signature" + signature + "\ntimestamp" + timestamp + "\nnonce" + nonce + "\nechostr" + echostr);
    if (CheckUtil.checkSignature(signature, timestamp, nonce)) {
        log.info(echostr);
        out.print(echostr);
    }
}

/**
 * 接收来自微信发来的消息
 * @param request
 * @param response
 */
@ResponseBody
@RequestMapping(value = "/callback",method = RequestMethod.POST)
public void getmessage(HttpServletRequest request, HttpServletResponse response)  {
    response.setCharacterEncoding("utf-8");
    PrintWriter out = null;
    try {
        out = response.getWriter();
    } catch (IOException e) {
        e.printStackTrace();
    }
    String responseMessage = wechatService.processRequest(request);
    System.out.println(responseMessage);
    out.print(responseMessage);
    out.flush();
}

CheckUtil.java

public class CheckUtil {

   private static final String token = "zhangyingjie";

   public static boolean checkSignature(String signature, String timestamp, String nonce) {

      // 拼接字符串
      String[] arr = new String[] { token, timestamp, nonce };
      // 排序
      Arrays.sort(arr);
      // 生成字符串
      StringBuffer content = new StringBuffer();
      for (int i = 0; i < arr.length; i++) {
         content.append(arr[i]);
      }
      // SHA1加密
      String tmp = DecriptUtil.SHA1(content.toString());
      return tmp.equals(signature);
   }

}
DecriptUtil.java

public static String SHA1(String decript) {
    try {
        MessageDigest digest = MessageDigest
                .getInstance("SHA-1");
        digest.update(decript.getBytes());
        byte messageDigest[] = digest.digest();
        // Create Hex String
        StringBuffer hexString = new StringBuffer();
        // 字节数组转换为 十六进制 数
        for (int i = 0; i < messageDigest.length; i++) {
            String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
            if (shaHex.length() < 2) {
                hexString.append(0);
            }
            hexString.append(shaHex);
        }
        return hexString.toString();

    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return "";
}

WechatMessageUtil.java

public class WechatMessageUtil {
   // 各种消息类型,除了扫带二维码事件
   /**
    * 文本消息
    */
   public static final String MESSAGE_TEXT = "text";
   /**
    * 图片消息
    */
   public static final String MESSAtGE_IMAGE = "image";
   /**
    * 图文消息
    */
   public static final String MESSAGE_NEWS = "news";
   /**
    * 语音消息
    */
   public static final String MESSAGE_VOICE = "voice";
   /**
    * 视频消息
    */
   public static final String MESSAGE_VIDEO = "video";
   /**
    * 小视频消息
    */
   public static final String MESSAGE_SHORTVIDEO = "shortvideo";
   /**
    * 地理位置消息
    */
   public static final String MESSAGE_LOCATION = "location";
   /**
    * 链接消息
    */
   public static final String MESSAGE_LINK = "link";
   /**
    * 事件推送消息
    */
   public static final String MESSAGE_EVENT = "event";
   /**
    * 事件推送消息中,事件类型,subscribe(订阅)
    */
   public static final String MESSAGE_EVENT_SUBSCRIBE = "subscribe";
   /**
    * 事件推送消息中,事件类型,unsubscribe(取消订阅)
    */
   public static final String MESSAGE_EVENT_UNSUBSCRIBE = "unsubscribe";
   /**
    * 事件推送消息中,上报地理位置事件
    */
   public static final String MESSAGE_EVENT_LOCATION_UP = "LOCATION";
   /**
    * 事件推送消息中,自定义菜单事件,点击菜单拉取消息时的事件推送
    */
   public static final String MESSAGE_EVENT_CLICK = "CLICK";
   /**
    * 事件推送消息中,自定义菜单事件,点击菜单跳转链接时的事件推送
    */
   public static final String MESSAGE_EVENT_VIEW = "VIEW";

   /**
    * xml转化为Map集合
    * 
    * @param request
    * @return
    */
   public static Map<String, String> xmlToMap(HttpServletRequest request) {
      Map<String, String> map = new HashMap<String, String>();
      SAXReader reader = new SAXReader();
      InputStream ins = null;
      try {
         ins = request.getInputStream();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      Document doc = null;
      try {
         doc = reader.read(ins);
      } catch (DocumentException e1) {
         e1.printStackTrace();
      }
      Element root = doc.getRootElement();
      @SuppressWarnings("unchecked")
      List<Element> list = root.elements();
      for (Element e : list) {
         map.put(e.getName(), e.getText());
      }
      try {
         ins.close();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
      return map;
   }
   
   /**
    * 文本消息转化为xml
    * 
    * @param textMessage
    * @return
    */
   public static String textMessageToXml(TextMessage textMessage) {
      return MessageFormat.format(
            "<xml>" +
                  "<ToUserName><![CDATA[{0}]]></ToUserName>" +
                  "<FromUserName><![CDATA[{1}]]></FromUserName>" +
                  "<CreateTime>{2}</CreateTime>" +
                  "<MsgType><![CDATA[text]]></MsgType>" +
                  "<Content><![CDATA[{3}]]></Content>" +
                  "</xml>",
            textMessage.getToUserName(), textMessage.getFromUserName(), textMessage.getCreateTime(), textMessage.getContent());
   }

}
WechatService.java

@Service("wechatService")
public class WechatService {
    private static Logger log = Logger.getLogger(WechatService.class);

    public String processRequest(HttpServletRequest request) {
        Map<String, String> map = WechatMessageUtil.xmlToMap(request);
        log.info(map);
        // 发送方帐号(一个OpenID        String fromUserName = map.get("FromUserName");
        // 开发者微信号
        String toUserName = map.get("ToUserName");
        // 消息类型
        String msgType = map.get("MsgType");
        // 默认回复一个"success"
        String responseMessage = "success";
        // 对消息进行处理
        if (WechatMessageUtil.MESSAGE_TEXT.equals(msgType)) {// 文本消息
            TextMessage textMessage = new TextMessage();
            textMessage.setMsgType(WechatMessageUtil.MESSAGE_TEXT);
            textMessage.setToUserName(fromUserName);
            textMessage.setFromUserName(toUserName);
            textMessage.setCreateTime(System.currentTimeMillis());
            textMessage.setContent("我已经受到你发来的消息了");
            responseMessage = WechatMessageUtil.textMessageToXml(textMessage);
        }
        log.info(responseMessage);
        return responseMessage;

    }
}
BaseWechatMessage.java

@Data
public class BaseWechatMessage {
   /**
    * 开发者微信号
    */
   private String ToUserName;
   /**
    * 发送方帐号(一个OpenID    */
   private String FromUserName;
   /**
    * 消息创建时间 (整型)
    */
   private long CreateTime;
   /**
    * 消息类型
    */
   private String MsgType;
   /**
    * 消息id64位整型
    */
   private String MsgId;
   
}
TextMessage.java

@Data
public class TextMessage extends BaseWechatMessage {
   /**
    * 文本消息内容
    */
   private String Content;
}
maven:

<!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
<dependency>
   <groupId>com.thoughtworks.xstream</groupId>
   <artifactId>xstream</artifactId>
   <version>1.4.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/xmlpull/xmlpull -->
<dependency>
   <groupId>xmlpull</groupId>
   <artifactId>xmlpull</artifactId>
   <version>1.1.3.1</version>
</dependency>
<!--lombok-->
<dependency>
   <groupId>org.projectlombok</groupId>
   <artifactId>lombok</artifactId>
   <version>1.16.10</version>
</dependency>