初步简介
-
初始授权请求:用户访问
/api/wx_api/get_wx_openid
路由时,服务器端会生成一个微信授权URL,该URL指向微信的授权页面,并包含了必要的查询参数(如appid
、redirect_uri
、response_type
、scope
、state
)。scope
参数设置为snsapi_base
意味着请求基本授权,不弹出授权页面,只获取用户的OpenID。 -
重定向至微信授权页面:用户被重定向到微信授权页面,同意授权后,微信会将用户重定向回指定的
redirect_uri
,并附加上授权码code
。 -
处理授权重定向:用户重定向回
redirect_uri
(即/api/wx_api/wechat_redirect/<appid>
路由)后,服务器端从请求中提取code
参数。如果未获取到code
,返回错误信息。 -
使用授权码获取OpenID:服务器使用提取到的
code
,向微信的access_token
接口发送请求,以交换access_token
和用户的OpenID。请求URL包括appid
、secret
、code
和grant_type
。成功响应后,提取JSON数据中的OpenID。 -
响应OpenID或错误:如果成功从微信响应中获取到OpenID,服务器将其返回给客户端。如果未能获取OpenID(例如,因为授权码无效或已过期),则返回错误信息。
关键实现点:
- 使用 Flask 路由处理HTTP请求和重定向。
- 构建微信授权URL,包括设置授权范围为
snsapi_base
,以便用户授权时不需弹出页面。 - 解析微信重定向回应用时附带的
code
,并使用它请求OpenID。 - 安全性考虑,如使用
state
参数可以增加CSRF攻击的防护。
这个过程使得应用能够在用户授权后获取到其微信OpenID,这是开发微信公众号应用时实现用户认证和个性化服务的基础。
代码部分:
#学习交流 访问
# https://v.iiar.cnfrom 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 和 OpenIDtoken_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 失败"}), 400if __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
函数,传递appid
和redirect_uri
作为参数,以构建微信授权URL。 - 通过
redirect
函数,将用户的浏览器重定向到微信授权URL,开始授权流程。
3. get_wechat_authorize_url
函数
这个函数负责构建微信授权URL。它接收appid
和redirect_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包含appid
、secret
、code
和grant_type
(设置为authorization_code
)。 - 向该URL发起GET请求,获取响应,并解析JSON格式的响应数据。
- 如果响应数据中包含
openid
,则返回这个OpenID;如果没有,说明获取OpenID失败,返回错误信息。
这段代码展示了一个使用Flask实现的微信OAuth2.0授权流程,从用户授权开始,到获取用户OpenID的完整过程。这是实现微信登录、获取用户信息等功能的基础。