微信上发送一条消息给自己的公众号后台,后台返回一条消息给用户。
1. 我有了一个微信公众号后台,能推送图文消息给用户。如何完成自定义响应用户消息?
微信公众平台开发接口介绍 http://mp.weixin.qq.com/wiki/home/index.html
微信公众号的后台将用户在公众号内的留言转发到某个指定的URI。 指定的URI能完成接收微信的请求,返回消息。
如何在一个URI上提供消息应答功能? 部署在SAE上的一个python应用简单几行代码就能提供web服务
sae python应用文档 http://sae.sina.com.cn/doc/python/index.html
2. 如果选用bottle这样的一个web框架,简单代码就可以完成一个请求应答的过程。
from bottle import Bottle, run
import sae
app = Bottle()
@app.route('/')
def hello():
return "Hello, world! - Bottle"
application = sae.create_wsgi_app(app)
3. 理解基本流程之后,选择合适的框架来复用,支持微信消息回复的流程, 先参考网上的教程,调通基本的请求应答,详细可见github的提交日志。
在github上选择合适的框架 从自己写应答代码构造返回xml等。 到利用wechat-sdk 到最后选用werobot框架
搭建过程主要参考了大妈的42分钟乱入SAE手册 http://chaos2.qiniudn.com/sae/build/html/
通读SAE官方文档python部分 http://sae.sina.com.cn/doc/python/index.html
搭建过程不使用官方文档提到的svn管理代码。 使用github管理代码,saecloud上传代码。
首先申请一个微信公众号,普通的订阅号做测试足够了。 在服务器配置选项中,有一个token设置,记住这个字符串后续在验证GET消息的时候需要使用。 如果你的代码是拷贝的网上的代码,也记得修改这个token。 另外GET请求的签名校验不是必须,也可以直接返回echostr.
现在有很多开源的微信后台管理框架,我比较了下,这两个比较靠谱: 这个主要是提供了各种微信接口操作的简单封装,使用的时候需要自己手动写一些赋值和返回接口的代码,可以比较方便的嵌入自己的代码。 https://github.com/doraemonext/wechat-python-sdk 这个功能更完全一些: https://github.com/whtsky/WeRoBot/ 我选择的比较灵活的第一种。
第三方库的使用 github库目录是:niubility SAE应用目录是:freesz 我安装的wechat_sdk niubility/freesz/site-packages/wechat_sdk saecloud会把site-packages中间的第三方库上传至sae。
返回一个POST消息的时候,需要填写fromuser和touser 很多教程会提示你,返回消息要交换这两个值,你才能收到请求. wechat_sdk内部帮你做了交换,不需要你手工填写了,否则会出现收不到的问题。
按照sae的官方文档创建好一个python应用。 如果你是初次使用SAE,尽快通过开发者认证。如果没有通过认证,你的HTTP GET请求会附加一个类似“请通过实名认证”之类的消息。这个附加选项会让你在用作微信后台签名认证的时候无法成功。
python应用中自带了很多框架,这里选用了最精简易懂的bottle框架。 当然,你可以把自己版本的bottle.py上传,这样可以本地与sae版本一致。
查看其setup.py,需要安装这些插件 'Werkzeug', 'pip', 'PyYAML', 'argparse',
# XXX: The latest grizzled-python package is broken
'grizzled-python==1.0.1',
'sqlcmd',
'prettytable',
有很多无法pip自动安装,需要手动下载以后安装, 'grizzled-python==1.0.1' 这个的版本还必须是对应的版本,新版本是不行的。
在本地运行OK的代码上传是SAE以后发现报错,无法导入requests.
用saecloud安装: saecloud install requests saecloud提示安装成功,但是site-packages下依然没有 niubility/freesz/site-packages/requests 后面手动拷贝至该目录,上传解决。
任性的print,可以在SAE的日志debug中查看
使用curl发送GET和POST请求测试 curl -V POST curl freesz.sinaapp.com/?echostr=test