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