前言

最近有微信公众号开发的业务,以前没有用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. inno setup 打包exe程序

    inno setup 用于打包生成安装程序, 是通过的一个脚本 可以将 exe 执行文件以安装的形式,解压,添加依赖,创建快捷方式. 例如,我们写了个winform,我们怎么通过安装的形式,给客户的机 ...

  2. 一个Vue实例-添加、显示列表、删除

    <link href="~/Content/css/bootstrap-theme.min.css" rel="stylesheet" /> < ...

  3. 转---秒杀多线程第五篇 经典线程同步 关键段CS

    上一篇<秒杀多线程第四篇 一个经典的多线程同步问题>提出了一个经典的多线程同步互斥问题,本篇将用关键段CRITICAL_SECTION来尝试解决这个问题. 本文首先介绍下如何使用关键段,然 ...

  4. 3.7 TCP拥塞控制

    3.7 TCP拥塞控制 在3.5.5流量控制中有,接收方通过维护一个rwnd来控制流量,本节中考虑三个问题: 第一,  一个TCP发送方如何限制它向其他连接发送流量的速率. 第二,  一个TCP发送方 ...

  5. NOIP2017 考前汇总

    时隔一年,相比去年一无所知的自己,学到了不少东西,虽然还是很弱,但也颇有收获[学会了打板QAQ] 现在是2017.11.9   21:10,NOIP2017的前两天晚上,明天就要出发,做最后的总结 N ...

  6. XSS/CSRF跨站攻击和防护方案

    Xss(Cross Site Scripting 跨站脚本攻击)/CSRF(Cross-site request forgery 跨站请求伪造),它与著名的SQL注入攻击类似,都是利用了Web页面的编 ...

  7. 扶苏的bitset浅谈

    bitset作为C++一个非常好用的STL,在一些题目中巧妙地使用会产生非常不错的效果.今天扶苏来分享一点bitset的基础语法和应用 本文同步发布于个人其他博客,同时作为P3674题解发布. 本文感 ...

  8. 链接错误 multiply defined (by misc_1.o and misc.o).

    http://www.stmcu.org/module/forum/thread-286128-1-1.html *** Using Compiler 'V5.06 (build 20)', fold ...

  9. FindBugs错误修改指南 【转】

    FindBugs错误修改指南 1. EC_UNRELATED_TYPES Bug: Call to equals() comparing different types Pattern id: EC_ ...

  10. VS集成opencv编译C++项目遇到的问题

    当我们新建一个c++项目的时候总是提示脚本错误的信息,虽然不影响使用,但是还是很烦躁,对于有强迫症的我来说,实在受不了,终于找到了解决方案 这个提示的路径根据大家自己安装vs的路径来查找: http: ...