利用SAE搭建微信公众平台(一)web.py实现的SAE hello world

微信在国内已经越来越火了,特别是有了公众平台之后,出现了很多好玩的聊天机器人。比如武大助手,号称在24小时只能搭建完成。给了同学们很多方便。

最近在TEDxFactory798从事志愿者工作,负责技术部分。因为工作需要而想到了搭建TEDxFactory798的微信平台,而SAE(Sina App Engine)是国内最早开始提供云服务的平台之一,而且几乎是免费的。所以希望能够通过SAE平台快速的搭建好一个微信公众账号。在一边摸索一边学习的情况下,小半天就搭好了一个简易的微信公众平台。

首先注册微信公众账号:http://mp.weixin.qq.com,点击注册,通过很简单的几步就能快速注册好公众账号,需要注意的是这里是需要注册一个新的微信号,而不是通过已有的私人微信号绑定。可能需要注册一个专用的邮箱。注册过程很简单,不赘述。

第二步是注册SAE,访问http://sae.sina.com.cn,SAE整个的文档都比较完整,很好上手。注册完成后会送500云豆,合人民币5元。再申请实名认证,送云豆2000。对于一个刚上手的开发者来说完全够了。等应用开发好后,还可以申请开发者认证。每月有固定额度的云豆赠送,基本就不用花钱了。另外还有教育机构认证,公益组织认证等。同样十分简单,不赘述。

第三步,登录公众平台后,点击高级功能。首先要关闭编辑模式,才能进入开发模式。(可以先不关闭, 等自己的服务器假设好之后再关闭)。阅读微信公众平台文档:http://mp.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5。我们看到需要提供一个接入信息:

接口配置

接口配置

那么我们需要一个网址作为接口,Token呢,就是相当于我们和微信之间约定的“密码”,以验证是微信平台的访问。再阅读接下来的要求:

网址接入

公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:

参数 描述
signature 微信加密签名
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。

signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。

加密/校验流程:
1. 将token、timestamp、nonce三个参数进行字典序排序
2. 将三个参数字符串拼接成一个字符串进行sha1加密
3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

那么很明确我们接下来需要做的事情了:为微信提供一个接口。

第四步:在SAE上创建一个应用。在我的应用中点击创建应用:

创建应用

创建应用

填好二级域名和应用名称等,选择好语言。这里我们使用Python开发选择web应用。创建好应用之后,在代码管理中创建一个新的版本。而后我们可以选择编辑代码。能够实现在线编辑,根本用不着配置本地环境,SVN等等。当然如果你觉得需要也可以根据文档配置本地环境开发。:

代码管理

代码管理

代码编辑页

代码编辑页

那么下一步我们就要开始Hello World了。

第五步:编写Hello World。

我们这里选择web.py框架编写网页应用。该框架非常小,学习代价很低。有中文文档:http://webpy.org/cookbook/index.zh-cn。SAE平台有两个很重要的文件,一个是config.yaml,是应用的配置文件,另一个是index.wsgi,是应用的入口文件。这两个文件在创建应用的时候就已经生成了。现在打开config.yaml文件,修改为:

[code]

name: youappnapp
version: 1
libraries:
– name: webpy
version: "0.36"
[/code]

name为你的应用名,版本为1,库应用webpy,这个是SAE预装的库。预装版本为0.36。我们也就使用0.36版。修改完成后使用Ctrl+S保存,这个细节做得很好,和本地保存一样,非常方便,当然也可以使用右上角的全部保存按钮。

接下来打开index.wsgi文件,修改如下(与官方文档的hello world略有不同):

[python]
# coding: UTF-8
import os

import sae
import web

urls = (
‘/’, ‘Hello’
)

app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, ‘templates’)
render = web.template.render(templates_root)

class Hello:
def GET(self):
return render.hello("你好")

app = web.application(urls, globals()).wsgifunc()

application = sae.create_wsgi_app(app)
[/python]

这里的coding:UTF-8告诉python文件的编码是UTF-8,对于带中文的应用来说必不可少。简单解释一下,最下面显而易见的是应用的入口,那么url配置到我们用那个类来实现路由,比如上述代码中的url是指根目录用Hello类来处理。在类中实现GET和POST方法就能处理相应的http请求。还需要注意到的是有个templates目录,在其中有个hello.html文件来实现模板。模板参数传递进一个”你好”。具体可见webpy教程。

接下来我们点击左上角的创建目录,创建一个叫做templates的目录,双击进入目录,再创建一个叫做hello.html的文件。代码如下:

[html]
$def with (name)
Hello $name!
[/html]

即定义一个name的参数(就是我们传进来的“你好”),在模板中任意地方引用$name就会被参数替代掉。

至此,Hello World已经写完了。访问应用根目录就能看到:

Hello 你好

的页面了。

待续。

下一篇文章:利用SAE搭建微信公众平台(二)