快速实现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.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函数,传递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的完整过程。这是实现微信登录、获取用户信息等功能的基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/686370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

位运算(一)

位运算注意事项 整形在计算机中是以补码的形式进行存储的&#xff0c;因此位运算也是在补码的基础上进行操作的。 复习&#xff1a;正数&#xff1a;原码反码补码 负数&#xff1a;反码原码取反(除符号位) 补码反码1 位运算~&#xff1a;按位取反&#xff08;在补码上按位取…

Shellcode免杀对抗(Python)

Shellcode Python免杀&#xff0c;绕过360安全卫士、火绒安全、Defender Python基于cs/msf的上线 cs 执行代码2种可供选择 执行代码 1&#xff1a; rwxpage ctypes.windll.kernel32.VirtualAlloc(0, len(shellcode), 0x1000, 0x40) ctypes.windll.kernel32.RtlMoveMemory…

HTTP 请求 400错误

问题 HTTP 请求 400错误 详细问题 客户端发送请求 public static UserInfo updateUserInfo(UserInfo userInfo) {// 创建 OkHttpClient 对象OkHttpClient client new OkHttpClient();// 创建请求体MediaType JSON MediaType.parse("application/json; charsetutf-8&…

代码随想录算法训练营第三十四天丨860.柠檬水找零、406. 根据身高重建队列、860. 柠檬水找零

860. 柠檬水找零 遇到顾客给20块的&#xff0c;优先拿10块的找给他。 class Solution:def lemonadeChange(self, bills: List[int]) -> bool:change {5: 0, 10: 0}for bill in bills:if bill 5:change[5] 1elif bill 10:if change[5] < 1:return Falsechange[5] - …

目标检测算法之YOLOv5的应用实例(医疗影像辅助诊断领域应用的详解)

在医疗影像辅助诊断领域,YOLOv5可以被应用于快速而准确地识别和定位医学影像中的关键结构,比如肿瘤、器官或病变区域。这有助于医生更有效地分析影像资料,提高诊断的准确性和效率。以下是一个使用YOLOv5在医学影像上进行病灶检测的基本代码示例: import cv2 import torch …

Java实现停车场收费系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 停车位模块2.2 车辆模块2.3 停车收费模块2.4 IC卡模块2.5 IC卡挂失模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 停车场表3.2.2 车辆表3.2.3 停车收费表3.2.4 IC 卡表3.2.5 IC 卡挂失表 四、系统实现五、核心代码…

sqlserver 子查询 =,in ,any,some,all的用法

在 SQL Server 中&#xff0c;子查询常用于嵌套在主查询中的子句中&#xff0c;以便根据子查询的结果集来过滤主查询的结果&#xff0c;或者作为主查询的一部分来计算结果。 以下是 、IN、ANY、SOME 和 ALL 运算符在子查询中的用法示例&#xff1a; 使用 运算符进行子查询&a…

android11以上SD卡存储权限适配申请问题

在Android 11&#xff08;API级别30&#xff09;及以上版本中&#xff0c;应用需要获得MANAGE_EXTERNAL_STORAGE权限。这个权限允许应用访问设备上的所有文件&#xff0c;而不仅仅是它自己的文件。然而&#xff0c;由于这个权限对用户的隐私有潜在的影响&#xff0c;因此Google…

Java-String字符串的常见方法总结

常用方法 1.charAt(int index)方法和tocharArray()方法 charAt(int index)方法&#xff1a;括号里传入整型参数&#xff0c;可以获取到该下标位置的String数组内容&#xff0c;通常用于遍历字符串。 tocharArray()方法&#xff1a;将字符串转化为char类型&#xff0c;再存入c…

【初始RabbitMQ】工作队列的实现

工作队列 工作队列&#xff08;又称为任务队列&#xff09;的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。 相反我们安排任务在之后执行。我们把任务封装为消息并将其发送到队列。在后台运行的工作进 程将弹出任务并最终执行作业。当有多个工作线程…

【NI-DAQmx入门】调整数据记录长度再进行数据处理

需要注意的是&#xff0c;初学者很容易造成一个大循环&#xff0c;导致采集循环的执行时间过长&#xff0c;最佳操作是采集循环只干采集的事&#xff0c;另起一个循环做数据拆解或分析。 有时需要以一定的采样率获取数据并记录所需的长度。然而&#xff0c;在处理这些数据时&am…

QT+OSG/osgEarth编译之八十八:osgdb_pic+Qt编译(一套代码、一套框架,跨平台编译,版本:OSG-3.6.5插件库osgdb_pic)

文章目录 一、osgdb_pic介绍二、文件分析三、pro文件四、编译实践一、osgdb_pic介绍 PIC(Pixel Image Format)是一种用于存储和表示图像数据的文件格式。它最初由软件公司Softimage开发,用于存储计算机生成的图像和动画序列。 PIC格式使用无损压缩算法,可以保存包含颜色和…

2-17作业

#!/bin/bash read zifu case $zifu in [[:lower:]]) echo "小写字母" ;; [0-9]) echo "是数字字符" ;; [[:upper:]]) echo "是大写字母" ;; esac #!/bin/bash arr(ls ~) len${#arr…

每日OJ题_算法_递归⑤力扣50. Pow(x, n)

目录 力扣50. Pow(x, n) 解析代码 力扣50. Pow(x, n) 50. Pow(x, n) 难度 中等 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.0000…

把Activity当做dialog对话框使用

1、引言 在安卓开发中对话框的使用是不可避免的&#xff0c;但是原生的对话框用起来总感觉差点意思&#xff0c;而且位置不好控制&#xff0c;在与界面的交互上也不够灵活&#xff0c;没有像activity那样的生命周期方法&#xff0c;以至于某些特殊的功能无法实现。此时我们就希…

Android Studio新建EMPTY,提示Gradle下载失败,Connect timed out

Android Studio新建EMPTY&#xff0c;提示Gradle下载失败&#xff0c;Connect timed out 找到gradle-wrapper.properites文件&#xff0c;替换distributeionUrl为腾讯镜像&#xff0c;就好了&#xff0c;网上找了好久&#xff0c;就这个有效&#xff0c;是在这里Android导入项…

【分享】图解ADS+JLINK调试ARM

文章是对LPC2148而写的&#xff0c;但是对三星的44B0芯片同样适用&#xff0c;只需要在选择时将相应的CPU选择的S3C44B0就可以了。 JLINK在ADS下调试心得 前两天一个客户用jlink在ADS下调试LPC2148总报错&#xff0c;这个错误我之前在调试LPC2200的时候也碰到过&#xff0c;后…

ESP32学习(2)——点亮LED灯

1.前期准备 开发板原理图如下&#xff1a; 可见LED灯接在了GPIO2口 那么要如何编写代码控制GPIO口的电平高低呢&#xff1f; 我们可以参考micropython的官方文档Quick reference for the ESP32 — MicroPython latest documentation 可见&#xff0c;需要导入machine包 若要…

[嵌入式系统-24]:RT-Thread -11- 内核组件编程接口 - 网络组件 - TCP/UDP Socket编程

目录 一、RT-Thread网络组件 1.1 概述 1.2 RT-Thread支持的网络协议栈 1.3 RT-Thread如何选择不同的网络协议栈 二、Socket编程 2.1 概述 2.2 UDP socket编程 2.3 TCP socket编程 2.4 TCP socket收发数据 一、RT-Thread网络组件 1.1 概述 RT-Thread 是一个开源的嵌入…

Springboot 配置使用 Elasticsearch

一、安装Elasticsearch 1、Windows安装 Windows安装比较简单&#xff0c;ES官网Download Elasticsearch | Elastic下载压缩包&#xff0c;解压出来&#xff0c; bin 目录下有个elasticsearch.bat&#xff0c;双击&#xff0c;就运行起来了。 然后在浏览器输入localhost:9200…