微信公衆號開發-接收與回覆消息

微信公衆平臺: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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章