专栏首页锦小年的博客python 微信公众号开发[1] 后台服务器端配置与公众号开发配置

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

安装,管理员账户下运行:

./configure
 
make
 
make install

在浏览器输入域名:www.xxxxx.cn 后:

(5)nginx配置 因为微信公众号只能利用80端口或者433端口,所以我们可以使用nginx做端口转发,使得服务器得到充分利用。 在nginx.conf文件中(vim /usr/local/nginx/conf/nginx.conf)加入下面代码:

		# hsb_signal_tower
        location /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.bak
   ln -s /usr/local/python3/bin/python3 /usr/bin/python

   #配置yum,因为yum是基于python2的
   vim /usr/bin/yum
   把#! /usr/bin/python修改为#! /usr/bin/python2

   vim /usr/libexec/urlgrabber-ext-down
   把#! /usr/bin/python 修改为#! /usr/bin/python2

   # 添加环境量
   vim .bashrc
   export PATH=/usr/local/python3/bin:$PATH

   # pip3 软连接到pip
   ln -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")
            # 校验echostr
            if not echostr:
                abort(400)
            return echostr

        elif 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失败,此时服务器端会有相应的错误。如果验证成功,则用户可以在公众号中发送信息,公众号会返回发送信息。 希望大家耐心调试。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Nilearn学习笔记3-提取时间序列建立功能连接体

    在nilearn库中,提供了两种从fmri数据中提取时间序列的方法,一种基于脑分区(Time-series from a brain parcellation ...

    锦小年
  • Python数据分析(2)-pandas数据结构操作

    pandas是一个提供快速、灵活、表达力强的数据结构的Python库,适合处理‘有关系’或者‘有标签’的数据。在利用Python做数据分析的时候,pandas是...

    锦小年
  • linux服务器搭建之路13-用户/用户组管理

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。用户/用户...

    锦小年
  • 微信开发

    微信支付和开放平台是属于微信开发两个体系,我们今天只说微信开放平台,打开微信开放平台,包括移动应用开发,网站应用开发,公众号开发,第三方平台开发,第三方平台开发...

    只喝牛奶的杀手
  • 聒噪丨你不知道的“微信”

    从2011年1月诞生起,微信至今已走过了五年历程。从最初那个简单的“通讯APP”,微信已经进化成了一种蕴含巨大社会效益和经济驱动力的“现象产品”。 去年,企鹅智...

    AI研习社
  • 企业办公市场未来如何发展?企业微信告诉你开放赋能最重要

    开放是互联网行业在发展过程中一直强调的方向。随着技术的不断发展完善,数字经济时代凸显出的问题也越来越多。发展迅速的数字经济时代,没有任何一家企业能够全方位应对各...

    企鹅号小编
  • 微信启动界面:张小龙的情怀和马化腾的爱好

    微信启动界面是这样的,5年都没变过,相信很多人都有疑问,这究竟有什么意味呢? 今天Super就跟大家八一八,这个启动界面,大概有三个意思。 1、与微信产品气...

    罗超频道
  • 微信公开课发布微信官方教程:教你用好微信JS-SDK接口

    微信公众平台开放JS-SDK(微信内网页开发工具包),说明文档已经有相关使用方法和示例了,很多同学觉得不是很直观,为此微信公开课发布微信官方教程:教你用好微信...

    ytkah
  • 如果你想做小程序,为何不参考一下微信运动?

    知晓君
  • 【干货】腾迅张小龙详解:企业号未来战略

     “连接企业的另一种可能”是微信对企业号给出的定义,也诠释了微信“人与企业的连接”战略企图。人们在狂热追捧订阅号和服务号的同时,却忽视了微信可以成为企业应用的入...

    人称T客

扫码关注云+社区

领取腾讯云代金券