From 944644e371d1f0d8f30998caf7d0a8dfbceba0ab Mon Sep 17 00:00:00 2001 From: aaron <> Date: Thu, 27 Feb 2025 18:55:21 +0800 Subject: [PATCH] update --- app/core/wecomclient.py | 93 ++++++++++++++++++++--------------------- 1 file changed, 46 insertions(+), 47 deletions(-) diff --git a/app/core/wecomclient.py b/app/core/wecomclient.py index c71c406..0966e35 100644 --- a/app/core/wecomclient.py +++ b/app/core/wecomclient.py @@ -4,7 +4,7 @@ import time import logging from app.core.config import settings from typing import Dict, Any, Optional, List - +import aiohttp class WecomClient: """企业微信客户端""" @@ -12,64 +12,63 @@ class WecomClient: self.corp_id = settings.WECHAT_CORP_ID self.corp_secret = settings.WECHAT_CORP_SECRET self.access_token = None - self.token_expires_at = 0 async def get_access_token(self) -> str: """获取访问令牌""" - # 检查令牌是否过期 - if self.access_token and time.time() < self.token_expires_at: - return self.access_token - - # 获取新令牌 - url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corp_id}&corpsecret={self.corp_secret}" - try: - response = requests.get(url) - result = response.json() + url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" + params = { + "corpid": self.corp_id, + "corpsecret": self.corp_secret + } - if result.get("errcode") == 0: - self.access_token = result.get("access_token") - self.token_expires_at = time.time() + result.get("expires_in") - 200 # 提前200秒过期 - return self.access_token - else: - logging.error(f"获取企业微信访问令牌失败: {result}") - return None - + async with aiohttp.ClientSession() as session: + async with session.get(url, params=params) as response: + result = await response.json() + + if result.get("errcode") == 0: + self.access_token = result["access_token"] + return self.access_token + else: + raise Exception(f"获取access_token失败: {result}") except Exception as e: - logging.exception(f"获取企业微信访问令牌异常: {str(e)}") + logging.error(f"获取access_token异常: {str(e)}") return None - - async def code2session(self, code: str) -> Optional[Dict[str, Any]]: - """ - 小程序code转换为企业微信userid - Args: - code: 小程序用户的code - - Returns: - Dict: 包含userid或pending_id的字典 + async def code2session(self, js_code: str) -> Optional[Dict[str, Any]]: + """ + 小程序登录凭证校验 """ - token = await self.get_access_token() - if not token: - return None - - url = f"https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session?access_token={token}&js_code={code}&grant_type=authorization_code" - try: - response = requests.get(url) - result = response.json() + # 1. 获取 access_token + access_token = await self.get_access_token() + if not access_token: + raise Exception("获取access_token失败") + + # 2. 调用 jscode2session 接口 + url = "https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session" + params = { + "access_token": access_token, + "js_code": js_code, + "grant_type": "authorization_code" + } - if result.get("errcode") == 0: - return { - "userid": result.get("userid"), - "pending_id": result.get("pending_id") - } - else: - logging.error(f"小程序code转换失败: {result}") - return None - + async with aiohttp.ClientSession() as session: + async with session.get(url, params=params) as response: + result = await response.json() + + if result.get("errcode") == 0: + return { + "userid": result.get("userid"), + "pending_id": result.get("pending_id"), + "session_key": result.get("session_key") + } + else: + logging.error(f"code2session失败: {result}") + return None + except Exception as e: - logging.exception(f"小程序code转换异常: {str(e)}") + logging.error(f"code2session异常: {str(e)}") return None wecom_client = WecomClient() \ No newline at end of file