Skip to content

Commit 72f5f7a

Browse files
authored
Merge pull request #2565 from dhyarcher/master
Fix access_token expiration handling by processing expires_in and ref…
2 parents e3d2008 + 7b90fb0 commit 72f5f7a

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed
Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,43 @@
1+
# wechatcomapp_client.py
12
import threading
23
import time
3-
44
from wechatpy.enterprise import WeChatClient
55

6-
76
class WechatComAppClient(WeChatClient):
87
def __init__(self, corp_id, secret, access_token=None, session=None, timeout=None, auto_retry=True):
98
super(WechatComAppClient, self).__init__(corp_id, secret, access_token, session, timeout, auto_retry)
109
self.fetch_access_token_lock = threading.Lock()
10+
self._active_refresh()
11+
12+
def _active_refresh(self):
13+
"""启动主动刷新的后台线程"""
14+
def refresh_loop():
15+
while True:
16+
now = time.time()
17+
expires_at = self.session.get(f"{self.corp_id}_expires_at", 0)
18+
19+
# 提前10分钟刷新(600秒)
20+
if expires_at - now < 600:
21+
with self.fetch_access_token_lock:
22+
# 双重检查避免重复刷新
23+
if self.session.get(f"{self.corp_id}_expires_at", 0) - time.time() < 600:
24+
super(WechatComAppClient, self).fetch_access_token()
25+
# 每次检查间隔60秒
26+
time.sleep(60)
27+
28+
# 启动守护线程
29+
refresh_thread = threading.Thread(
30+
target=refresh_loop,
31+
daemon=True,
32+
name="wechatcom_token_refresh_thread"
33+
)
34+
refresh_thread.start()
1135

12-
def fetch_access_token(self): # 重载父类方法,加锁避免多线程重复获取access_token
36+
def fetch_access_token(self):
1337
with self.fetch_access_token_lock:
1438
access_token = self.session.get(self.access_token_key)
15-
if access_token:
16-
if not self.expires_at:
17-
return access_token
18-
timestamp = time.time()
19-
if self.expires_at - timestamp > 60:
20-
return access_token
21-
return super().fetch_access_token()
39+
expires_at = self.session.get(f"{self.corp_id}_expires_at", 0)
40+
41+
if access_token and expires_at > time.time() + 60:
42+
return access_token
43+
return super().fetch_access_token()

0 commit comments

Comments
 (0)