本系列文章均为A2BGeek原创,转载务必在明显处注明:
转载自A2BGeek的【微信易信公众平台开发】系列,原文链接:http://blog.csdn.net/a2bgeek/article/details/17250383
我的个人博客站点已经开通,会有技术分享和其他一些有意思的东西,希望读者能去访问一下,网址是http://a2bgeek.me
我把微信/易信的公众号看成一个APP内的轻量级APP(此时可以把微信/易信看成是应用商店),为什么这么说呢?因为有很多日常生活需要的服务都能在公众号中得到,比如查询天气、查询快递、办理银行业务、办理手机业务等,再加上现在有了自定义菜单,俨然已经成为了一个APP,但是这种APP是有局限性的,其一是这种APP只是一个I/O型的APP,即用户输入然后得到一个输出;其二是交互方式比较单调,除了I/O就是跳转到网页,只能在网页上想想有什么好的交互方式了。
编辑模式与开发模式的区别
玩公众平台开发首先要明白“编辑模式”(易信中叫做“自动回复”)和“开发者模式”的区别,下面两张图可以清楚地看到区别:
在编辑模式下,用户在公众号内的输入被发送到微信服务器上,微信服务器根据预先设置的“消息自动回复”、“关键词自动回复”把消息发回给客户端。
在开发模式下,用户的输入首先发送到微信服务器上,微信服务器把消息转发给开发者的服务器,开发者的服务器处理之后给微信服务器发消息,微信服务器再把消息转发给客户端。微信服务器在某种意义上成了一个代理服务器,不过有个特殊的限制就是开发者服务器在收到消息后必须在5s内给微信服务器发消息,否则微信服务器不会接受此次返回的消息。
成为开发者
这部分大概说一下就可以了,首先你要注册公众平台的账号,微信的是https://mp.weixin.qq.com,易信的是https://plus.yixin.im/,然后登录,然后在“高级功能”中会看到有“编辑模式”/“自动回复”和“开发模式”,微信和易信都是同时不能开启两种模式,需要先关闭“编辑模式”/“自动回复”,然后打开“开发模式”,这时会提示申请成为开发者,申请一下就行了,审核大概半天时间。
开启开发者模式
如上图所示,开发模式需要开发者有一个个人的服务器,不过对于大多数开发者来说弄一个服务器有点奢侈,还好我们已经进入了所谓的云计算时代,有土豪已经为我们搭好了服务器,你可以随便选择一个ae,比如gae、bae、sae等等。我个人的习惯是用bae,用git克隆一个版本到电脑上,写好了再push上去。这里就不介绍云引擎的用法了,不会的读者可以花上一点儿时间玩一玩,很好上手。
在有了个人服务器之后,你需要做的就是“网址接入”,接入后微信/易信服务器就能和你的个人服务器通信了。
如图,当你填写上URL和Token后,点击“提交验证”的按钮后,微信/易信服务器会发送GET请求到你的服务器上,如果有对HTTP不熟悉的朋友,可以看我的这篇博客http://blog.csdn.net/a2bgeek/article/details/11580395,GET请求的参数分别是:
参数 | 描述 |
---|---|
signature | 易信加密签名 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验,校验方式如下:
加密/校验流程: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信/易信
若确认此次GET请求来自微信/易信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
下面上代码,服务器端我使用的是Tornado框架:
from bae.api import logging
import tornado.wsgi
import hashlib
class MainHandler(tornado.web.RequestHandler):
def get(self):
signature = self.get_argument('signature')
timestamp = self.get_argument('timestamp')
nonce = self.get_argument('nonce')
echostr = self.get_argument('echostr')
if checksignature(signature, timestamp, nonce):
logging.info('return echostr')
self.write(echostr)
else:
logging.info('return fail')
self.write('fail')
app = tornado.wsgi.WSGIApplication([
(r"/", MainHandler),
])
from bae.core.wsgi import WSGIApplication
application = WSGIApplication(app)
def checksignature(signature, timestamp, nonce):
args = []
args.append("XXXXXXXX")
args.append(timestamp)
args.append(nonce)
args.sort()
mysig = hashlib.sha1(''.join(args)).hexdigest()
logging.info('mysig is %s' % mysig)
return mysig == signature
代码中我自己的Token用XXXXXXX代替了。
好了今天就到这里,下一篇将讲解一个非常给力的功能——如何生成自定义菜单。