From 7b90fb018b63281d0cb42a3d01657f66b4b956a5 Mon Sep 17 00:00:00 2001 From: dhyarcher <1014630134@qq.com> Date: Thu, 3 Apr 2025 10:13:57 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20access=5Ftoken=20expiration=20handling=20?= =?UTF-8?q?by=20processing=20expires=5Fin=20and=20refreshing=20the=20token?= =?UTF-8?q?=20when=20expired;=E4=BF=AE=E5=A4=8D=20access=5Ftoken=20?= =?UTF-8?q?=E8=BF=87=E6=9C=9F=E5=A4=84=E7=90=86=EF=BC=8C=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9=20expires=5Fin=20=E7=9A=84=E5=A4=84=E7=90=86=E5=B9=B6?= =?UTF-8?q?=E5=9C=A8=E8=BF=87=E6=9C=9F=E6=97=B6=E5=88=B7=E6=96=B0=20token;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- channel/wechatcom/wechatcomapp_client.py | 42 ++++++++++++++++++------ 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/channel/wechatcom/wechatcomapp_client.py b/channel/wechatcom/wechatcomapp_client.py index c0feb7a..64d8e8a 100644 --- a/channel/wechatcom/wechatcomapp_client.py +++ b/channel/wechatcom/wechatcomapp_client.py @@ -1,21 +1,43 @@ +# wechatcomapp_client.py import threading import time - from wechatpy.enterprise import WeChatClient - class WechatComAppClient(WeChatClient): def __init__(self, corp_id, secret, access_token=None, session=None, timeout=None, auto_retry=True): super(WechatComAppClient, self).__init__(corp_id, secret, access_token, session, timeout, auto_retry) self.fetch_access_token_lock = threading.Lock() + self._active_refresh() + + def _active_refresh(self): + """启动主动刷新的后台线程""" + def refresh_loop(): + while True: + now = time.time() + expires_at = self.session.get(f"{self.corp_id}_expires_at", 0) + + # 提前10分钟刷新(600秒) + if expires_at - now < 600: + with self.fetch_access_token_lock: + # 双重检查避免重复刷新 + if self.session.get(f"{self.corp_id}_expires_at", 0) - time.time() < 600: + super(WechatComAppClient, self).fetch_access_token() + # 每次检查间隔60秒 + time.sleep(60) + + # 启动守护线程 + refresh_thread = threading.Thread( + target=refresh_loop, + daemon=True, + name="wechatcom_token_refresh_thread" + ) + refresh_thread.start() - def fetch_access_token(self): # 重载父类方法,加锁避免多线程重复获取access_token + def fetch_access_token(self): with self.fetch_access_token_lock: access_token = self.session.get(self.access_token_key) - if access_token: - if not self.expires_at: - return access_token - timestamp = time.time() - if self.expires_at - timestamp > 60: - return access_token - return super().fetch_access_token() + expires_at = self.session.get(f"{self.corp_id}_expires_at", 0) + + if access_token and expires_at > time.time() + 60: + return access_token + return super().fetch_access_token() \ No newline at end of file