【超详细!超多图!】Python微信公众号开发(1)

 进行微信公众号开发,首先需要准备以下内容:

  • 微信公众号:没有的可以自行去申请,这里不细讲,申请网址:微信公众平台
  • 服务端

本文为Python微信公众号开发的第1篇文章,主要介绍环境准备(主要讲服务端环境)微信公众号鉴权校验流程。

0. 进行微信公众号配置

在进行微信公众号开发之前,需要对微信公众号进行一些配置,先来看一下需要的配置项:

(1)点击公众号后台页面中的“设置与开发” --> 基本配置

(2)在右侧“基本配置”页面,你可以看到开发者ID(AppID),启用开发者密码(AppSecret)。开发者密码需要自己记录下,平台不会记录也不会再次展示给你,如果忘了,需要点"重置"再次获取。

【超详细!超多图!】Python微信公众号开发(1)_第1张图片

(3)下方服务器配置,点击“修改配置”,进入以下界面,需要填写的信息:

  • URL:服务器地址,域名或公网ip
  • Token:自己随便定
  • EncodingAESKey:点击右侧“随机生成”按钮即可
  • 消息加解密方式:暂时使用默认“明文模式”即可

【超详细!超多图!】Python微信公众号开发(1)_第2张图片

可以看到,微信公众要开发需要我们准备一个服务器URL。我上面将URL填写标红了,这是配置中最容易踩坑的一步,我在这里被坑了一天。。。几度想要放弃。接下来我用我血和泪的教训帮你避坑。

1. 准备服务器

1.1 服务器的作用

在准备服务器前,我们先来搞懂这里的服务器是用来干什么的。答案是用来接收微信消息和事件

在上面服务器配置添加服务器的URL,然后在点击"提交"按钮后,微信服务器将发送GET请求到填写的服务器URL上,GET请求携带四个参数:

参数 描述
signature 微信加密签名,signature结合了你在上面填写的自定义的Token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

开发者接收到这四个参数之后,根据【一定的规则】生成一个signature,跟微信服务器发过来的signature进行对比,一致则说明此次GET请求来自微信服务器,原样返回echostr参数内容,接入生效,成为开发者成功,否则接入失败。

这个【一定的规则】如下:

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

让我们先把开发者接收到参数后进行校验的代码写出来,后面在服务端使用(记得在上面配置点“提交”前,先在服务器上将下面代码运行起来!):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from flask import Flask, request
import hashlib

app = Flask(__name__)

@app.route('/')
def index():
    # 设置token,开发者配置中心使用
    token = '你配置的自定义Token'    # <------ 修改这里

    # 获取微信服务器发送过来的参数
    data = request.args
    signature = data.get('signature')
    timestamp = data.get('timestamp')
    nonce = data.get('nonce')
    echostr = data.get('echostr')

    # 对参数进行字典排序,拼接字符串
    temp = [timestamp, nonce, token]
    temp.sort()
    temp = ''.join(temp)

    # 加密
    if (hashlib.sha1(temp.encode('utf8')).hexdigest() == signature):
        return echostr
    else:
        return 'error', 403

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=80, debug=True) # <----- 这里指定80端口,不要指定其它

1.2 服务器选择

上面写了公众号服务器配置URL的要求:域名 或者 公网ip

1.2.1 使用本地机器

刚开始我是想用本地环境来作为服务器的,这样直接在本地写代码就可以了。但是问题来了,本地IP是私网IP,无法被公众平台访问到。如果URL中填入本地的IP地址,点“提交”后会一直报错“系统发生错误,请稍后重试”。

本地运行上面的校验代码后是这样的:

将运行的本地ip地址填入服务器URL,点“提交”,报错:

【超详细!超多图!】Python微信公众号开发(1)_第3张图片

这个错误的原因一般是微信公众号访问不到服务器,或者服务器内部发生错误。一般服务器内部发生错误,会在服务器终端中报错误,类似如下:

【超详细!超多图!】Python微信公众号开发(1)_第4张图片

如果你的服务器终端什么都没打印,那就是微信服务器的请求无法访问到你的服务器上。

那么,如何将本地机器作为服务器呢?

可以使用一些工具进行内网穿透,将本地的IP暴露到公网中供外部访问,例如ngrok或者cpolar工具等。因本人内网安全策略不允许内网穿透,遂放弃。如果你想用此方法,可以参考以下博文:

用Natapp(ngrok)进行微信本地开发调试 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具 icon-default.png?t=N7T8https://natapp.cn/article/wechat_local_debug

微信公众号本地开发调试 - 无公网IP,内网穿透_51CTO博客_本地微信公众号运营icon-default.png?t=N7T8https://blog.51cto.com/u_15565852/6643787

1.2.2 使用微信云开发

在微信官方文档中,提到了“小程序云开发”,可以共享开发环境给公众号,这种方式无需额外的服务器,并且用这个方式对接微信公众号,直接省去了核对token的环境,无需以上自己写的校验代码了

1开启公众号开发者模式 | 微信开放文档微信开发者平台文档icon-default.png?t=N7T8https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Getting_Started_Guide.html可惜的是,本人研究半天,没研究明白怎么用,网上教程也比较少...... 暂时搁置,后续再研究下。你如果感兴趣,欢迎指教,感激不尽!

1.2.3 使用云服务器

网络上现有资料绝大多数使用这种方式进行开发。你可以自己去申请一台云服务器,例如阿里云、百度云、华为云、腾讯云。

这种方式的缺点就是:需要花钱。但好在,一般这些大公司的云服务器,都有秒杀活动或试用活动,如果只是用来学习和试验,白嫖一个月的试用期也是可以的......

我这里就白嫖了腾讯云的一个云服务器。你可以去注册一个账号试试,新用户都可以免费试用,需要完成个人实名认证。

腾讯云 产业智变·云启未来 - 腾讯腾讯云(tencent cloud)为数百万的企业和开发者提供安全稳定的云计算服务,涵盖云服务器、云数据库、云存储、视频与CDN、域名注册等全方位云服务和各行业解决方案。icon-default.png?t=N7T8https://cloud.tencent.com/

1.2.3.1 申请云服务器

(1)打开上面腾讯云链接,选择“免费试用”板块

【超详细!超多图!】Python微信公众号开发(1)_第5张图片

(2)选择一款云服务器,点“立即试用”

【超详细!超多图!】Python微信公众号开发(1)_第6张图片

(3)立即试用后会让你选择安装的镜像,这里选择“宝塔Linux”,操作简单

【超详细!超多图!】Python微信公众号开发(1)_第7张图片

1.2.3.2 云服务器配置

(1)进入自己的腾讯云后台,可以看到自己刚才申请的云服务器

【超详细!超多图!】Python微信公众号开发(1)_第8张图片

【超详细!超多图!】Python微信公众号开发(1)_第9张图片

(2)点击云服务器进入后台管理页面,“重置密码”,这个密码是后面你命令行等远程登录时候的密码。

【超详细!超多图!】Python微信公众号开发(1)_第10张图片

(3)防火墙设置:“页面最上面” --> “防火墙” --> “添加规则” --> “端口号:8888” --> 确定

【超详细!超多图!】Python微信公众号开发(1)_第11张图片

(4)获取宝塔面板的管理员用户名和密码:“页面最上面” --> “应用管理” --> “先复制命令” --> “登录”

【超详细!超多图!】Python微信公众号开发(1)_第12张图片

(5)点击登录后你会看到用户名和密码,以及外部链接,浏览器打开外部链接,输入用户名和密码,进入宝塔界面

【超详细!超多图!】Python微信公众号开发(1)_第13张图片

(6)进入后是这样的。如果没有注册过宝塔账号,需要先注册个账号,登录宝塔网页。然后再次打开上面的“外网面板地址”,就可以看到下面的界面了。

【超详细!超多图!】Python微信公众号开发(1)_第14张图片

1.2.3.3 配置Python环境 - CentOS Anaconda

具体步骤可以参考下列文章,比较简单:

CentOS安装/卸载Anaconda(图文详解)-腾讯云开发者社区-腾讯云众所周知的原因,从官网下载Anaconda非常慢,因此为了加速下载,这里我们采取清华源下载。icon-default.png?t=N7T8https://cloud.tencent.com/developer/article/2065512

1.2.3.4 配置远程开发环境 - VSCode

具体步骤请参见我的上一篇文章:

【新人必会】远程开发可视化 - VSCode篇-CSDN博客文章浏览阅读108次,点赞3次,收藏2次。让远程开发可视化,不再只是面对黑洞洞的中断命令行窗口和vimhttps://blog.csdn.net/Attitude93/article/details/135368358?spm=1001.2014.3001.5502

1.2.3.5 将校验代码写到服务端,并运行

使用远程VSCode开发的好处:

  • 可视化开发,界面美观,开发感受更好
  • 可以断点和Debug !

【超详细!超多图!】Python微信公众号开发(1)_第15张图片

至此,服务器终于配好了,可以接收来自微信服务器的消息了。

2. 配置提交

回到微信公众号配置界面,点“提交”。如果不出意外,提交成功!

3. 一些坑

如果你完全按我以上的文档走下来,应该已经成功了。下面我只是列出我踩的一些坑:

(1)Token验证错误:

  • 校验代码中的Token和微信公众号配置中的Token不一致
  • python3需要修改代码,不能直接使用官方的代码,官方的是python2,直接使用本文中的代码即可解决

(2)本文代码需要提前安装的一些python包

pip install web.py
pip install flask
pip install flask_cors

(3)AttributeError: 'ThreadedDict' object has no attribute 'env'

  • 直接使用本文中的代码即可解决

从今天开始,持续学习,开始搞事情。踩坑不易,欢迎关注我,围观我!

【超详细!超多图!】Python微信公众号开发(1)_第16张图片

你可能感兴趣的:(python,服务器,微信公众号开发,微信,python,vscode,腾讯云,linux,centos)