本文介绍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. Grasp2Vec:通过自我监督式抓取学习物体表征
  2. 检测IIS应用程序池对象 回收
  3. [译]Web 性能优化: 图片优化让网站大小减少 62%
  4. Qt Creator加载占位符数据
  5. 抢疯了~调研了数10+大厂的AI人才需求的公开课,现在免费学
  6. App.vue文件報錯
  7. latex中算法命令_比较Java 8中的命令式和功能性算法
  8. java你可能不知道的事(2)--堆和栈
  9. mysql乐观锁与事务_Mysql中的读锁,写锁,乐观锁及事务隔离级别和并发问题
  10. Python使用模糊哈希值比较文件相似度
  11. js中获取 table节点各tr及td的内容方法
  12. spring boot 教程(四) 统一异常处理
  13. 25.卷1(套接字联网API)--- 信号驱动式IO
  14. 如何给这些textbox中赋值
  15. 个人收藏机器学习教程
  16. 龙讯3号 龙芯电脑即将店面销售
  17. 老客户营销新招 如何拯救店铺复购率
  18. Pytorch模型通过paddlelite部署到嵌入式设备
  19. 和平精英吃鸡捏脸数据助手微信小程序源码
  20. 三星折叠屏手机爆火,但国内市场已经“不需要”

热门文章

  1. 计算几何【套模板,推荐模板】 Separating Pebbles UVALive - 7461
  2. CVPR2004/风格分解:Separating Style and Content on a Nonlinear Manifold在非线性流形上分离样式和内容
  3. w7计算机应用放大按键,Win7窗口最大化和最小化快捷键是什么
  4. 3dsMax一渲染就卡住、3DMAX渲染完卡死怎么办?解决方法来了
  5. c语言字符串把小写转换大写字母,c语言将字符串中的小写字母转换成大写字母...
  6. css 鼠标变成小手
  7. 竹子的故事:送给那些坚持了很久却准备放弃的人 --- 厚积方能薄发
  8. 利用R语言进行主成分分析的步骤
  9. 关于ResourceBundle国际化的一些思考
  10. 精彩Linux 篇章