Force.com是國際知名的雲平台公司,成功配置好Force.com作為微信公開號的服務端后,接下來需要的任務是處理用戶發送的消息。當普通微信用戶向公眾賬號發消息時,微信服務器將POST消息的XML數據包到開發者填寫的URL,通常有的消息類型有文本信息、圖片信息、語音信息、視頻信息、地理位置信息以及鏈接信息。關於每種消息的XML數據包的詳細結構,請參見http://mp.weixin.qq.com/wiki/index.php?title=%E6%8E%A5%E6%94%B6%E6%99%AE%E9%80%9A%E6%B6%88%E6%81%AF。文章介紹文本消息的處理,文本消息XML數據包格式以及說明如下:
文本消息XML數據包示例
1 <xml> 2 <ToUserName><![CDATA[toUser]]></ToUserName> 3 <FromUserName><![CDATA[fromUser]]></FromUserName> 4 <CreateTime>1348831860</CreateTime> 5 <MsgType><![CDATA[text]]></MsgType> 6 <Content><![CDATA[this is a test]]></Content> 7 <MsgId>1234567890123456</MsgId> 8 </xml>
數據包結構說明
通過Debug Logs監控用法發送數據
在Force.com里可以很容易的觀察到微信用戶發送來的XML數據信息,為此進入Force.com后台Setup頁面后在左側導航條的Logs下方找到Debug Logs,點擊進入后,點擊右側Monitored Users旁的New按鈕,如下圖所示:
在接下來的畫面中將可以選擇你想監控哪個用戶和Force.com服務器之間的交互,在搜尋畫面中可以點擊放大鏡查找所有用戶,其中Site.com使用類似於“Site Guest User…”類似的匿名賬戶,選擇好后的示意界面如下:
此時若通過關注了此微信公開賬號的微信用戶發送任意文本到此賬號后,刷新Debug Logs監控頁面及可以在下方看到新增了相應的日志:
點擊進去既可以看到日志里有我們發送的文本的XML數據包:
這種日志也可以幫助到后續的調試。
創建用戶消息處理方法
接下來我們打開之前創建的WeChatRestController類,在里面添加如下方法來響應用戶數據包
1 @HttpPost 2 global static void doPost(){ 3 //存儲XML各節點數據變量 4 String toUserName = ''; 5 String fromUserName = ''; 6 String msgType = ''; 7 String content = ''; 8 //獲取XML數據包 9 RestRequest req = RestContext.request; 10 RestResponse res = RestContext.response; 11 string strMsg = req.requestBody.toString(); 12 XmlStreamReader reader = new XmlStreamReader(strMsg); 13 14 //解析XML數據包,Force.com這塊的處理能力並不強,簡單的結構也需要較多代碼來解析 15 while(reader.hasNext()){ 16 if(reader.getLocalName() == 'ToUserName'){ 17 reader.next(); 18 if(String.isNotBlank(reader.getText())){ 19 toUserName = reader.getText(); 20 } 21 } 22 else if(reader.getLocalName() == 'FromUserName'){ 23 reader.next(); 24 if(String.isNotBlank(reader.getText())){ 25 fromUserName = reader.getText(); 26 } 27 } 28 else if(reader.getLocalName() == 'MsgType'){ 29 reader.next(); 30 if(String.isNotBlank(reader.getText())){ 31 msgType = reader.getText(); 32 } 33 } 34 else if(reader.getLocalName() == 'Content'){ 35 reader.next(); 36 if(String.isNotBlank(reader.getText())){ 37 content = reader.getText(); 38 } 39 } 40 reader.next(); 41 } 42 }
上述代碼 完成了對用戶發送過來數據XML包的解析,接下來我們按照http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E8%A2%AB%E5%8A%A8%E5%93%8D%E5%BA%94%E6%B6%88%E6%81%AF說明,組織好回復給用戶的文本消息數據,這里的回復數據也是XML結構,和發送過來的文本消息XML數據結構基本一致,詳情請參看鏈接里騰訊公司的詳細介紹。下面的代碼將自動發送當前的日期時間給用戶,在前面代碼的While循環后添加如下代碼:
1 Datetime dt = System.now(); 2 String returnDT = dt.format('EEEE, MMMM d, yyyy'); 3 String replyMSG = '<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{2}]]></Content></xml>'; 4 String[] arguments = new String[]{fromUserName, toUserName, rtnMsg}; 5 String formattedReplyMSG = String.format(replyMSG, arguments); 6 RestContext.response.addHeader('Content-Type', 'text/plain'); 7 RestContext.response.responseBody = Blob.valueOf(rtnMsg);
前面代碼需要略微提醒下的是第3行的ToUserName參數和FromUserName參數和普通微信用戶發送來的消息XML數據包是反過來的。
保存代碼,此時普通用戶發送任何消息到此公眾賬號都能很快收到當前的時間信息。





