本文介绍python3实现获取openid功能。

1 实现原理

  1. 根据"微信url"和"微信网页授权域名"组成的字符串生成二维码
  2. 用微信扫描二维码,查询到用户授权信息后,微信把查询的结果当作url参数传给授权的网页域名
  3. 用fastapi网页框架作后台,绑定微信授权的网页域名,处理微信回调
  4. 把查询的信息保存本地openid.json文件
  5. fastapi提供查询微信信息信息接口

2 代码实现

2.1 设置微信网页授权域名

登录开通的微信公众号,操作如图:

2.2 创建web服务

# 1.创建app对象
app = FastAPI()# 设置允许跨域
app.add_middleware(CORSMiddleware,allow_origins=['*'],allow_methods=["*"],allow_headers=["*"],
)if __name__ == '__main__':uvicorn.run("WChatTool:app", host="0.0.0.0", port=8089, reload=True)

2.3 创建生成二维码API

@app.get("/get_openid_qrcode")
async def get_openid_qrcode(user: str):appid = 'xxxxxxxx' # 自己的微信公众号appidurl = 'xxx.xxxxx.xxxx' # 上面设置的微信网页授权域名callback = 'handle_openid' # fastapi里面定义的路由函数data = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={1}&redirect_uri=https%3A%2F%2F{2}%2F{3}%3Fuser%3D{0}&response_type=code&scope=snsapi_userinfo&state=123&connect_redirect=1#wechat_redirect'.format(user, appid, url, callback)  # 除了设置的参数,其他的字符串都是固定的print(data)image = qrcode.make(data)return StreamingResponse(image_to_stream(image), media_type="image/png")

2.4 创建微信网页授权域名回调函数

@app.get("/handle_openid")
def handle_openid(user: str, code: str, state: str):print(code, state)# 验证参数是否存在if not all([user, code, state]):return {'code': "4103", 'msg': '参数错误'}appid = 'xxxxxxxx' # 自己的微信公众号appidsecret = 'xxxxxxxxxxx' # 自己的微信公众号的密码url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={2}&code={1}&' \'grant_type=authorization_code'.format(appid, code, secret)result = send_get(url)print('result = ', result)if 'openid' in result:openid, access_token = result.get('openid', ''), result.get('access_token', '')url = 'https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN'.\format(access_token, openid)result = send_get(url)print('result = ', result)if 'openid' in result:openidDict = read_file(g_openid_file_name)openidDict[user] = resultwrite_file(g_openid_file_name, openidDict)return {'code': "0", 'msg': 'OK', 'data': result}return {'code': "4004", 'msg': '获取用户信息失败', 'data': {}}

2.5 创建微信用户信息查询函数

@app.get("/get_openid")
def get_openid(user: str):openid = read_file(g_openid_file_name).get(user, {})if openid:return {'code': "0", 'msg': 'OK', 'data': openid}return {'code': "4004", 'msg': '获取openid失败', 'data': {}}

2.6 功能函数

import uvicorn
from fastapi import FastAPI
from fastapi.responses import StreamingResponse
from starlette.middleware.cors import CORSMiddleware
import io
import os
import requests
import json
import qrcodeheaders = {'Accept': 'application/json, text/javascript, */*; q=0.01','Accept-Encoding': 'gzip, deflate, br','Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8','Cache-Control': 'no-cache','Connection': 'keep-alive','Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8','Pragma': 'no-cache','User-Agent': 'self-defind-user-agent','Cookie': 'name=self-define-cookies-in header','X-Requested-With': 'XMLHttpRequest'
}g_openid_file_name = 'openid.json'def send_post(url: str, json_data: dict):try:# 注意:用res.content,不用res.text,否则会有中文乱码res = requests.post(url=url, data=json.dumps(json_data), headers=headers)return json.loads(res.content.decode("utf-8").encode("utf-8"))except Exception as e:print('[send_get]Failed to json.load, {0}'.format(e))return {}def send_get(url: str):try:# 注意:用res.content,不用res.text,否则会有中文乱码res = requests.get(url=url, headers=headers)# result = res.text.encode('utf-8').decode("unicode_escape")# print('---------result=', result, res.text)return json.loads(res.content.decode("utf-8").encode("utf-8"))except Exception as e:print('[send_get]Failed to json.load, {0}'.format(e))return {}def read_file(filename: str):# 读取数据if not os.path.exists(filename):return {}with open(filename, 'r') as f:data = json.load(f)return datadef write_file(filename: str, data: dict):# 写入 JSON 数据with open(filename, 'w') as f:json.dump(data, f)

python3实现扫码获取微信openid功能相关推荐

  1. 前端在线微信扫码支付的小功能

    前两天写了一个微信扫码支付的小功能,采用vue+antDesign,在此记录一下. 功能大概如下 输入信息 微信扫码支付 结果页面 ·输入信息 通过下拉选择框的联动,输入信息后点击下一步调取api并进 ...

  2. 从小程序快速扫码进微信群聊

    众所周知,由于各种原因,从小程序里面是无法直接识别二维码的,可能有别的路子可以间接实现,比如利用客服消息推送,但这不是长久之计,也不是官方支持的,可能会影响审核.今天说的方法,是官方开放的功能,可以放 ...

  3. 微信公众号开发系列-获取微信OpenID

    在微信开发时候在做消息接口交互的时候需要使用带微信加密ID(OpenId),下面讲讲述2中类型方式获取微信OpenID,接收事件推送方式和网页授权获取用户基本信息方式获取. 1.通过接收被动消息方式获 ...

  4. uniCloud开发公众号:六、解析不同情况下用户扫码后微信推送的事件并完成登录

    算是个系列内容吧,最终要实现的是将uniCloud作为后端完成"扫码关注公众号后完成网站登录" 将要涉及的内容可能包括: 0.准备工作(本节) 1.接受并解析xml消息 2.请求a ...

  5. 如何获取微信openId

    获取微信openid openid定义 为了识别用户,每个用户针对每个公众号会产生一个安全的OpenID,如果需要在多公众号.移动应用之间做用户共通,则需前往微信开放平台,将这些公众号和应用绑定到一个 ...

  6. 青龙面板 JDC2.0.0扫码获取cookie教程

    利用JDC 2.0.0扫码获取cookie 感谢原作者HuaYu @一花一世界 大佬更新软件! 程序测试(可以直接上车) http://cyong.asia:5701/#/ 严禁使用本教程牟利.各位朋 ...

  7. 【工作小tip】项目活动签到码扫码获取不到数据的bug的解决

    先总结 解决了项目活动签到码扫码获取不到数据的bug 1.先跟后端大佬沟通后思考认为扫码是小程序的问题,于是着手改小程序 2.两个微信开发团队用了同一个工程,导致一开始不能二维码编译,换了利军哥的账号 ...

  8. vue获取微信登陆权限_vue 授权获取微信openId操作

    1.获取url中参数code: 根据code 获取openId:调用后台接口获取openId . function getUrlKey(name){//获取url 参数 return decodeUR ...

  9. 扫码进入微信小程序使用WIFI进行UDP通信发送消息

    项目前提:液晶屏不可操作无网络但是有热点,需要通过扫液晶屏上的二维码进入微信小程序配置连接WIFI 业务逻辑:手机扫码进入微信小程序,登录页面输入登录密码进入配置WIFI页面,配置WIFI页面输入当前 ...

  10. 微信开放平台 获取微信openid和unionid

    <?php //官方文档 https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wechat_Login ...

最新文章

  1. 干货讲解 | OKT507-C开发板基于Linux系统的应用笔记
  2. mysql中sex设置男女_MYSQL常用命令(3)
  3. 用计算机组成原理+唐朔飞的,计算机组成原理 唐朔飞 习题解答
  4. android 基础应用程序,android应用程序基本实现(基础篇).ppt
  5. 如何把一个字符串填充到一个无类型的指针 - 回复 豪杰的爸爸 的问题
  6. SpringBoot集成dubbo实例
  7. 并查集【算法笔记/晴神笔记】
  8. ascii码01100001_ASCII码对照表以及各个字符的解释(精华版)
  9. 动手刷LeetCode-转换罗马字符
  10. redis是干什么的
  11. APM代码调试知识点汇总
  12. 十大api接口平台(接口商)
  13. 接口 和 http协议
  14. 从最新艾瑞报告,探寻通信云厂商融云的「护城河」
  15. 腾讯云香港轻量新IP段简单测评
  16. SolarWinds网络工程师工具集
  17. python 统计哈姆雷特词汇频率_Python练习15:文本单词频率统计:哈姆雷特,练习题,英文版...
  18. 动漫常用网站/APP 彻底帮你解决看动漫的烦恼
  19. FPGA实战操作(2) -- PCIe总线(协议简述)
  20. 英语——不定词(一)

热门文章

  1. 去掉iview中模态框中的确定取消按钮
  2. 第5章 演绎推理与归纳推理
  3. 警告warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
  4. html5游戏视频UI框架,几款流行的HTML5 UI 框架比较
  5. Android Studio 使用夜神模拟器查看apk打印日志
  6. 解决其他浏览器能上网谷歌浏览器不能上网
  7. JSON_UNQUOTE 和JSON_EXTRACT
  8. web编辑器——百度UEditor编辑器使用教程与使用方法
  9. C语言之联合与变体记录
  10. C#窗体程序打开Word或Excel文档代码实现