到了這一步,在微信上關注那個測試賬號,發(fā)送的信息已經會到我們的 SAE 的 app 服務上了。
微信過來的信息都是 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
雖然文檔上有具體的數據例子,但是,一般還是自己親眼看到過來的數據,心理上才會踏實一些吧,所以,我們在代碼上添加一些邏輯,使用 storage 服務把請求過來的數據保存下來。SAE 環(huán)境上標準的輸出不太好用,所以開發(fā)時把 storage 當成記日志的地方就好了,還有現成的 Web 工具可以直接查看呢。
先去把應用的 storage 服務開啟,并創(chuàng)建一個 Bucket,Bucket 我這里取的名字是 log
,為了方便查看,把權限改成 public 。
然后修改 index.wsgi
代碼:
# -*- coding: utf-8 -*- import re import time from sae.storage import Bucket def application(environ, start_response): if environ.get('REQUEST_METHOD', 'GET') == 'GET': q = environ.get('QUERY_STRING') m = re.findall('echostr=(.*)', q)[0] s = m.split('&', 1)[0] start_response('200 ok', [('content-type', 'text/plain')]) return [s] length = environ.get('CONTENT_LENGTH', 0) length = int(length) body = environ['wsgi.input'].read(length) bucket = Bucket('log') bucket.put_object('%s.txt' % int(time.time()), body) start_response('200 ok', [('content-type', 'text/plain')]) return ['']
用戶的數據都是通過 POST 方法過來的,所以,對于 GET 方法,我們還是原來的邏輯,直接返回 echostr
的數據即可。
wsgi 接口上,獲取 POST 數據的簡單方法,就是先拿到 CONTENT_LENGTH
頭,它標識了 HTTP 請求的 body 部分的長度。然后從 environ['wsgi.input']
這個 file like 對象中讀取指定長度的數據即可。
上面代碼中,body
就是一個 XML 形式的數據了,我們目前也不做任何處理,直接以時間戳為名,存到 storage 中去。
提交代碼,然后在微信上向這個測試賬號發(fā)一些不同類型的信息吧,文字,圖像,語音。
文字內容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407299911</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[文本內容]]></Content> <MsgId>6044307093609310161</MsgId> </xml>
圖像內容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407300008</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz/EiaMylXxR8B.../0]]></PicUrl> <MsgId>6044307510221137887</MsgId> <MediaId><![CDATA[HFQ8FFcieYaRJaNJZecI602qXXU16pqDz3SGY44PGDWbe_mqQBPiQbD_62_N6UDu]]></MediaId> </xml>
直接訪問 PicUrl
都可以看到圖片的。
語音內容:
<xml><ToUserName><![CDATA[gh_b47caeadeeb7]]></ToUserName> <FromUserName><![CDATA[ov_QzuF0iskLIXqu0r71qOLmZV6B]]></FromUserName> <CreateTime>1407300099</CreateTime> <MsgType><![CDATA[voice]]></MsgType> <MediaId><![CDATA[qYVLd_UHsrXw5xPiu5ZMNFtIhxpjVojHICbuCvXLPWnarPF8hvY0Ft-GaF2pfUVo]]></MediaId> <Format><![CDATA[amr]]></Format> <MsgId>6044307901063161835</MsgId> <Recognition><![CDATA[]]></Recognition> </xml>
現在也不用去管這堆 XML 的解析問題,了解一下這些數據就可以了。
更多建議: