1+ # wechatcomapp_client.py
12import threading
23import time
3-
44from wechatpy .enterprise import WeChatClient
55
6-
76class 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