2424
2525WxApplication内部会实现请求的合法性校验以及消息的分发等功能,还对上行消息对行了结构化,开发者把精力放到业务逻辑的编写即可。
2626
27- 下面先看看一个WxApplication的示例代码:
27+ WxApplication类核心方法:
28+
29+ ### WxApplication.process(params, xml, token=None, app_id=None, aes_key=None)
30+
31+ WxApplication的process函数,接受以下参数:
32+
33+ - params, url参数字典,需要解析自微信回调的url的querystring。格式如:{'nonce': 1232, 'signature': 'xsdfsdfsd'}
34+ - xml, 微信回调时post的xml内容。
35+ - token, 公众号的上行token,可选,允许在子类配置。
36+ - app_id, 公众号应用id,可选,允许在子类配置。
37+ - aes_key, 公众号加密secret,可选,允许在子类配置。
38+
39+ process最后返回一串文本(xml或echoStr)。
40+
41+
42+ #### 使用场景1:上行URL有效性验证
43+
44+ 在微信公众号的后台设置好URL及token等相关信息后,微信会通过GET的方式访问一次该URL,开发者在URL的响应程序里直接调用app.process(params, xml=None)即可返回echStr。
45+
46+ qs = 'nonce=1221&signature=19selKDJF×tamp=12312'
47+ query = dict([q.split('=') for q in qs.split('&')])
48+ app = YourApplication()
49+ echo_str = app.process(query, xml=None)
50+ # 返回echo_str给微信即可
51+
52+
53+ #### 使用场景2:处理上行消息
54+
55+ 用户在微信公众号上发消息给公众号,微信服务器调用上行的URL,开发者需要对每次的的请求进行合法性校验及对消息进行处理,同样的,直接调用app.process方法就好。
56+
57+ qs = 'nonce=1221&signature=19selKDJF×tamp=12312'
58+ query = dict([q.split('=') for q in qs.split('&')])
59+ body = '<xml> ..... </xml>'
60+ app = YourApplication()
61+ result = app.process(query, xml=body)
62+ # 返回result给微信即可
63+
64+
65+ ### WxApplication子类示例
66+
67+ 下面先看看一个WxApplication的示例代码,用于把用户上行的文本返还给用户:
2868
2969 from wechat.official import WxApplication, WxTextResponse, WxMusic,\
3070 WxMusicResponse
@@ -38,18 +78,8 @@ WxApplication内部会实现请求的合法性校验以及消息的分发等功
3878 def on_text(self, text):
3979 return WxTextResponse(text.Content, text)
4080
41- def on_image(self, image):
42- return WxTextResponse(image.Url, image)
43-
44- def on_click(self, click):
45- return WxMusicResponse(
46- WxMusic(Title='hey jude',
47- Description='dont make it bad',
48- PicUrl='http://heyjude.com/logo.png',
49- Url='http://heyjude.com/mucis.mp3'),
50- click)
5181
52- 需要配置几个类参数,几个参数均可在公众号管理后台的开发者相关页面找到:
82+ 需要配置几个类参数,几个参数均可在公众号管理后台的开发者相关页面找到,前三个参数如果不配置,则需要在调用process方法时传入。
5383
5484- SECRET_TOKEN: 微信公众号回调的TOKEN
5585- APP_ID: 微信公众号的应用ID
@@ -104,7 +134,7 @@ req是一个代表用户上行消息的WxRequest实例。其属性与消息的XM
104134
105135#### WxResponse
106136
107- on_xxx函数需要返回一个WxResponse的子类实例。WxResponse的子类有 :
137+ on_xxx函数需要返回一个WxResponse的子类实例。WxResponse的子类及其构造的方式有 :
108138
109139##### WxTextResponse, 文本消息
110140
@@ -139,18 +169,7 @@ on_xxx函数需要返回一个WxResponse的子类实例。WxResponse的子类有
139169
140170 WxEmptyResponse(req)
141171
142- ### 在web中使用WxApplication
143-
144- 编写完成WxApplication后,将其应用于您熟悉的web框架当中即可。关键是在web程序里调用WxApplication的process方法,后续的事情交给SDK来处理。
145-
146- #### process(params, xml)
147-
148- WxApplication的process函数,接受两个必须的参数:
149-
150- - params, url参数字典,需要解析自微信回调的url的querystring。
151- - xml, 微信回调时post的xml内容。
152-
153- process最后返回一串文本(xml或空字符串)。
172+ ### 在Django中使用WxApplication
154173
155174
156175下面以Django为例说明,实现一个微信回调的功能(view),利用上面示例代码中的WxApp:
@@ -168,8 +187,41 @@ process最后返回一串文本(xml或空字符串)。
168187 url(r'^wechat/', 'myapp.views.wechat'),
169188 )
170189
190+
191+ ### 在Flask中使用WxApplication
192+ from flask import request
193+ from flask import Flask
194+ app = Flask(__name__)
195+
196+ @app.route('/wechat')
197+ def wechat():
198+ app = WxApp()
199+ return app.process(request.args, request.data)
200+
201+
171202OK.就这么多,WxApplication本身与web框架无关,不管你使用哪个Framework都可以享受到它带来的便利。
172203
204+ ### 什么?你不喜欢写WxApplication的子类?!
205+
206+ 好吧,其实,你可以在任何地方写on_xxx的响应函数。然后在使用之前,告诉一个WxApplication你要用哪个函数来响应对应的事件就好。以Django为例:
207+
208+ # 在任何地方写你自己的消息处理函数。
209+ # @any_decorator # 添加任何装饰器。
210+ def my_text_handler(req):
211+ return WxTextResponse(req.Content, req)
212+
213+ # 在web的程序里这样使用:
214+ def wechat_view(request):
215+ app = WxApplication() # 实例化基类就好。
216+ app.handlers = {'text': my_text_handler} # 设置你自己的处理器
217+ result = app.process(request.GET, request.body,
218+ token='xxxx', app_id='xxxx', aes_key='xxxx')
219+ return HttpResponse(result)
220+
221+
222+ 嗯,可以自定义消息的handlers,而如果要针对事件自定义handlers的话,要修改app.event_handlers,数据的格式是一样的。具体的消息和事件类型的key,就直接看看源码得了。卡卡。
223+
224+
173225## 3. OAuth API
174226
175227OAuth API目前仅支持下列常用接口:
0 commit comments