diff --git a/app_vx.py b/app_vx.py index a8236adc..2b643f71 100644 --- a/app_vx.py +++ b/app_vx.py @@ -4002,6 +4002,9 @@ def api_login_wechat(): session['logged_in'] = True # 9. 构造返回数据 - 完全匹配要求的格式 + # 手机绑定状态 + phone_bindcd = bool(user.phone and user.phone_confirmed) + response_data = { 'code': 200, 'data': { @@ -4016,7 +4019,10 @@ def api_login_wechat(): 'nickname': user.nickname or user.username, 'reputation_score': user.reputation_score, 'user_level': user.user_level, - 'username': user.username + 'username': user.username, + # 手机绑定状态 + 'phone_bindcd': phone_bindcd, + 'phone': user.phone if phone_bindcd else None } }, 'message': '登录成功' @@ -4047,27 +4053,30 @@ def api_login_wechat(): # ============================================ # 微信获取手机号接口 # ============================================ -# 缓存微信 access_token -_wechat_access_token_cache = { - 'token': None, - 'expires_at': 0 -} +# 微信 access_token 缓存 Key +_WECHAT_ACCESS_TOKEN_KEY = 'vf_wechat_access_token' def get_wechat_access_token(): """ - 获取微信小程序 access_token(带缓存) + 获取微信小程序 access_token(使用 Redis 缓存,支持多 worker 共享) access_token 有效期为 7200 秒,提前 5 分钟刷新 """ import time - global _wechat_access_token_cache - current_time = time.time() + try: + import redis + redis_client = redis.from_url(os.environ.get('REDIS_URL', 'redis://localhost:6379/0')) - # 如果缓存有效(提前5分钟刷新) - if (_wechat_access_token_cache['token'] and - _wechat_access_token_cache['expires_at'] > current_time + 300): - return _wechat_access_token_cache['token'] + # 尝试从 Redis 获取缓存的 token + cached = redis_client.get(_WECHAT_ACCESS_TOKEN_KEY) + if cached: + logger.debug("从 Redis 获取微信 access_token") + return cached.decode('utf-8') + + except Exception as e: + logger.warning(f"Redis 获取 access_token 失败: {e},将直接请求微信接口") + redis_client = None # 请求新的 access_token url = 'https://api.weixin.qq.com/cgi-bin/token' @@ -4082,10 +4091,18 @@ def get_wechat_access_token(): result = response.json() if 'access_token' in result: - _wechat_access_token_cache['token'] = result['access_token'] - _wechat_access_token_cache['expires_at'] = current_time + result.get('expires_in', 7200) - logger.info(f"获取微信 access_token 成功,有效期: {result.get('expires_in', 7200)}秒") - return result['access_token'] + access_token = result['access_token'] + expires_in = result.get('expires_in', 7200) + + # 存入 Redis(提前 5 分钟过期,确保不会使用即将过期的 token) + if redis_client: + try: + redis_client.setex(_WECHAT_ACCESS_TOKEN_KEY, expires_in - 300, access_token) + logger.info(f"微信 access_token 已缓存到 Redis,有效期: {expires_in - 300}秒") + except Exception as e: + logger.warning(f"Redis 缓存 access_token 失败: {e}") + + return access_token else: logger.error(f"获取微信 access_token 失败: {result}") return None