前言

最近有微信公众号开发的业务,以前没有用python做过微信公众号开发,记录一下自己的学习和开发历程,共勉!

公众号类型

  • 订阅号

  • 普通订阅号

  • 认证订阅号

  • 服务号

  • 普通服务号

  • 认证服务号

服务方式

  • 公众号消息会话:包括被动回复

  • 公众号内嵌网页

公众号消息类型

  • 群发消息:由公众号想用户发送消息;

  • 被动回复消息:客户端发送消息,公众号回复;

  • 客服消息:当用户主动发消息给公众号,公众号48小时里可以无限发送消息;

  • 模板消息:使用特定的模板内容主动向用户发送消息;

公众号的网页接口

  • 接口1:

  • 网页被授权获取用户的基本信息,由微信提供接口;

  • 接口2:

  • 微型JS-SDK,用js代码使用原生的微信工具包;

微信公众号开发

先注册一个微信公众号

1.公众号类型一旦被选择就无法更改;

对接微信公众平台

  • 填写服务器配置

  • URL:可以是域名网址或直接的ip加端口;http必须为80端口,https必须为443端口;

  • Token: 生成签名,微信服务器用来识别公众号服务器;

  • EncodingAESKey:设置消息加解密密匙;

  • 验证服务器地址的有效性

  • 开发者必须自己架设服务器,当填写URL提交后,微信服务器会发送get请求到开发者的服务器,携带四个参数,自定义返回echostr参数;

  • 校验流程:

将token、timestamp、nonce三个参数进行字典序排序

将三个参数字符串拼接成一个字符串进行sha1加密

开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

  • 校验的经典代码,适用于Django、Flask、web.py等框架;
import hashlib
# 在视图函数中
def handle(request):
try:
# 先获取request
# data = web.input()
# if len(data) == 0:
# return "hello, this is handle view"
signature = request.get("signature") # 先获取加密签名
timestamp = data.timestamp # 获取时间戳
nonce = request.get("nonece") # 获取随机数
echostr = request.get("echostr") # 获取随机字符串
token = "xxxx" #自己设置的token
# 使用字典序排序(按照字母或数字的大小顺序进行排序)
list = [token, timestamp, nonce]
list.sort() # 进行sha1加密
temp = ''.join(list)
sha1 = hashlib.sha1(temp.encode('utf-8))
# map(sha1.update, list)
hashcode = sha1.hexdigest() # 将加密后的字符串和signatrue对比,如果相同返回echostr,表示验证成功
if hashcode == signature:
return echostr
else:
return ""
except Exception as e:
return e
  • 也可以通过第三方包wechatpy实现
from wechatpy.utils import check_signature
from flask import Flask app = Flask(__name__) def get_all_args(req_dict:Dict):
echostr = req_dict.get("echostr") # 获取随机字符串
signature = req_dict.get("signature") # 先获取加密签名
timestamp = req_dict.get("timestamp") # 获取时间戳
nonce = req_dict.get("nonce") # 获取随机数
return echostr,signature,timestamp,nonce @app.route('/wechat_verify/',methods=['GET'])
def wechat_verify():
'''
用来处理微信服务器对本后台的验证,GET方法。
:return:
'''
# 获取参数
rq_dict = request.args
if len(rq_dict) == 0:
return ""
tuple_args = get_all_args(rq_dict)
token = current_app.config.get('TOKEN')
try:
check_signature(token, tuple_args[1], tuple_args[2], tuple_args[3])
except InvalidSignatureException as e:
logger.error(e,exc_info=True)
return ''
else:
return tuple_args[0]
  • 根据接口实现业务逻辑

  • 业务1:接收回复普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,这时我们的公众号将覆盖微信提供的自动回复的功能;

  • 微信消息的通信使用的是XMl的数据格式,在python中使用xmltodict模块处理xml的数据;主要有两个方法:
xmltodict.parse():可以将xml数据转为python中的dict字典数据;
xmltodict.unparse():可以将字典转换为xml字符串
  1. 文本消息
# 一般也有固定的格式

<xml>
<ToUserName><![CDATA[公众号]]></ToUserName> # 开发者微信号
<FromUserName><![CDATA[粉丝号]]></FromUserName> # 发送方微信号
<CreateTime>1460537339</CreateTime> # 消息的创建时间
<MsgType><![CDATA[text]]></MsgType> # 文本的格式
<Content><![CDATA[欢迎开启公众号开发者模式]]></Content> # 内容
<MsgId>6272960105994287618</MsgId> # 消息本身的id
</xml>
  1. 回复文本
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName> # 接收方账号
<FromUserName><![CDATA[fromUser]]></FromUserName> # 开发者账号
<CreateTime>12345678</CreateTime> # 创建时间
<MsgType><![CDATA[text]]></MsgType> # 文本类型
<Content><![CDATA[你好]]></Content> # 文本内容
</xml>
  • 图片消息
<MsgType><![CDATA[image]]></MsgType>  # 图片的类型为image
<PicUrl><![CDATA[this is a url]]></PicUrl> # 图片链接
<MediaId><![CDATA[media_id]]></MediaId> # 图片消息id
  • 视频消息
<MsgType><![CDATA[video]]></MsgType> # 视频类型为video,小视频为shortvideo
  • 语音消息
<MsgType><![CDATA[voice]]></MsgType>  # 语音格式
<MediaId><![CDATA[media_id]]></MediaId> # 消息id
<Format><![CDATA[Format]]></Format> # 语音格式,如amr

视图处理原则

  • 可以将普通的消息处理放置在一个视图中,在一个视图中进行判断处理,减少视图的数量。

  • 如果不能再5秒内及时返回,可以先返回成功或空字符串,避免出现严重的错误。

实现内嵌网页

分成三步走:

  1. 第一步:用户同意授权,获取code,code指的是用户的授权书;这时有微信发起的;
  2. 第二步:通过code换取网页授权access_token,这时微信发下的通信证;
  3. 第三步:拉取用户信息(需scope为 snsapi_userinfo);
  • 设置网页授权回调域名

注意

  • 填写的是域名,而不是URL,所以不需要添加http://等;

  • 可以填写IP和端口;

相关文档

总结:本篇博客是对开发微信公众号的一些整体需要做的准备工作和整体的认识,下一篇开始正式开发。

python之微信公众号开发(基本配置和校验)的更多相关文章

  1. 3.微信公众号开发:配置与微信公众平台服务器交互的URL接口地址

    微信开发基本原理: 1.首先有3个对象 分别是微信用户端 微信公众平台服务器 开发者服务器(也就是放自己代码的服务器) 三者间互相交互 2.微信公众平台服务器 充当中间者角色 (以被动回复消息为例) ...

  2. 细数Python Flask微信公众号开发中遇到的那些坑

    最近两三个月的时间,断断续续边学边做完成了一个微信公众号页面的开发工作.这是一个快递系统,主要功能有用户管理.寄收件地址管理.用户下单,订单管理,订单查询及一些宣传页面等.本文主要细数下开发过程中遇到 ...

  3. Python webpy微信公众号开发之 回复图文消息

    新建图文回复模板reply_pictext.xml: $def with (toUser,fromUser,createTime,title1,description1,picurl1,url1)&l ...

  4. java开发微信公众号----开发者基本配置的

    首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 本文主要描 ...

  5. 微信公众号开发(一)--验证服务器地址的Java实现

    现在主流上都用php写微信公众号后台,其实作为后端语言之一的java也可以实现. 这篇文章将对验证服务器地址这一步做出实现. 参考资料:1.慕课网-<初识java微信公众号开发>,2.微信 ...

  6. C#微信公众号开发系列教程二(新手接入指南)

    http://www.cnblogs.com/zskbll/p/4093954.html 此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可 ...

  7. 微信公众号开发系列教程一(调试环境部署续:vs远程调试)

    http://www.cnblogs.com/zskbll/p/4080328.html 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试 ...

  8. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  9. .NET开发者如何愉快的进行微信公众号开发

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:这篇文章只是一个如何提高开发效率的简单指导和记录,不会涉及具体的微信公众号开发内容. ...

随机推荐

  1. 【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径

    1.c#根据绝对路径获取 带后缀文件名.后缀名.文件名.   1 string str =" F:\test\Default.aspx"; 2 string filename = ...

  2. bzoj4484[JSOI2015]最小表示

    题意 给出一张DAG,要求删除尽量多的边使得连通性不变.(即:若删边前u到v有路径,则删边后仍有路径).点数30000,边数100000. 分析 如果从u到v有(u,v)这条边,且从u到v只有这一条路 ...

  3. var和let使用上的对比

    var和let比较 1. let没有预解析,不存在变量提升.在代码块中,只要let定义变量,在之前使用,都是报错.先定义完再使用. let a = 12; function fn(){ alert(a ...

  4. (转)Spring用代码来读取properties文件

    转至http://www.cnblogs.com/Gyoung/p/5507063.html 我们都知道,Spring可以@Value的方式读取properties中的值,只需要在配置文件中配置org ...

  5. Windows与VMware中的CentOS系统互通访问

    [步骤01]设置 CentOS 虚拟机-网络适配器为“桥接模式(直接连接物理网络),复制物理网络连接状态” [步骤02]配置虚拟网卡 [步骤03]配置 CentOS 网络 [步骤04]测试 windo ...

  6. A Magic Lamp HDU - 3183(RMQ返回下标)

    原文地址:https://blog.csdn.net/acdreamers/article/details/8692384 题意: 对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的 ...

  7. Golden Tiger Claw UVA - 11383(km原理)

    这题使我对km多了一些看法 写给自己看.. km结束后bx[i] + by[j] == w[i][j], 所以所有bx与by的和即为w的和 而且记住bx[i] + by[j] >= w[i][j ...

  8. Java导出数据行写入到Excel表格:基于Apache POI

    Java导出数据行写入到Excel表格:基于Apache POI import java.io.File; import java.io.FileOutputStream; import org.ap ...

  9. 洛谷 P1013 进制位 【搜索 + 进制运算】

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: + L K V E L L K V E K K V E KL V V E KL KK E E ...

  10. tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现

    tomcat7.x远程命令执行(CVE-2017-12615)漏洞漏洞复现 一.漏洞前言 2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017 ...