快速实现Python/Flask静默获取微信公众号OpenID的完整指南及代码

初步简介

  1. 初始授权请求:用户访问 /api/wx_api/get_wx_openid 路由时,服务器端会生成一个微信授权URL,该URL指向微信的授权页面,并包含了必要的查询参数(如appidredirect_uriresponse_typescopestate)。scope参数设置为snsapi_base意味着请求基本授权,不弹出授权页面,只获取用户的OpenID。

  2. 重定向至微信授权页面:用户被重定向到微信授权页面,同意授权后,微信会将用户重定向回指定的redirect_uri,并附加上授权码code

  3. 处理授权重定向:用户重定向回redirect_uri(即 /api/wx_api/wechat_redirect/<appid> 路由)后,服务器端从请求中提取code参数。如果未获取到code,返回错误信息。

  4. 使用授权码获取OpenID:服务器使用提取到的code,向微信的access_token接口发送请求,以交换access_token和用户的OpenID。请求URL包括appidsecretcodegrant_type。成功响应后,提取JSON数据中的OpenID。

  5. 响应OpenID或错误:如果成功从微信响应中获取到OpenID,服务器将其返回给客户端。如果未能获取OpenID(例如,因为授权码无效或已过期),则返回错误信息。

关键实现点

  • 使用 Flask 路由处理HTTP请求和重定向。
  • 构建微信授权URL,包括设置授权范围为snsapi_base,以便用户授权时不需弹出页面。
  • 解析微信重定向回应用时附带的code,并使用它请求OpenID。
  • 安全性考虑,如使用state参数可以增加CSRF攻击的防护。

这个过程使得应用能够在用户授权后获取到其微信OpenID,这是开发微信公众号应用时实现用户认证和个性化服务的基础。

代码部分:

#学习交流 访问
# https://v.iiar.cn

from flask import Flask, request, jsonify, redirect
import requests

# 初始化 Flask 应用
app = Flask(__name__)

appid = '你的微信appid'
secret = '你公众号的secret'

@app.route('/api/wx_api/get_wx_openid', methods=['GET'])
def get_wx_openid():    
    redirect_uri = f'https://xpay.iiar.cn/api/wx_api/wechat_redirect/{appid}'
    get_openid_url = get_wechat_authorize_url(appid, redirect_uri)
    return redirect(get_openid_url, code=301)

# 获取用户code
def get_wechat_authorize_url(appid, redirect_uri):
    base_url = "https://open.weixin.qq.com/connect/oauth2/authorize"
    params = {
        "appid": appid,
        "redirect_uri": redirect_uri,
        "response_type": "code",
        "scope": "snsapi_base",  # 使用 snsapi_base(不弹出授权页面,直接跳转,只能获取用户openid)
        "state": "STATE"  # 不必须,重定向后会带上state参数,开发者可以填写任意参数值
    }
    query_str = "&".join([f"{key}={value}" for key, value in params.items()])
    return f"{base_url}?{query_str}#wechat_redirect"


@app.route('/api/wx_api/wechat_redirect/<appid>', methods=['GET'])
def wechat_redirect(appid):
    code = request.args.get('code')
    if not code:
        return jsonify({"error": "未获取到授权码"}), 400
    # 使用 code 换取 access_token 和 OpenID
    token_url = f"https://api.weixin.qq.com/sns/oauth2/access_token?appid={appid}&secret={secret}&code={code}&grant_type=authorization_code"
    response = requests.get(token_url)
    data = response.json()
    if 'openid' in data:
        openid = data['openid']
        return jsonify({'openid':openid})
    else:
        return jsonify({"error": "获取 OpenID 失败"}), 400
        
if __name__ == '__main__':
    app.run(debug=True)

代码解释:

这段代码是使用 Flask 框架实现的微信公众号开发的一部分,旨在通过微信OAuth2.0授权流程获取用户的OpenID。以下是对代码的详细解释:

1. 定义全局变量

  • appid:您的微信公众号的AppID,用于标识您的公众号。
  • secret:您的微信公众号的Secret,用于与AppID配合使用,进行身份验证。

2. get_wx_openid函数

这是一个Flask视图函数,绑定到路由/api/wx_api/get_wx_openid上,仅支持GET方法。当用户访问这个URL时,函数执行以下步骤:

  • 构造redirect_uri,这是用户授权后重定向的目标地址,其中包含了appid作为路径参数。这个URI指向了本API的另一个端点。
  • 调用get_wechat_authorize_url函数,传递appidredirect_uri作为参数,以构建微信授权URL。
  • 通过redirect函数,将用户的浏览器重定向到微信授权URL,开始授权流程。

3. get_wechat_authorize_url函数

这个函数负责构建微信授权URL。它接收appidredirect_uri作为参数,并设置了一些其他授权请求的必要参数:

  • response_type设置为"code",意味着微信授权后将返回一个授权码(code)。
  • scope设置为"snsapi_base",表示这是一个基础的授权请求,不弹出授权页面,直接跳转,只能获取用户的OpenID。
  • state是一个可选参数,可以被用作CSRF保护。

函数将这些参数拼接为一个查询字符串,并附加到base_url后面,形成完整的微信授权URL,并在末尾添加#wechat_redirect以确保在微信内或者通过微信打开时正确处理。

4. wechat_redirect函数

这个函数绑定到路由/api/wx_api/wechat_redirect/<appid>上,仅支持GET方法。它处理从微信授权重定向回来的请求。函数执行以下步骤:

  • 从请求的查询参数中获取code。如果没有获取到code,返回错误信息。
  • 使用获取到的code,构造请求微信access_token接口的URL。这个URL包含appidsecretcodegrant_type(设置为authorization_code)。
  • 向该URL发起GET请求,获取响应,并解析JSON格式的响应数据。
  • 如果响应数据中包含openid,则返回这个OpenID;如果没有,说明获取OpenID失败,返回错误信息。

这段代码展示了一个使用Flask实现的微信OAuth2.0授权流程,从用户授权开始,到获取用户OpenID的完整过程。这是实现微信登录、获取用户信息等功能的基础。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值