1. 为什么学习Pythone
最近一段时间一直在研究一个项目,想进行市场化。如果直接开发软件的话感觉难度太大,但是如果是开发一个微信公众号,感觉难度小一些,刚好自己有一个订阅号,也已经通过了实名认证。就想说先拿这个微信号练练手,看自己一个人能开发到什么程度。于是说干就干了。
2.前期准备工作
2.1云平台选择
现在网络程序开发比以前好太多了,有很多的云平台可以选择。不像10年前,想开展一个网络服务首先就要考虑服务器、带宽、IP地址等等。这些云平台都包含了。我知道的国内的云平台就只有阿里云和新浪云,两个都去看了看,感觉新浪云的界面简单些,于是就充值了100元,开始在新浪云部署服务了。 步骤如下
1.新浪云申请账号
新浪云的账号是和新浪微博关联的,只要有微博账号就可以登陆了。
创建一个Python应用。
2.学会GIT 命令
新浪云上的Python只能使用GIT和SVN两种方式上传代码,我两种都不会,但是GIT好像名气大一点,就选择了GIT方式。
不得不说,GIT的入门还是有一定的门槛的,反正一开始是把我弄得晕头转向。这里总结一下大概的步骤
1.下载安装Git软件,官网上下载,具体步骤就不说了。
2.在电脑上建立文件夹,作为代码仓库。
3.进入文件夹,右击鼠标,选择 Git Bash Here,进入Git 命令行界面。
git init #初始化当前文件夹为仓库
git remote add sae https://sae.sinacloud.com/'你的应用名'
git add . #.代表所有文件,也可以输入具体文件名
git commit -am"这里是注释"
git push sae master:1 #代表把本地master分支的代码,push到远端sae库的版本1上
基本上熟悉以后就只用add,commit push 三个命令了,还是挺方便的。
”最好固定一个终端进行开发,换终端需要用git clone 命令先将远端的文件克隆过来, 再进行修改上传
3.Python 开发
3.1 Python 基础
我之前一点都没学过,买过一本老外写的书,翻译的也挺晦涩,不太好懂。网络上的教程很多,我推荐廖雪峰的Python3教程,写的深入浅出,一开始简单的语句还有在线助手可以进行测试。
3.2 了解微信公众号接口规则
3.2.1 公众号接口配置
url 就是在新浪云上申请的应用地址
token 自己设置,相当于验证的口令
解密方式选择明文
3.2.2 公众号接口通信原理
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
微信自带了一段php代码:
private function checkSignature()
{
$signature = $_GET["signature"];
$timestamp = $_GET["timestamp"];
$nonce = $_GET["nonce"];
$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );
if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
不过这段代码有点坑,因为根据我的实测,最后返回的是字符,不是布尔值。这里我主要参考了这篇文章。
最后的的编程结果如下
- config.yaml
name: qlife
version: 1
libraries:
- name: webpy
version: "0.36"- name: lxml
version: "2.3.4"
- index.wsgi
# coding: UTF-8
import os
import sae
import web
from weixinInterface import WeixinInterface
urls = (
'/','WeixinInterface'
) #凡是调用qlife地址的,都转由微信接口处理
app_root = os.path.dirname(file)
templates_root = os.path.join(app_root, 'templates')
render = web.template.render(templates_root)
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)
-weixinInterface.py
# -- coding: utf-8 --
import hashlib
import web
import lxml
import time
import os
import urllib2,json
from lxml import etree
class WeixinInterface:
def GET(self):
data = web.input()
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
token = 'qlife'
echostr = data.echostr
list = [token,timestamp,nonce]
list.sort()
list2 = ''.join(list)
sha1 = hashlib.sha1()
sha1.update(list2.encode('utf-8'))
hashcode = sha1.hexdigest()
if hashcode == signature:
return echostr
因为markdown编辑器的问题,以上代码的缩进有些问题,需要手动缩进。
提几个需要注意的点。
1.算hash的时候,需要加上encode方法 ,表明用utf-8,
2.字符串合并用.join