使用flask搭建微信公众号:接收与回复消息
token验证的意义
在看了别人的代码之后对token加密有了些理解了。但又觉得很鸡肋。第一次验证服务器的时候我在那弄了半天的验证其实不写也可以验证成功,只要直接返回echostr这个字段就行了。微信的服务器只检查我的服务器返回的值和他想要的值是否一样,来判断是否验证成功,但是验证的过程是我在自己的服务器上做的,我可以不验证,直接返回他想要的值。虽然这样违背安全的目的。
微信这个token验证应该不只是第一次验证服务器时要用,应该是每次接收消息都要验证是不是从微信服务器发送过来的。第一次是get的请求,接收消息是post的请求。但无论是哪种,都会是一get的形式和url来访问。所以哪怕是接收消息,也应该是验证是否是微信服务器所发送来的。

接收和发送消息
通过判断是get还是post来分辨是第一次验证还是接收的消息。如果时post就解析发送过来的信息的xml(这里用到了xmltodict这个包,后续学一下)。
xml消息的结构如下:
<xml>
<ToUserName><![CDATA[gh_866835093fea]]></ToUserName>
<FromUserName><![CDATA[ogdotwSc_MmEEsJs9-ABZ1QL_4r4]]></FromUserName>
<CreateTime>1478317060</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
<MsgId>6349323426230210995</MsgId>
</xml>
解析post包可以获得用户发送过来的消息,而对post包的返回值就是微信公众号对用户的回复,同样时xml形式。发来的消息有不通的type,可以采取不同的回复形式等等。
以下是学习别人代码后,我写的代码。其中对于用户发送的消息没有进行token的验证,只是学习收发消息,没有写那么严密。
from flask import Flask,request
import hashlib
import xmltodict
import time app = Flask(__name__) @app.route('/wx', methods=["GET", "POST"])
def getinput():
if (request.method == "GET"):
# 表示是第一次接入微信服务器的验证
signature=request.args.get('signature')
timestamp=request.args.get('timestamp')
nonce=request.args.get('nonce')
token = "maluguang"
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
sha1.update(list[0].encode('utf-8'))
sha1.update(list[1].encode('utf-8'))
sha1.update(list[2].encode('utf-8'))
hashcode = sha1.hexdigest()
echostr = request.args.get("echostr")
if hashcode == signature:
return echostr
else:
return ""
elif request.method == "POST":
# 表示微信服务器转发消息过来
xml_str = request.data
if not xml_str:
return""
# 对xml字符串进行解析
xml_dict = xmltodict.parse(xml_str)
xml_dict = xml_dict.get("xml") # 提取消息类型
msg_type = xml_dict.get("MsgType")
if msg_type == "text":
# 表示发送的是文本消息
# 构造返回值,经由微信服务器回复给用户的消息内容
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": "you say:" + xml_dict.get("Content")
}
} # 将字典转换为xml字符串
resp_xml_str = xmltodict.unparse(resp_dict)
# 返回消息数据给微信服务器
return resp_xml_str
else:
resp_dict = {
"xml": {
"ToUserName": xml_dict.get("FromUserName"),
"FromUserName": xml_dict.get("ToUserName"),
"CreateTime": int(time.time()),
"MsgType": "text",
"Content": "Dear I Love you so much"
}
}
resp_xml_str = xmltodict.unparse(resp_dict)
# 返回消息数据给微信服务器
return resp_xml_str
if __name__ == '__main__':
app.run(port='')
参考文章:
使用flask搭建微信公众号:接收与回复消息的更多相关文章
- 使用flask搭建微信公众号:实现签到功能
		终于到了实战阶段.用微信公众号实现一个简单的签到功能. 前情提要: 微信公众号token验证失败 使用flask搭建微信公众号:完成token的验证 使用flask搭建微信公众号:接收与回复消息 程序 ... 
- 使用flask搭建微信公众号:完成token的验证
		上一篇文章讨论了官方给的例子验证token失败的解决方法:微信公众号token验证失败 想了一下,还是决定不适用web.py这个框架.因为搜了一下他的中文文档不多,学起来可能会有点麻烦.而且看着他没有 ... 
- 微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription is canceled hint:解决办法【已解决】
		微信公众号发送客服消息提示errcode":45015,"errmsg":"response out of time limit or subscription ... 
- flask开发微信公众号
		1.进入微信公众号首页,进行注册登录 https://mp.weixin.qq.com/ 2.进入个人首页,进行公众号设置 可参照 公众号文档 进行开发 开发前 先阅读 接口权限列表 3.配置服务器 ... 
- 在新浪SAE上搭建微信公众号的python应用
		微信公众平台的开发者文档https://www.w3cschool.cn/weixinkaifawendang/ python,flask,SAE(新浪云),搭建开发微信公众账号http://www. ... 
- 使用python django快速搭建微信公众号后台
		前言 使用python语言,django web框架,以及wechatpy,快速完成微信公众号后台服务的简易搭建,做记录于此. wechatpy是一个python的微信公众平台sdk,封装了被动消息和 ... 
- 微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行
		使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架 需求:在微信公众号开发时,需要实现自动回复,即被关注回复.收到消息回复.关键词回复 发现问题: ... 
- Java微信公众号开发----关键字自动回复消息
		在配置好开发者配置后,本人第一个想要实现的是自动回复消息的功能,说明以下几点: 1. url 仍然不变,还是开发配置里的url 2. 微信采用 xml 格式传输数据 3.微信服务器传给我们的参数主要有 ... 
- 解决升级PHP7后 微信公众号收不到消息
		服务器配置Linux+Nginx+PHP5.5+mysql index方法配置微信的关注回复.菜单事件.多客服.自动回复等 public function actionIndex() { if (is ... 
随机推荐
- Nodejs接收图片base64格式保存为文件
			base64的形式为“data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0....”:当接收到上边的内容后,需要将data ... 
- Tomcat 的端口被占用的解决办法
			在dos下,输入 netstat -ano|findstr 8080 //说明:查看占用8080端口的进程 显示占用端口的进程 taskkill /pid 6856 /f //说明,运行 ... 
- Linux内核中的双向链表struct list_head
			一.双向链表list_head Linux内核驱动开发会经常用到Linux内核中经典的双向链表list_head,以及它的拓展接口和宏定义:list_add.list_add_tail.list_de ... 
- 引用类型前需要加ref?
			方法的参数前加ref代表的是传的参数的地址,值类型前加ref的作用相当于把这个值类型当成引用类型在用,那引用类型作为参数有一种情况也需要加ref,不然得到的值会有差. 不加ref: class Pro ... 
- Pycharm新建文件css文件无后缀,html中无法正确引入
			使用pycharm新建了一个文件mycss,然后选择文件类型是css,显示也正常,但是在页面中使用link引入始终无法生效.后来加了后缀名.css,发现可以正常显示样式了,所以新建文件时最好就加上后缀 ... 
- 【剑指offer】数组中只出现一次的数
			题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 经典的异或技巧题 两个相同的数字异或的结果为0,一个数和0异或的结果是其本身,假设现在那 ... 
- DatabaseGeneratedOption
			[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 添加时 获取值 自增 默认值,,后期无法修改如:Id(AUTO_INCREMENT, ... 
- Resouce Pool的理解
			本篇文章从现象到本质再到具象去理解 , 从理论到实战再到源码回顾去深化. 1.在开发中,无处不在的池. eg 网络通信连接池: HttpClient连接池 HttpClient通过PoolingHtt ... 
- Python之路【第二十七篇】:web服务器django
			Django 一.web框架 框架,即时framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单的说,就是用别人搭建好的舞台来表演你的才艺 ... 
- S02_CH12_ AXI_Lite 总线详解
			S02_CH12_ AXI_Lite 总线详解 12.1前言 ZYNQ拥有ARM+FPGA这个神奇的架构,那么ARM和FPGA究竟是如何进行通信的呢?本章通过剖析AXI总线源码,来一探其中的秘密. 1 ... 
