From 442d6f08624eb8144d0e36927f5b8d65395afb81 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Wed, 26 Feb 2025 18:22:43 +0800 Subject: [PATCH] update --- app/core/wecomclient.py | 68 ++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 21 deletions(-) diff --git a/app/core/wecomclient.py b/app/core/wecomclient.py index b85ea18..c5029fa 100644 --- a/app/core/wecomclient.py +++ b/app/core/wecomclient.py @@ -1,47 +1,49 @@ -from typing import Optional, Dict import aiohttp -import logging from app.core.config import settings +import logging +from typing import Optional, Dict class WecomClient: def __init__(self): self.corpid = settings.WECHAT_CORP_ID - self.provider_secret = settings.WECHAT_CORP_SECRET + self.secret = settings.WECHAT_CORP_SECRET # 注意:这里使用普通的 secret,不是 provider_secret self.access_token = None - async def get_provider_token(self) -> str: - """获取服务商token""" + async def get_access_token(self) -> str: + """获取企业微信普通access_token""" try: - url = "https://qyapi.weixin.qq.com/cgi-bin/service/get_provider_token" - data = { + url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken" + params = { "corpid": self.corpid, - "provider_secret": self.provider_secret + "corpsecret": self.secret } async with aiohttp.ClientSession() as session: - async with session.post(url, json=data) as response: + async with session.get(url, params=params) as response: result = await response.json() if result.get("errcode") == 0: - self.access_token = result["provider_access_token"] + self.access_token = result["access_token"] return self.access_token else: - raise Exception(f"获取provider_token失败: {result}") + logging.error(f"获取access_token返回: {result}") + raise Exception(f"获取access_token失败: {result}") except Exception as e: - logging.error(f"获取provider_token失败: {str(e)}") + logging.error(f"获取access_token失败: {str(e)}") raise - async def miniprogram_to_userid(self, openid: str) -> Optional[Dict]: + async def miniprogram_to_userid(self, code: str) -> Optional[Dict]: """ - 小程序openid转换为企业微信userid + 小程序code转换为企业微信userid + 注意:这里使用code而不是openid """ try: - url = "https://qyapi.weixin.qq.com/cgi-bin/service/miniprogram/jscode2session" + url = "https://qyapi.weixin.qq.com/cgi-bin/miniprogram/jscode2session" params = { - "provider_access_token": await self.get_provider_token(), - "appid": settings.WECHAT_APPID, - "code": openid + "access_token": await self.get_access_token(), + "js_code": code, + "grant_type": "authorization_code" } async with aiohttp.ClientSession() as session: @@ -51,13 +53,37 @@ class WecomClient: if result.get("errcode") == 0: data = { "userid": result.get("userid"), - "pending_id": result.get("pending_id") + "pending_id": result.get("pending_id"), + "session_key": result.get("session_key") } return data else: - logging.error(f"openid转换失败: {result}") + logging.error(f"code转换失败: {result}") return None except Exception as e: - logging.error(f"openid转换失败: {str(e)}") + logging.error(f"code转换失败: {str(e)}") + return None + + async def get_user_info(self, userid: str) -> Optional[Dict]: + """获取企业成员信息""" + try: + url = "https://qyapi.weixin.qq.com/cgi-bin/user/get" + params = { + "access_token": await self.get_access_token(), + "userid": userid + } + + 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 result + else: + logging.error(f"获取用户信息失败: {result}") + return None + + except Exception as e: + logging.error(f"获取用户信息失败: {str(e)}") return None \ No newline at end of file