python 微信公众号开发[1] 后台服务器端配置与公众号开发配置
更新时间:2020年3月7日
微信公众号开发的硬件必备条件:(1)申请一个公众号 (2)有公网ip的服务器(最好是阿里云,腾讯云等的云服务器)(3)解析到(2)中服务器地址的域名(阿里云,腾讯云购买即可)。
1. 微信公众号申请
个人可申请订阅号,申请教程参考:https://jingyan.baidu.com/article/020278113d07531bcc9ce5a5.html
2. 后台服务器配置
微信公众号只是相当于流量转发,而具体功能的实现需要在后端服务器上去具体实现。而微信公众号开始只支持域名访问(不支持ip直接访问,这也是为什么要域名的原因),只支持80端口(http)或者443端口(https)
2.1 nginx的安装与配置
后端服务器需要有软件提供网页服务器功能,我们采用nginx,比较方便。
安装流程:
(1)安装gcc(使用gcc -v可以查看gcc是否安装):
yum -y install gcc
(2)安装依赖:
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
(3) 下载nginx
wget http://nginx.org/download/nginx-1.9.9.tar.gz
(4)解压与安装
tar -zxvf nginx-1.9.9.tar.gz
解压完成后进入该文件夹
cd nginx-1.9.9
安装,管理员账户下运行:
./configuremakemake install
在浏览器输入域名:www.xxxxx.cn 后:
(5)nginx配置
因为微信公众号只能利用80端口或者433端口,所以我们可以使用nginx做端口转发,使得服务器得到充分利用。
在nginx.conf文件中(vim /usr/local/nginx/conf/nginx.conf
)加入下面代码:
# hsb_signal_towerlocation /data/hsb_signal_tower {proxy_set_header Host $host;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Scheme $scheme;proxy_pass http://127.0.0.1:8000;}
这样 访问www.xxxx.cn/data/hsb_signal_tower 就会转发到8000端口,之后在8000端口部属自己的开发服务.
2.2 python安装
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
# 下载文件后执行下面的操作#释放文件:tar -xvzf Python-3.5.1.tgz#进入目录:cd Python-3.5.1/# 添加配置:./configure --prefix=/usr/local/python3# 这里配置自己的安装目录,接下来编译源码:make# 执行安装:make install# 重新建立连接mv /usr/bin/python /usr/bin/python.bakln -s /usr/local/python3/bin/python3 /usr/bin/python#配置yum,因为yum是基于python2的vim /usr/bin/yum把#! /usr/bin/python修改为#! /usr/bin/python2vim /usr/libexec/urlgrabber-ext-down把#! /usr/bin/python 修改为#! /usr/bin/python2# 添加环境量vim .bashrcexport PATH=/usr/local/python3/bin:$PATH# pip3 软连接到pipln -s /usr/local/python3/bin/pip3 /usr/bin/pip
3 公众号配置
这一块儿分两部分,相当于微信公众号与后端服务器的通信验证。微信公众号端有唯一的token,在服务器端验证这个token来完成整个通讯验证工作。token是惟一的,所以一定要保密。
3.1 微信公众号端配置
(1)进入公众号拉到最下面,进入基本配置。
(2)填写信息
(a) url填写域名,一定要与nginx配置中一致
(b)token中自己填写,这是公众号开发的唯一识别符,请牢记。
(c)第三个点随机生成。
填完之后先不要提交,接下来在服务器端构建一个验证服务。
3.2 服务器端构建验证服务
本实例使用flask构建web应用
python代码如下,文件名为:wechat.py.需要修改的是使用自己的token。:
# coding:utf-8
from flask import Flask, request, abort, render_template
import hashlib
import xmltodict
import time
# 用它可以访问http请求地址
import urllib.request as urllib2
import urllib
import json# 微信的token令牌
WECHAT_TOKEN = 'your token'
app = Flask(__name__)@app.route("/data/hsb_signal_tower", methods=["GET", "POST"])
def wechat():"""验证服务器地址的有效性"""# 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数:# signature:微信加密, signature结合了开发者填写的token参数和请求中的timestamp参数 nonce参数# timestamp:时间戳(chuo这是拼音)# nonce: 随机数# echostr: 随机字符串# 接收微信服务器发送参数signature = request.args.get("signature")timestamp = request.args.get("timestamp")nonce = request.args.get("nonce")# 校验参数# 校验流程:# 将token、timestamp、nonce三个参数进行字典序排序# 将三个参数字符串拼接成一个字符串进行sha1加密# 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if not all([signature, timestamp, nonce]):# 抛出400错误abort(400)# 按照微信的流程计算签名li = [WECHAT_TOKEN, timestamp, nonce]# 排序li.sort()# 拼接字符串tmp_str = "".join(li)tmp_str = tmp_str.encode('utf-8')# 进行sha1加密, 得到正确的签名值sign = hashlib.sha1(tmp_str).hexdigest()# 将自己计算的签名值, 与请求的签名参数进行对比, 如果相同, 则证明请求来自微信if signature != sign:# 代表请求不是来自微信# 弹出报错信息, 身份有问题abort(403)else:# 表示是微信发送的请求if request.method == "GET":# 表示第一次接入微信服务器的验证echostr = request.args.get("echostr")# 校验echostrif not echostr:abort(400)return echostrelif request.method == "POST":# 表示微信服务器转发消息过来# 拿去xml的请求数据xml_str = request.data# 当xml_str为空时if not xml_str:abort(400)# 对xml字符串进行解析成字典xml_dict = xmltodict.parse(xml_str)xml_dict = xml_dict.get("xml")# MsgType是消息类型 这里是提取消息类型msg_type = xml_dict.get("MsgType")if msg_type == "text":# 表示发送文本消息# 够造返回值, 经由微信服务器回复给用户的消息内容# 回复消息# ToUsername: (必须传) 接收方账号(收到的OpenID)# FromUserName: (必须传) 开发者微信号# CreateTime: (必须传) 消息创建时间(整形)# MsgType: (必须传) 消息类型# Content: (必须传) 回复消息的内容(换行:在Content中能够换行, 微信客户端就支持换行显示)resp_dict = {"xml":{"ToUserName":xml_dict.get("FromUserName"),"FromUserName":xml_dict.get("ToUserName"),"CreateTime":int(time.time()),"MsgType":"text","Content":xml_dict.get("Content")}}else:resp_dict = {"xml": {"ToUserName": xml_dict.get("FromUserName"),"FromUserName": xml_dict.get("ToUserName"),"CreateTime": int(time.time()),"MsgType": "text","Content": "对不起,不能识别您发的内容!"}}# 将字典转换为xml字符串resp_xml_str = xmltodict.unparse(resp_dict)# 返回消息数据给微信服务器return resp_xml_str
if __name__ == '__main__':app.run(port=8000, debug=True)
以上代码参考大神的博客,原博客使用python2,上面代码适用于python3。再使用命令: python wechat.py
没有报错且出现以下信息则表示没有问题:
之后在(1)的配置页面点击提交按钮,如果验证失败则会提示验证token失败,此时服务器端会有相应的错误。如果验证成功,则用户可以在公众号中发送信息,公众号会返回发送信息。
希望大家耐心调试。
python 微信公众号开发[1] 后台服务器端配置与公众号开发配置相关推荐
- python 微信机器人自动聊天+回怼表情包+Adidas公众号自动抽签 四、获取表情包中的文字并进行同类型回怼
前言 在前文自动回怼表情包中, 只是做到爬取表情包存放在本地 ,然后当微信好友发送表情包给你的时候,随机抓取本地一个表情包进行回复.太不灵活 识别表情包中的文字 from __future__ imp ...
- Python微信公众号后台开发003:自定义菜单
有同学问道微信公众号后台开发的自定义菜单怎么实现? 这个问题本来想放到后面的,因为的确对公众号的影响挺明显的, 因为开启后台服务,公众号的自定义菜单就不见了,很影响使用, 也有同学问这个问题,就提前了 ...
- python微信公众号开发教程_python微信公众号开发简单流程实现
本文为大家分享了python微信公众号开发的简单过程,供大家参考,具体内容如下 网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总 ...
- Python微信公众号开发平台
上大学的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的. //www.jb51.net/article/133677.htm后来服务器到期了,也就搁置了.由于发布web程序,使用PHP很 ...
- 记一次微信公众号的开发与后台搭建
一.背景 刚入新公司不久,就碰见一个同事要离职,就交接了这个项目给我.同事的离职比较仓促,所以交接的也不是很好,这也是后面问题偏多的一个客观原因.项目如题所示,前端采用vue.js+node.js开发 ...
- Python学习笔记:7.5.8 Django快速建站 - Web开发实战 微信公众号开发3
前言:本文是学习网易微专业的<python全栈工程师 - Django快速建站>课程的笔记,欢迎学习交流.同时感谢老师们的精彩传授! 一.课程目标 自定义菜单 利用测试公众号进行测试 二. ...
- python 微信公众号 语音推送_微信公众平台消息接口开发(40)语音识别
微信公众平台开发模式 微信 语音识别 公众平台 消息接口 语音识别 微信公众平台开发 语音识别 作者:方倍工作室 地址:http://www.cnblogs.com/txw1958/archive/2 ...
- python发微信红包_微信公众号开发小记——5.python微信红包
描述 有时候产品有这么一些需求,当用户满足一定条件时,给他发一定金额的红包. 微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号. 代码位置 分支pay-20160802 ...
- Python微信公众号
### 类似花生壳的 内网穿透工具:https://ngrok.cc/ 尽管很多人吐槽王者荣耀里的小学生太坑爹,但不得不承认,近年来腾讯的变现能力确实强大地吓人.这之中微信和QQ作为用户的入口,起到 ...
最新文章
- foobar2000 ios版怎么添加音乐_抖音怎么设置说完话后再放音乐 视频先配音后半段添加背景音乐...
- Linux的解决vmware的Linux系统IP自动变化
- python-循环语句基础知识
- postfix过滤器名称不一致导致postfix/qmg:warning: connect to transport xxxx: No such file or directory...
- C语言——冒泡排序法
- 艾伟_转载:趣味问题:你能用Reflection.Emit生成这段代码吗?(答案)
- 价值12万汽车网上售价1万?老哥拍下后4S店不认账:标错价了
- 以太坊创世区块源码分析
- Oracle中是用case...when语句进行判断
- Java 疑问自问自答
- css 标签太长的时候隐藏为点点
- shell命令的退出状态码(exit status)
- ZigBee学习之NXP JN5169开发环境搭建
- ajax请求406,SpringMVC ajax请求406 错误解决方案
- 使用Weka进行数据挖掘(Weka教程三)Weka数据之Instances和Instance
- 二战中真实的打酱油船
- 《论工业社会及其未来》—泰德.卡辛斯基
- 山东大学项目实训小组一——基于深度学习的AI视频剪辑器“易剪”
- jQuery实现商品楼层的感觉
- 《乌合之众》中的50金句
热门文章
- Pr:导出设置之元数据
- 负数二进制转换十进制
- ColorMatrix 矩阵效果,即美图秀秀图片滤镜效果的思路
- 【BZOJ】3168: [Heoi2013]钙铁锌硒维生素
- Android 知识点——Method put in org.json.JSONObject not mocked
- 佛祖保佑永无BUG 代码 (各种样式)
- hdu(杭电oj)第一页题目题解
- SVN(subversion )服务端和客户端的下载安装使用
- FOR ALL ENTRIES
- HDU 6078 Wavel Sequence【动态规划】