From dd6a466235e105446c1c6d4534f48d03d98fceb7 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Sun, 2 Mar 2025 23:23:16 +0800 Subject: [PATCH] update --- app/api/endpoints/order.py | 6 ++-- app/api/endpoints/wecom.py | 57 ++++++++------------------------------ app/core/wecomclient.py | 51 ++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 48 deletions(-) diff --git a/app/api/endpoints/order.py b/app/api/endpoints/order.py index 4cb984b..3d9df18 100644 --- a/app/api/endpoints/order.py +++ b/app/api/endpoints/order.py @@ -1038,11 +1038,11 @@ async def complete_order( ) db.commit() - # 如果当前订单是首单,给邀请人发放优惠券 - if order.is_first_order: + # 如果当前订单是首单,如果有邀请人,给邀请人发放优惠券 + if order.is_first_order and order_user.referral_code: # 查询邀请人 invite_user = db.query(UserDB).filter( - UserDB.referral_code == order_user.user_code + UserDB.user_code == order_user.referral_code ).first() if invite_user: diff --git a/app/api/endpoints/wecom.py b/app/api/endpoints/wecom.py index df0cb34..a6bf4cb 100644 --- a/app/api/endpoints/wecom.py +++ b/app/api/endpoints/wecom.py @@ -123,20 +123,8 @@ async def wechat_corp_callback( chat_id = msg_root.find('ChatId').text change_type = msg_root.find('ChangeType').text - if change_type == 'add_member': - - # # 获取数据库会话 - db = next(get_db()) - - # # 查找对应的小区 - # community = db.query(CommunityDB).filter( - # CommunityDB.webot_webhook.isnot(None) - # ).first() - - # if community and community.webot_webhook: - # # 发送欢迎消息 - # wecom_bot = WecomBot() - # await wecom_bot.send_welcome_message(community.webot_webhook) + # if change_type == 'add_member': + # # 获取群聊成员 return Response(content="success", media_type="text/plain") @@ -145,36 +133,15 @@ async def wechat_corp_callback( return Response(content="success", media_type="text/plain") +class UnionidToExternalUseridRequest(BaseModel): + unionid: str + openid: str -class RefreshRequest(BaseModel): - code: str - -@router.get("/access_token") -async def get_access_token(): - access_token = await wecom_client.get_access_token() - return success_response(message="获取企业微信access_token成功", data=access_token) - -@router.post("/refresh") -async def refresh( - request: RefreshRequest, - db: Session = Depends(get_db), - current_user: UserDB = Depends(get_current_user) +@router.post("/unionid_to_external_userid") +async def unionid_to_external_userid( + request: UnionidToExternalUseridRequest ): - if current_user and (current_user.wecom_userid or current_user.wecom_pending_id): - return error_response(code=400, message="用户已绑定企业微信") - - user_info = await wecom_client.code2session(request.code) - print(f"获取到的企业微信用户信息: {user_info}") - if not user_info: - return error_response(code=400, message="获取企业微信用户信息失败") - - if user_info.get("userid"): - current_user.wecom_userid = user_info.get("userid") - else: - current_user.wecom_pending_id = user_info.get("pending_id") - - db.commit() - db.refresh(current_user) - - return success_response(message="企业微信用户信息刷新成功") - + """根据unionid获取external_userid""" + result = await wecom_client.unionid_to_external_userid(request.unionid, request.openid) + print(f"根据unionid获取external_userid结果: {result}") + return success_response(message="获取external_userid成功", data=result) \ No newline at end of file diff --git a/app/core/wecomclient.py b/app/core/wecomclient.py index 0966e35..fad40cb 100644 --- a/app/core/wecomclient.py +++ b/app/core/wecomclient.py @@ -70,5 +70,56 @@ class WecomClient: except Exception as e: logging.error(f"code2session异常: {str(e)}") return None + + async def unionid_to_external_userid(self, unionid: str, openid: str) -> Optional[str]: + """根据unionid获取external_userid""" + try: + url = f"https://qyapi.weixin.qq.com/cgi-bin/idconvert/unionid_to_external_userid?access_token={await self.get_access_token()}" + params = { + "unionid": unionid, + "openid": openid, + "subject_type": 1 + } + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=params) as response: + result = await response.json() + return result + except Exception as e: + logging.error(f"unionid_to_external_userid异常: {str(e)}") + return None + + async def send_welcome_message(self, user_info: Dict[str, Any], group_id: str) -> bool: + """发送欢迎消息""" + try: + # 1. 获取 access_token + access_token = await self.get_access_token() + if not access_token: + logging.error("获取access_token失败") + return False + + # 2. 发送欢迎消息 + url = "https://qyapi.weixin.qq.com/cgi-bin/message/send" + params = { + "access_token": access_token, + "chatid": group_id, + "msgtype": "text", + "text": { + "content": f"欢迎 @{user_info['name']} 加入群聊!\n我们为您准备了专属优惠券,请查收~" + } + } + + async with aiohttp.ClientSession() as session: + async with session.post(url, json=params) as response: + result = await response.json() + if result.get("errcode") == 0: + return True + else: + logging.error(f"发送欢迎消息失败: {result}") + return False + + except Exception as e: + logging.error(f"发送欢迎消息异常: {str(e)}") + return False wecom_client = WecomClient() \ No newline at end of file