在 Python 中获取微信用户昵称的乱码问题

在 Python 中获取微信用户昵称的乱码问题:一步步教你搞定公众号网页授权登录

在开发涉及微信用户登录的应用程序时,获取微信用户的昵称是一个常见的需求。这不仅可以增强用户体验,还能为你的应用增添更多个性化功能。

微信授权登录的流程

微信授权登录主要分为三个步骤:

  1. 用户授权并获取 code:用户通过微信登录你的应用,微信会返回一个临时的 code
  2. code 换取 access_tokenopenid:通过第一步获取的 code,向微信服务器请求 access_token 和用户的唯一标识 openid
  3. access_tokenopenid 获取用户信息:使用 access_tokenopenid 向微信服务器请求用户的基本信息,包括昵称。

实现代码

接下来,我们将通过 Python 代码来实现这一流程。为了简化代码,我们使用了 requests 库来发送 HTTP 请求。

1. 换取用户授权 Token

首先,我们需要根据用户授权时返回的 code,向微信服务器请求 access_tokenopenid

import requests

# 换取用户授权 Token
async def get_access_token(appid, secret, code):
    url = f"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"
    response = requests.get(url)
    return response.json()

2. 获取用户信息

获取到 access_tokenopenid 后,我们就可以请求用户的基本信息了。这里需要注意,微信返回的昵称可能会存在编码问题,因此我们需要进行处理。

# 获取用户信息
async def get_user_info_by_code(code):
    result = await get_access_token(config.APP_ID, config.APP_SECRET_KEY, code)
    if 'errcode' in result:
        print(f"获取access token失败,错误码:{result['errcode']},错误信息:{result['errmsg']}")
        return None
    access_token = result.get('access_token')
    openid = result.get('openid')
    url = f"https://api.weixin.qq.com/sns/userinfo?access_token={access_token}&openid={openid}&lang=zh_CN"
    response = requests.get(url)

    if response.status_code == 200:
        data = response.json()  # 获取响应的 JSON 数据
        nickname = data.get('nickname')
        # 处理用户昵称乱码问题
        if nickname:
            # 进行编码和解码处理
            try:
                nickname = nickname.encode('iso-8859-1').decode('utf-8')
                print("nickname", nickname)
            except UnicodeDecodeError:
                print("解码失败,可能是数据已经是 UTF-8 编码")
                nickname = nickname  # 如果已经是 UTF-8 编码,则保持不变

            # 创建一个新的字典对象,并将修改后的 nickname 赋值进去
            new_data = {**data, 'nickname': nickname}
            print("new_data", new_data)
            return new_data
        else:
            print("nickname 字段缺失")
            return data
    else:
        print("获取用户信息失败:", response.text)
        return None

注意事项

  1. 配置文件:在代码中,config.APP_IDconfig.APP_SECRET_KEY 是你的微信应用的 appidsecret,需要提前在配置文件中设置好。
  2. 错误处理:在实际开发中,要对可能出现的错误进行详细处理,例如网络请求失败、返回的 JSON 数据格式错误等。
  3. 编码问题:微信返回的昵称可能会因为编码问题导致乱码,需要根据实际情况进行处理,上述代码中的nickname = nickname.encode('iso-8859-1').decode('utf-8')就是为了解决乱码问题。
posted @ 2025-07-08 09:22  莫颀  阅读(84)  评论(0)    收藏  举报