当前位置:   article > 正文

Python开发微信公众号_微信公众号python开发

微信公众号python开发

一、微信了解

1、微信相关功能
2、公众号
  • 公众号类型
类型功能适用人群
订阅号为媒体和个人提供一种新的信息传播方式,主要功能是在微信侧给用户传达资讯;(功能类似报纸杂志,提供新闻信息或娱乐趣事)个人、媒体、企业、政府或其他组织
服务号为企业和组织提供更强大的业务服务与用户管理能力,主要偏向服务类交互(功能类似12315,114,银行,提供绑定信息,服务交互的)媒体、企业、政府或其他组织
  • 区别:
区别订阅号服务号
发送次数每天多一次每月最多一次
显示位置消息折叠出现在订阅号的文件夹中,不会收到微信提醒消息出现在微信聊天列表中,会像收到消息一样有微信提醒
支付功能认证的服务号有支付功能

二、微信公众号开发—准备工作

1、appID、appsecret
2、Ngrok获得公网域名
3、测试验证是否配置成功
  • 运行Ngrok(python sunny.py --clientid=*****)>运行python脚本>提交配置>显示配置成功
    在这里插入图片描述
  • python脚本如下,常量部分需替换成自己的, 第一次接入微信服务器的验证流程图;
    在这里插入图片描述
from flask import Flask, request, abort, render_template
import hashlib


# 常量
WECHAT_TOKEN = "***"  # 微信的token令牌,可随便写,但和配置时的token要统一
WECHAT_APPID = "****"  # appID
WECHAT_APPSECRET = "*****"  # AppSecret

app = Flask(__name__)


@app.route("/wechat", methods=["GET", "POST"])
def wechat():
    """对接微信公众号服务器"""
    # 1、提取微信服务器发送的参数
    signature = request.args.get("signature")
    timestamp = request.args.get("timestamp")
    nonce = request.args.get("nonce")

    # 2、校验参数,确定数据源是不是微信后台
    if not all([signature, timestamp, nonce]):
        abort(400)

    # 3、按照微信的流程进行计算签名,进行sha1加密, 得到正确的签名值
    li = [WECHAT_TOKEN, timestamp, nonce]
    li.sort()
    tmp_str = "".join(li)
    sign = hashlib.sha1(tmp_str.encode("utf-8")).hexdigest()

    # 4、判断计算的签名值与请求的签名参数是否等,如果相同,则证明请求来自微信服务器
    if signature != sign:
        abort(403)
    else:
        # 5、表示是第一次接入微信服务器的验证
        if request.method == "GET":
            echostr = request.args.get("echostr")
            if not echostr:
                abort(400)
            return echostr


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8080, debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

三、微信公众号开发—实现自动回复文本/图片

  • 接收普通消息,当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上
1、代码流程图

在这里插入图片描述

2、python脚本实现
  • 运行Ngrox,以及python脚本,在浏览器打开http://wecht.test.idce.com/wechat(wecht.test.idce.com替换成你自己的域名)
  • 手机扫描测试号二维码,在手机端的公众号发送消息,即可体验自动回复内容
    在这里插入图片描述
from flask import Flask, request, abort, render_template
import hashlib
import xmltodict
import time


# 常量
WECHAT_TOKEN = "*****"  # 微信的token令牌,可随便写,但和配置时的token要统一
WECHAT_APPID = "*****"  # appID
WECHAT_APPSECRET = "*****"  # AppSecret

app = Flask(__name__)


@app.route("/wechat", methods=["GET", "POST"])
def wechat():
    """对接微信公众号服务器"""
    # 1、提取微信服务器发送的参数
    signature = request.args.get("signature")
    timestamp = request.args.get("timestamp")
    nonce = request.args.get("nonce")

    # 2、校验参数,确定数据源是不是微信后台
    if not all([signature, timestamp, nonce]):
        abort(400)

    # 3、按照微信的流程进行计算签名,进行sha1加密, 得到正确的签名值
    li = [WECHAT_TOKEN, timestamp, nonce]
    li.sort()
    tmp_str = "".join(li)
    sign = hashlib.sha1(tmp_str.encode("utf-8")).hexdigest()

    # 4、判断计算的签名值与请求的签名参数是否等,如果相同,则证明请求来自微信服务器
    if signature != sign:
        abort(403)
    else:
        # 5、表示是第一次接入微信服务器的验证
        if request.method == "GET":  
            echostr = request.args.get("echostr")
            if not echostr:
                abort(400)
            return echostr
        # 6、对微信服务器转发粉丝发过来的消息,进行回复
        elif request.method == "POST":  
            xml_data = request.data
            if not xml_data:
                abort(400)
            xml_dict = xmltodict.parse(xml_data)
            xml_dict = xml_dict.get("xml")
            msg_type = xml_dict.get("MsgType")  # 提取消息类型
            content = xml_dict.get("Content")
            if content == "hello":
                content = "hello,小可爱"
            resp_dict = {
                "xml": {
                    "ToUserName": xml_dict.get("FromUserName"),
                    "FromUserName": xml_dict.get("ToUserName"),
                    "CreateTime": int(time.time()),
                }
            }
            # 7、实现“你问我答”,构造返回值,由微信服务器回复给粉丝发来的文本内容
            if msg_type == "text":
                resp_dict['xml'].update({
                    "MsgType": "text",
                    "Content": content
                })
            # 8、实现“图”尚往来,构造返回值,由微信服务器回复给粉丝发来的图片内容
            elif msg_type == "image":
                resp_dict['xml'].update({
                    "MsgType": "image",
                    "Image": {
                        "MediaId": xml_dict.get("MediaId")
                    },
                })
            # 9、如果既不是文本,也不是图片,比如语音,返回非文本、非图片
            else:
                resp_dict['xml'].update({
                    "MsgType": "text",
                    "Content": "非文本,非图片内容"
                })
            resp_xml_str = xmltodict.unparse(resp_dict)  # 将字典转换为xml字符串
            return resp_xml_str  # 返回消息数据给微信服务器


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8080, debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86

四、微信公众号开发—获取accessToken

1、python脚本实现
  • 运行Ngrox,以及python脚本;浏览器打开http://wecht.test.idce.com/accestoken(wecht.test.idce.com替换成你自己的域名),即可获得accesstoken
    在这里插入图片描述
from flask import Flask
import requests


# 常量
WECHAT_TOKEN = "****"  # 微信的token令牌,可随便写,但和配置时的token要统一
WECHAT_APPID = "****"  # appID
WECHAT_APPSECRET = "****"  # AppSecret

app = Flask(__name__)


@app.route("/accestoken")
def acc():
    url = f"https://api.weixin.qq.com/cgi-bin/token?grant_type=" \
        f"client_credential&appid={WECHAT_APPID}&secret={WECHAT_APPSECRET}"
    resp = requests.get(url)
    text = resp.text
    return text


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8080, debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

五、微信公众号开发—网页授权拉取用户信息

1、操作步骤
  • 运行python脚本,并运行Ngrox(python sunny.py --clientid=你的clientid);
  • 接口权限区域:修改OAuth2.0授权回调页面域名(你的公网域名,例如wecht.test.idce.com);
    在这里插入图片描述
  • 编写授权url如下,APPID替换成你自己的,REDIRECT_URI替换成http%3A//wecht.test.idce.com/wechat/index(wecht.test.idce.com替换成你自己的域名)
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect 
  • 1
  • 在微信里打开上面的编好的授权url,即可显示用户信息
    在这里插入图片描述
2、python脚本实现
  • 运行Ngrox,以及python脚本;浏览器打开http://wecht.test.idce.com/wechat/index(wecht.test.idce.com替换成你自己的域名),会显示无code;
from flask import Flask, request, render_template
import requests


# 微信公众号的身份标识 常量
WECHAT_TOKEN = "****"  # 微信的token令牌,可随便写,但和配置时的token要统一
WECHAT_APPID = "****"  # appID
WECHAT_APPSECRET = "****"  # AppSecret

app = Flask(__name__)


@app.route("/wechat/index")
def index():
    # 从微信服务器中拿去用户的资料数据

    # 1. 用户授权登陆后方可拿到code参数
    code = request.args.get("code")
    if not code:
        return "无code"

    # 2. 携带code、WECHAT_APPID、WECHAT_APPSECRET向微信服务器发送http请求,获取access_token, 及openid
    url = f"https://api.weixin.qq.com/sns/oauth2/access_token?" \
        f"appid={WECHAT_APPID}&secret={WECHAT_APPSECRET}&" \
        f"code={code}&grant_type=authorization_code"
    response = requests.get(url)
    resp_dict = response.json()
    if "errcode" in resp_dict:
        return "获取access_token失败"
    access_token = resp_dict.get("access_token")
    open_id = resp_dict.get("openid")

    # 3. 通过令牌access_token, 及openid向微信服务器发送http请求,可获取用户的资料数据
    url = f"https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={open_id}&lang=zh_CN"
    response = requests.get(url)
    user_resp_dict = response.json()
    if "errcode" in user_resp_dict:
        return "获取用户信息失败"
    else:
        # 将用户的资料数据填充到页面中
        return render_template("index.html", user=user_resp_dict)


if __name__ == '__main__':
    app.run(host="127.0.0.1", port=8080, debug=True)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
3、html模板
  • 在templates文件夹下新建index.html
    在这里插入图片描述
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>{{user["nickname"]}}</title>
</head>
<body>
    <img alt="头像" src="{{user['headimgurl']}}">
    <table>
        <tr>
            <th>openid</th>
            <td>{{user['openid']}}</td>
        </tr>
        <tr>
            <th>province</th>
            <td>{{user['province']}}</td>
        </tr>
        <tr>
            <th>city</th>
            <td>{{user['city']}}</td>
        </tr>
    </table>

</body>
</html>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/70728
推荐阅读
相关标签
  

闽ICP备14008679号