微信公眾號Python-SDK
本SDK支持微信公眾號以及企業(yè)號的上行消息及OAuth接口。本文檔及SDK假設(shè)使用者已經(jīng)具備微信公眾號開發(fā)的基礎(chǔ)知識,及有能力通過微信公眾號、企業(yè)號的文檔來查找相關(guān)的接口詳情。
1. 安裝
pip install wechat
源碼安裝
git clone [email protected]:jeffkit/wechat.git cd wechat python setup.py install
對于微信用戶在公眾號內(nèi)發(fā)送的上行消息,本sdk提供了一個微型處理框架,開發(fā)者只需繼承wechat.official.WxApplication類, 實現(xiàn)各種消息對應(yīng)的方法,然后把該類與自己熟悉的web框架結(jié)合起來使用即可。
WxApplication內(nèi)部會實現(xiàn)請求的合法性校驗以及消息的分發(fā)等功能,還對上行消息對行了結(jié)構(gòu)化,開發(fā)者把精力放到業(yè)務(wù)邏輯的編寫即可。
WxApplication類核心方法:
WxApplication.process(params, xml, token=None, app_id=None, aes_key=None)
WxApplication的process函數(shù),接受以下參數(shù):
params, url參數(shù)字典,需要解析自微信回調(diào)的url的querystring。格式如:{'nonce': 1232, 'signature': 'xsdfsdfsd'}
xml, 微信回調(diào)時post的xml內(nèi)容。
token, 公眾號的上行token,可選,允許在子類配置。
app_id, 公眾號應(yīng)用id,可選,允許在子類配置。
aes_key, 公眾號加密secret,可選,允許在子類配置。
process最后返回一串文本(xml或echoStr)。
使用場景1:上行URL有效性驗證
在微信公眾號的后臺設(shè)置好URL及token等相關(guān)信息后,微信會通過GET的方式訪問一次該URL,開發(fā)者在URL的響應(yīng)程序里直接調(diào)用app.process(params, xml=None)即可返回echStr。
qs = 'nonce=1221&signature=19selKDJF×tamp=12312'
query = dict([q.split('=') for q in qs.split('&')])
app = YourApplication()
echo_str = app.process(query, xml=None)
# 返回echo_str給微信即可
使用場景2:處理上行消息
用戶在微信公眾號上發(fā)消息給公眾號,微信服務(wù)器調(diào)用上行的URL,開發(fā)者需要對每次的的請求進行合法性校驗及對消息進行處理,同樣的,直接調(diào)用app.process方法就好。
qs = 'nonce=1221&signature=19selKDJF×tamp=12312'
query = dict([q.split('=') for q in qs.split('&')])
body = '<xml> ..... </xml>'
app = YourApplication()
result = app.process(query, xml=body)
# 返回result給微信即可
WxApplication子類示例
下面先看看一個WxApplication的示例代碼,用于把用戶上行的文本返還給用戶:
from wechat.official import WxApplication, WxTextResponse, WxMusic,\ WxMusicResponse class WxApp(WxApplication): SECRET_TOKEN = 'test_token' WECHAT_APPID = 'wx1234556' WECHAT_APPSECRET = 'sevcs0j' def on_text(self, text): return WxTextResponse(text.Content, text)
需要配置幾個類參數(shù),幾個參數(shù)均可在公眾號管理后臺的開發(fā)者相關(guān)頁面找到,前三個參數(shù)如果不配置,則需要在調(diào)用process方法時傳入。
SECRET_TOKEN: 微信公眾號回調(diào)的TOKEN
APP_ID: 微信公眾號的應(yīng)用ID
ENCODING_AES_KEY: (可選),加密用的SECRET,如您的公眾號未采取加密傳輸,不需填。
UNSUPPORT_TXT:(可選),收到某種不支持類型的消息時自動響應(yīng)給用戶的文本消息。
WELCOME_TXT:(可選), 新關(guān)注時默認響應(yīng)的文本消息。
然后,您需要逐一實現(xiàn)WxApplication的各個on_xxxx函數(shù)。不同類型的上行消息及事件均有對應(yīng)的on_xxx函數(shù)
on_xxx函數(shù)
所有的on_xxx函數(shù)列舉如下:
on_text, 響應(yīng)用戶文本
on_link,響應(yīng)用戶上行的鏈接
on_image,響應(yīng)用戶上行圖片
on_voice,響應(yīng)用戶上行語音
on_video,響應(yīng)用戶上行視頻
on_location,響應(yīng)用戶上行地理位置
on_subscribe,響應(yīng)用戶關(guān)注事件
on_unsubscribe,響應(yīng)用戶取消關(guān)注事件
on_click,響應(yīng)用戶點擊自定義菜單事件
on_scan,響應(yīng)用戶掃描二維碼事件
on_location_update,響應(yīng)用戶地理位置變更事件
on_view,響應(yīng)用戶點擊自定義菜單訪問網(wǎng)頁事件
on_scancode_push
on_scancode_waitmsg
on_pic_sysphoto
on_pic_photo_or_album
on_pic_weixin
on_location_select
on_xxx函數(shù)的定義如下:
def on_xxx(self, req): return WxResponse()
on_xxx函數(shù),接受一個WxRequest參數(shù)req,返回一個WxResponse的子類實例。
WxRequestreq是一個代表用戶上行消息的WxRequest實例。其屬性與消息的XML屬性一一對應(yīng),不同的消息有幾個相同的屬性:
ToUserName
FromUserName
CreateTime
MsgType
MsgId
ToUserName
FromUserName
CreateTime
MsgType
MsgId
不同的消息類型對應(yīng)有各自的屬性,屬性名與消息的xml標簽名保一致。如MsgType為?text的的req,有一個Content屬懷,而MsgType為image的req,則有PicUrl及MediaId兩個屬性。更多消息詳情請查看微信公眾號官方文檔。
WxResponse
on_xxx函數(shù)需要返回一個WxResponse的子類實例。WxResponse的子類及其構(gòu)造的方式有:
WxTextResponse, 文本消息
WxTextResponse("hello", req)
WxImageResponse, 圖片消息
WxImageResponse(WxImage(MediaId='xxyy'),req)
WxVoiceResponse, 語音消息
WxVoiceResponse(WxVoice(MediaId='xxyy'),req)
WxVideoResponse, 視頻消息
WxVideoResponse(WxVideo(MediaId='xxyy', Title='video', Description='test'),req)
WxMusicResponse, 音樂消息
WxMusicResponse(WxMusic(Title='hey jude', Description='dont make it bad', PicUrl='http://heyjude.com/logo.png', Url='http://heyjude.com/mucis.mp3'), req)
WxNewsResponse, 圖文消息
WxNewsResponse(WxArticle(Title='test news', Description='this is a test', Picurl='http://smpic.com/pic.jpg', Url='http://github.com/jeffkit'), req)
WxEmptyResponse, 無響應(yīng)
WxEmptyResponse(req)
在Django中使用WxApplication
下面以Django為例說明,實現(xiàn)一個微信回調(diào)的功能(view),利用上面示例代碼中的WxApp:
from django.http import HttpResponse def wechat(request): app = WxApp() result = app.process(request.GET, request.body) return HttpResponse(result)
配置 urls.py:
urlpatterns = patterns('',
url(r'^wechat/', 'myapp.views.wechat'),
)
在Flask中使用WxApplication
from flask import request
from flask import Flask
app = Flask(__name__)
@app.route('/wechat')
def wechat():
app = WxApp()
return app.process(request.args, request.data)
OK.就這么多,WxApplication本身與web框架無關(guān),不管你使用哪個Framework都可以享受到它帶來的便利。
什么?你不喜歡寫WxApplication的子類?!
好吧,其實,你可以在任何地方寫on_xxx的響應(yīng)函數(shù)。然后在使用之前,告訴一個WxApplication你要用哪個函數(shù)來響應(yīng)對應(yīng)的事件就好。以Django為例:
# 在任何地方寫你自己的消息處理函數(shù)。
# @any_decorator # 添加任何裝飾器。
def my_text_handler(req):
return WxTextResponse(req.Content, req)
# 在web的程序里這樣使用:
def wechat_view(request):
app = WxApplication() # 實例化基類就好。
app.handlers = {'text': my_text_handler} # 設(shè)置你自己的處理器
result = app.process(request.GET, request.body,
token='xxxx', app_id='xxxx', aes_key='xxxx')
return HttpResponse(result)
嗯,可以自定義消息的handlers,而如果要針對事件自定義handlers的話,要修改app.event_handlers,數(shù)據(jù)的格式是一樣的。具體的消息和事件類型的key,就直接看看源碼得了。卡卡。
3. OAuth API
OAuth API目前僅支持下列常用接口:
發(fā)送消息
用戶管理
自定義菜單管理
多媒體上傳下載
二維碼
其他接口擬于未來的版本中支持,同時歡迎大家來增補。
