java版微信公衆號開發(三):自動回覆功能實現

微信公衆平臺服務器配置經過後,就能進行下面的開發啦~~
首先能夠查看官方的說明文檔:https://mp.weixin.qq.com/wiki...html

clipboard.png

普通消息的類型分爲7種:git

  1. 文本消息
  2. 圖片消息
  3. 語音消息
  4. 視頻消息
  5. 小視頻消息
  6. 地理位置消息
  7. 連接消息

下面介紹實現文本的自動回覆:github

文本消息的XML結構是:服務器

<xml>  
    <ToUserName>< ![CDATA[toUser] ]></ToUserName>  
    <FromUserName>< ![CDATA[fromUser] ]></FromUserName>  
    <CreateTime>1348831860</CreateTime>  
    <MsgType>< ![CDATA[text] ]></MsgType>  
    <Content>< ![CDATA[this is a test] ]></Content>  
    <MsgId>1234567890123456</MsgId>  
</xml>

參數包含:微信

clipboard.png

根據開發文檔直接上手--->_>app


實體類的定義:
定義一個BaseMessage,消息基類,封裝通用屬性:微信公衆平臺

public class BaseMessage {
    // 開發者微信號  
    private String ToUserName;  
    // 發送方賬號(一個OpenID)  
    private String FromUserName;  
    // 消息建立時間 (整型)  
    private long CreateTime;  
    // 消息類型(text/image/location/link)  
    private String MsgType;  
    // 消息id,64位整型  
    private long MsgId;
    /**
     * 位0x0001被標誌時,星標剛收到的消息
     */
    private int FuncFlag;
    
    public String getToUserName() {
        return ToUserName;
    }
    public void setToUserName(String toUserName) {
        ToUserName = toUserName;
    }
    public String getFromUserName() {
        return FromUserName;
    }
    public void setFromUserName(String fromUserName) {
        FromUserName = fromUserName;
    }
    public long getCreateTime() {
        return CreateTime;
    }
    public void setCreateTime(long l) {
        CreateTime = l;
    }
    public String getMsgType() {
        return MsgType;
    }
    public void setMsgType(String msgType) {
        MsgType = msgType;
    }
   
    public long getMsgId() {
        return MsgId;
    }
    public void setMsgId(long msgId) {
        MsgId = msgId;
    }

    public int getFuncFlag() {
        return FuncFlag;
    }

    public void setFuncFlag(int funcFlag) {
        FuncFlag = funcFlag;
    }
}

接下來TextMessage,文本屬性TextMessage:ide

public class TextMessage extends BaseMessage{
    // 消息內容
    private String Content;
    
    public String getContent() {
        return Content;
    }
    public void setContent(String content) {
        Content = content;
    }
    
}

必定要注意,屬性名稱須要大寫,屬性名稱須要大寫,屬性名稱須要大寫!!不要問我爲啥這麼強調。post


新建接口MessageService,並實現接口:this

public interface MessageService {
    /**
     * 微信公衆號處理
     * @param request
     * @return
     */
    String newMessageRequest(HttpServletRequest request);
}
@Service("messageService")
public class MessageServiceImpl implements MessageService {
    private static final Logger LOGGER = LoggerFactory.getLogger(MessageServiceImpl.class);

    @Override
    public String newMessageRequest(HttpServletRequest request) {
        String respMessage = null;
        try {
            // xml請求解析
            Map<String, String> requestMap = MessageUtil.xmlToMap(request);
            // 發送方賬號(open_id)
            String fromUserName = requestMap.get("FromUserName");
            // 公衆賬號
            String toUserName = requestMap.get("ToUserName");
            // 消息類型
            String msgType = requestMap.get("MsgType");
            // 消息內容
            String content = requestMap.get("Content");
            LOGGER.info("FromUserName is:" + fromUserName + ", ToUserName is:" + toUserName + ", MsgType is:" + msgType);
            // 文本消息
            if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
                //這裏根據關鍵字執行相應的邏輯
                /*if(content.equals("xxx")){

                }*/
                //自動回覆
                TextMessage text = new TextMessage();
                text.setContent("霍霍哈嘿"+content);
                text.setToUserName(fromUserName);
                text.setFromUserName(toUserName);
                text.setCreateTime(new Date().getTime());
                text.setMsgType(msgType);
                respMessage = MessageUtil.textMessageToXml(text);
            }
            // 事件推送
            else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
                String eventType = requestMap.get("Event");// 事件類型
                // 訂閱
                if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
                    //文本消息
                    TextMessage text = new TextMessage();
                    text.setContent("我無論,我最美!!");
                    text.setToUserName(fromUserName);
                    text.setFromUserName(toUserName);
                    text.setCreateTime(new Date().getTime());
                    text.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
                    respMessage = MessageUtil.textMessageToXml(text);
                }
                // 取消訂閱後用戶再收不到公衆號發送的消息,所以不須要回復消息
                else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {// 取消訂閱

                }
            }
        }
        catch (Exception e) {
            LOGGER.error("error......");
        }
        return respMessage;
    }
 }

上一篇文章,已經建立了WechatIndexController ,裏面的GET方法用來驗證token,下面直接加一個POST方法,用於進行消息管理。

@Autowired
private MessageService messageService;


@RequestMapping(method = RequestMethod.POST)
    public void post(HttpServletRequest request, HttpServletResponse response) {
        try {
            request.setCharacterEncoding("UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            log.error(e.getMessage(),e);
        }
        response.setContentType("text/html;charset=UTF-8");

        // 調用核心業務類接收消息、處理消息
        String respMessage = messageService.newMessageRequest(request);

        // 響應消息
        PrintWriter out = null;
        try {
            out = response.getWriter();
            out.print(respMessage);
        } catch (IOException e) {
            e.printStackTrace();
            log.error(e.getMessage(),e);
        } finally {
            out.close();
            out = null;
        }
    }

啓動服務,關注此微信公衆號,就會按照咱們設置的顯示啦!!

clipboard.png

另外,圖文的實現與之相似,這裏不在進行過多的闡述,源碼中已經實現,須要的能夠直接下載查看。

clipboard.png

源碼:https://github.com/zhouminpz/...

相關文章
相關標籤/搜索