前言

最近有微信公众号开发的业务,以前没有用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. 我为什么鼓励工程师写blog

    文/JoeyChen 工程师该怎样才能突破自己的能力瓶颈?写 blog! 工程师该怎样精进自己在职涯上所需要的能力?写 blog! 工程师该怎样才能保持学习与成长的动能?写 blog! 工程师该怎样才 ...

  2. 【bzoj3295】[Cqoi2011]动态逆序对 树套树 线段树套替罪羊树

    这个东西,关于某个数的逆序对数为在他之前比他大的在他之后比他小的数的数目的和,所以删除之前先把这个减去就好了 人傻自带超大常数,中间由于内存池开小了所以运行错误. #include<cstdio ...

  3. 基于ORM实现用户登录

    1. 与数据库中的数据进行比较,检验用户名和密码是否正确. 2. 拿到的是QuerySet类型,类似于一个列表.验证成功/失败,返回到不同的页面. u = request.POST.get('user ...

  4. CentOS 7下安装pptp服务端手记 ok

    主要配置步骤 1. 安装前检查系统支持 2. 安装必要包 3. 修改相关配置文件 4. 设置开机自动启动 pptpd, iptables 5. iptables配置网络 6. 阿里云ECS可能还需要几 ...

  5. Alpha 冲刺 —— 十分之二

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 协助前端界面的开发 搭建测试用服务器的环境 完成 ...

  6. Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python

    作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区 ...

  7. opencv查找轮廓---cvFindContours && cvDrawCountours 用法及例子

    http://blog.csdn.net/timidsmile/article/details/8519751 环境: vs2008 + opencv2.1 先看,这两个函数的用法(参考 opencv ...

  8. Codeforces Round #385 (Div. 2)A B C 模拟 水 并查集

    A. Hongcow Learns the Cyclic Shift time limit per test 2 seconds memory limit per test 256 megabytes ...

  9. 04-树5. File Transfer--并查集

    对于一个集合常见的操作有:判断一个元素是否属于一个集合:合并两个集合等等.而并查集是处理一些不相交集合(Disjoint Sets)的合并及查询问题的有利工具. 并查集是利用树结构实现的.一个集合用一 ...

  10. 进程间共享数据Manager

    一.前言 进程间的通信Queue()和Pipe(),可以实现进程间的数据传递.但是要使python进程间共享数据,我们就要使用multiprocessing.Manager. Manager()返回的 ...