Python 对接微信实现获取 OpenID 教程

一、引言

在众多基于微信生态的开发场景中,获取用户的 OpenID 是基础且关键的一环。OpenID 是微信为每个用户在特定公众号或小程序中分配的唯一标识符,利用它我们能精准识别不同用户,进而开展用户数据管理、个性化服务等操作。接下来,我会详细介绍如何运用 Python 编写一个小脚本,实现与微信对接并获取 OpenID 的功能。

二、准备工作

2.1 微信公众号相关设置

  • 首先得拥有一个微信公众号,进入公众号的管理后台。
  • 在 “开发 - 基本配置” 里,能找到至关重要的 AppID 和 AppSecret。AppID 是公众号独一无二的标识,而 AppSecret 则是用于生成接口调用凭证的密钥,一定要严格保密。
  • 接着在 “开发 - 接口权限 - 网页服务 - 网页授权获取用户基本信息” 中,对 “授权回调域名” 进行配置,这个域名必须是经过 ICP 备案的有效域名。

2.2 安装 Python 依赖库

我们会使用 requests 库来发送 HTTP 请求,可通过以下命令进行安装:

pip install requests

三、脚本实现步骤

3.1 构建授权 URL

要获取用户的 OpenID,得先引导用户进行授权。这就需要我们构造一个授权 URL,示例代码如下:

import requests

# 替换成你的 AppID
APPID = 'your_appid'
# 替换成你的授权回调 URL
REDIRECT_URI = 'your_redirect_uri'
# 授权作用域,snsapi_base 仅用于获取 OpenID
SCOPE = 'snsapi_base'

def generate_auth_url():
    """
    生成微信授权 URL
    """
    base_url = 'https://open.weixin.qq.com/connect/oauth2/authorize'
    params = {
        'appid': APPID,
        'redirect_uri': REDIRECT_URI,
        'response_type': 'code',
        'scope': SCOPE,
      'state': 'STATE'
    }
    # 拼接参数生成完整 URL
    param_str = '&'.join([f"{key}={value}" for key, value in params.items()])
    auth_url = f"{base_url}?{param_str}#wechat_redirect"
    return auth_url

此函数会生成一个授权 URL,用户点击该链接后,会跳转到微信授权页面,用户确认授权后,微信会将授权码(code)通过回调 URL 传递回来。

3.2 解析授权码

当用户在微信授权页面确认授权后,会被重定向到我们设定的回调 URL,且 URL 中会附带一个 code 参数。下面的代码可用于解析这个 code

from urllib.parse import urlparse, parse_qs

def extract_code_from_url(url):
    """
    从回调 URL 中提取授权码
    """
    parsed_url = urlparse(url)
    query_params = parse_qs(parsed_url.query)
    code = query_params.get('code', [None])[0]
    return code

3.3 使用授权码换取 OpenID

拿到授权码后,我们可以向微信服务器发送请求,以换取用户的 OpenID,示例代码如下:

# 替换成你的 AppSecret
APPSECRET = 'your_appsecret'

def get_openid_with_code(code):
    """
    使用授权码获取 OpenID
    """
    token_url = f'https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={APPSECRET}&code={code}&grant_type=authorization_code'
    response = requests.get(token_url)
    result = response.json()
    if 'openid' in result:
        return result['openid']
    else:
        print(f"获取 OpenID 失败,错误信息:{result}")
        return None

四、完整脚本示例

import requests
from urllib.parse import urlparse, parse_qs

# 替换成你的 AppID
APPID = 'your_appid'
# 替换成你的 AppSecret
APPSECRET = 'your_appsecret'
# 替换成你的授权回调 URL
REDIRECT_URI = 'your_redirect_uri'
# 授权作用域,snsapi_base 仅用于获取 OpenID
SCOPE = 'snsapi_base'

def generate_auth_url():
    """
    生成微信授权 URL
    """
    base_url = 'https://open.weixin.qq.com/connect/oauth2/authorize'
    params = {
        'appid': APPID,
        'redirect_uri': REDIRECT_URI,
        'response_type': 'code',
        'scope': SCOPE,
      'state': 'STATE'
    }
    param_str = '&'.join([f"{key}={value}" for key, value in params.items()])
    auth_url = f"{base_url}?{param_str}#wechat_redirect"
    return auth_url

def extract_code_from_url(url):
    """
    从回调 URL 中提取授权码
    """
    parsed_url = urlparse(url)
    query_params = parse_qs(parsed_url.query)
    code = query_params.get('code', [None])[0]
    return code

def get_openid_with_code(code):
    """
    使用授权码获取 OpenID
    """
    token_url = f'https://api.weixin.qq.com/sns/oauth2/access_token?appid={APPID}&secret={APPSECRET}&code={code}&grant_type=authorization_code'
    response = requests.get(token_url)
    result = response.json()
    if 'openid' in result:
        return result['openid']
    else:
        print(f"获取 OpenID 失败,错误信息:{result}")
        return None

if __name__ == "__main__":
    # 生成授权 URL
    auth_url = generate_auth_url()
    print(f"请访问以下 URL 进行授权:{auth_url}")

    # 模拟获取用户授权后的回调 URL,实际应用中需从前端获取
    callback_url = input("请输入回调 URL:")
    code = extract_code_from_url(callback_url)

    if code:
        # 使用授权码获取 OpenID
        openid = get_openid_with_code(code)
        if openid:
            print(f"成功获取 OpenID:{openid}")

五、注意事项

  • 安全方面AppSecret 是非常敏感的信息,一定要妥善保管,防止泄露,否则可能导致严重的安全问题。
  • 授权作用域snsapi_base 只能获取 OpenID。若需要获取用户的其他信息,如昵称、头像等,需将 scope 设置为 snsapi_userinfo,但此时用户需要进行更严格的授权。
  • 接口调用频率:微信对接口调用有一定的频率限制,在实际开发中要注意控制调用频率,避免触发限制而影响正常使用。

通过以上步骤和脚本,你就可以使用 Python 轻松对接微信,实现获取用户 OpenID 的功能啦。希望这个小教程能对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱搬砖的程序猿.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值