一、在官网申请账号
申请官网
注意:一个邮箱、一个身份证只能注册一个。
二、安装运行 python 测试
- 一般 python 在服务器上都是预装好的。
- 安装 web 包
sudo python -m pip install web.py
- 编写服务器 python 代码
# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle
urls = (
'/wx', 'Handle',
)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
- 运行服务器 web 程序
sudo python main.py 80
-
浏览器 web 访问
三、服务器代码运行
- 重写main函数如下:
# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle
urls = (
'/wx', 'Handle',
)
if __name__ == '__main__':
app = web.application(urls, globals())
app.run()
- 写服务处理函数 handle.py
其实如果只是想通过校正的话,返回data.echostr即可,中间token的hash只是为了验证确实微信发出
# -*- coding: utf-8 -*-
# filename: handle.py
import hashlib
import web
class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "hello2021" #请按照公众平台官网\基本配置中信息填写
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update("".join(list).encode('utf-8'))
hashcode = sha1.hexdigest()
print("handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return ""
except Exception as Argument:
return Argument
- 运行
sudo python main.py 80
微信网页的基本配置中,点击提交。验证成功。
四、日志分析
日志来源:C语言搭的服务器,把收发的消息全打出来了。
1.微信验证服务器时,微信通过socket发给服务器的信息,其中signature、echostr等的信息隐去。
GET /wx?signature=******&echostr=******×tamp=1626511955&nonce=1219627732 HTTP/1.0
User-Agent: Mozilla/4.0
Host: 1.13.14.226
Accept: */*
Pragma:no-cache
// 以两个\r\n\r\n结尾
- 微信验证服务器时,服务器通过socket给微信回的信息,其中echostr等的信息隐去,13是echostr的长度。
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 17 Jul 2021 16:52:35 GMT
Server: localhost
13
******
0
// 以两个\r\n\r\n结尾
3、当用户向微信公众号发送 “你好” 时,微信给服务器发过来的消息是:
POST /wx?signature=******×tamp=1626513248&nonce=1982032182&openid=****** HTTP/1.1
User-Agent: Mozilla/4.0
Accept: */*
Host: 1.13.14.226
Pragma: no-cache
Content-Length: 277
Content-Type: text/xml
// 以两个\r\n\r\n结尾,然后接着POST的内容。读取长度: Content-Length 。
<xml><ToUserName><![CDATA[******]]></ToUserName>
<FromUserName><![CDATA[******]]></FromUserName>
<CreateTime>1626513248</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
<MsgId>23286067514628707</MsgId>
4、服务器向微信回的消息。
HTTP/1.1 200 OK
Transfer-Encoding: chunked
Date: Sat, 17 Jul 2021 17:14:08 GMT
Server: localhost
// 以两个\r\n\r\n 隔开
101
<xml><ToUserName><![CDATA[******]]></ToUserName><FromUserName><![CDATA[******]]></FromUserName><CreateTime>1626513248</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[2021-07-17: 你好 0.0]]></Content></xml>
0
// 以两个\r\n\r\n结尾