前言

最近有微信公众号开发的业务,以前没有用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. J2EE十三种技术规范介绍

    J2EE的十三个技术规范 J2EE体系结构 一.JDBC:Java Data Base Connectivity,数据库连接 我们大家对微软公司的ODBC数据库访问接口比较熟悉,而在Java中创建数据 ...

  2. php简易配置函数

    nilcms中:php简易配置函数. 文件位置:nc-admin/common.php /* * --------------------------------------------------- ...

  3. bzoj2013[CEOI2010] A huge tower

    题意 有N(2<=N<=620000)快砖,要搭一个N层的塔,要求:如果砖A恰好在砖B上面,那么A不能比B的长度+D要长.问有几种方法,输出 答案 mod 1000000009的值 分析 ...

  4. 【CF954I】Yet Another String Matching Problem(FFT)

    [CF954I]Yet Another String Matching Problem(FFT) 题面 给定两个字符串\(S,T\) 求\(S\)所有长度为\(|T|\)的子串与\(T\)的距离 两个 ...

  5. 网络编程----socket介绍、基于tcp协议的套接字实现、基于udp协议的套接字实现

    一.客户端/服务器架构(C/S架构)                                                即C/S架构,包括: 1.硬件C/S架构(打印机) 2.软件C/S架 ...

  6. C++之高级编程20170914

    /*************************************************************************************************** ...

  7. 图像RGB格式与YUV格式互转

    // rgb2yuv.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #define Level 256 //直方图bin数 #define ...

  8. Canny边缘检测算法原理及其VC实现详解(二)

    转自:http://blog.csdn.net/likezhaobin/article/details/6892629 3.  Canny算法的实现流程 由于本文主要目的在于学习和实现算法,而对于图像 ...

  9. 洛谷P2563 [AHOI2001]质数和分解

    题目描述 任何大于 1 的自然数 n 都可以写成若干个大于等于 2 且小于等于 n 的质数之和表达式(包括只有一个数构成的和表达式的情况),并且可能有不止一种质数和的形式.例如,9 的质数和表达式就有 ...

  10. sklearn中的model_selection模块(1)

    sklearn作为Python的强大机器学习包,model_selection模块是其重要的一个模块: 1.model_selection.cross_validation: (1)分数,和交叉验证分 ...