[TOC]
1.背景
- 最近去聊一个代购平台的项目,经过一段时间的纠结以后,将平台现有的技术架构推翻掉、重来;
- 原本很复杂的O2O和app的入口,改成普通的微信平台入口,这样一来可以降低技术门槛,二来可以快速开发上线使用,对于项目成功实施比较有意义;
- 对于技术的选择再次回到了完全控制,这也很重要,要去维护一个外包公司以任务书为目标实现的东西,确实再辛苦不过了;
- 对于架构的重新设计让项目清晰、简单;
- 而不是为了让项目看起来高大上,做过度的设计。
- 微信开发,我们之前做过一些研究,但是有断时间没做,而且没有形成资料文档的内容,可能在技术上有荒废。重新上手需要些时间,所以再次来研究一次,并形成我们自己的研究内容积累下来。
2.问题
- 微信开发第一步:服务号申请
- 微信开发第二部:认证服务器
认证服务器就是在微信平台上登记我们自己服务程序运行的服务器信息,让微信把交互的消息推送到这个服务器的制定地址上来,然后我们再根据微信推送的消息内容进行后续的处理和反馈结果
所以从开发的角度来看,认证服务器就是我们进行开发的第一步。
3.分析
graph LR
微信平台-->服务器
服务器-->应用平台
应用平台-->微信平台
认证的流程
- 第一步,在微信服务器登记服务所在的地址 http://ip或域名/服务程序名, 比如 http://www.aopinjie.com/weixin
- 第二步,在自己的服务器上做一个程序,部署在80端口
- 第三步,认证的时候,微信服务器会发一个GET请求过来,我们需要把获取到的参数中一个回写的参数反馈给微信平台;
- 第四步,微信平台收到这个回写的字符串认为跟它发的一样,就可以完成认证。以后我们的代码只要是跑在这个服务器上的,应该都能在微信中得到推送消息。
微信官方给出的认证流程是:
1.将token、timestamp、nonce三个参数进行字典序排序
2.将三个参数字符串拼接成一个字符串进行sha1加密
3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
4.解决
根据分析的流程,我们还是使用web.py来构建我们的服务器认证的响应程序
我们还是这样的写法,这个是通用的以后再有类似的内容就不再加入这个内容了。
server.py
import web
from urls import Handlers
app = web.application(Handlers,globals(),autoreload = True)
if __name__ == "__main__":
print "Wechat Server is started......"
app.run()
url.py
#-*-coding:utf-8-*-
Handlers=(
"/echo","wechatEcho.List",
"/","wechatEcho.List",
)
wechatEcho.py
#coding:UTF-8
__author__ = 'pcode@163.com'
import hashlib
import web
class List:
def GET(self):
i = web.input() #获取输入参数
assert 'signature' in i.keys() , "Missing signature property"
assert 'timestamp' in i.keys() , "Missing signature timestamp"
assert 'nonce' in i.keys() , "Missing signature nonce"
assert 'echostr' in i.keys() , "Missing signature echostr"
signature = i.signature #获取签名
timestamp = i.timestamp #获取时间戳
nonce = i.nonce #获取随机数
echostr = i.echostr #回写字符串
token = "yourtoken" #微信平台提供的token,其实是自己录入的,为了显示高大上,还是搞复杂些吧。
list = [token,timestamp,nonce] #字典序排序
list.sort()
sha1 = hashlib.sha1() #使用sha1加密算法
map(sha1.update,list) #
hashcode = sha1.hexdigest() #验证签名
if hashcode == signature: #签名正确返回回写字符串
return echostr
5.备注
- 代码里增加了不少的断言,来确保参数正确;
- 代码里完整的做了一个认证数字签名串的过程,简单起见,也可以不验证,直接响应,但是为了确保来源的可靠性,一般做验证比较好。
- 在验证服务器的环节,微信会提交一些数据过来给我们的程序,特别注意token这个值,需要在微信平台自行设置,并且确保我们程序里面的token跟平台上设置的一样。