From 71df2b605bc67a656888c064f52e3f9d39332638 Mon Sep 17 00:00:00 2001 From: zzlgreat Date: Tue, 28 Oct 2025 14:54:45 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88register=E7=AB=AF=E5=8F=A3?= =?UTF-8?q?=E8=BF=9B=E5=85=A5login=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 30 ++++++++++++++++++++++++--- src/components/Auth/WechatRegister.js | 13 ++++++++++++ 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/app.py b/app.py index e7ccd2b8..ef0fbac1 100755 --- a/app.py +++ b/app.py @@ -2487,9 +2487,13 @@ def get_wechat_qrcode(): # 生成唯一state参数 state = uuid.uuid4().hex + print(f"🆕 [QRCODE] 生成新的微信二维码, state={state[:8]}...") + # URL编码回调地址 redirect_uri = urllib.parse.quote_plus(WECHAT_REDIRECT_URI) + print(f"🔗 [QRCODE] 回调地址: {WECHAT_REDIRECT_URI}") + # 构建微信授权URL wechat_auth_url = ( f"https://open.weixin.qq.com/connect/qrconnect?" @@ -2507,6 +2511,8 @@ def get_wechat_qrcode(): 'wechat_unionid': None } + print(f"✅ [QRCODE] session 已存储, 当前总数: {len(wechat_qr_sessions)}") + return jsonify({"code":0, "data": { @@ -2613,32 +2619,48 @@ def wechat_callback(): state = request.args.get('state') error = request.args.get('error') + print(f"🎯 [CALLBACK] 微信回调被调用!code={code[:10] if code else None}..., state={state[:8] if state else None}..., error={error}") + # 错误处理 if error or not code or not state: + print(f"❌ [CALLBACK] 参数错误: error={error}, has_code={bool(code)}, has_state={bool(state)}") return redirect('/auth/signin?error=wechat_auth_failed') # 验证state if state not in wechat_qr_sessions: + print(f"❌ [CALLBACK] state 不在 wechat_qr_sessions 中: {state[:8]}...") + print(f" 当前 sessions: {list(wechat_qr_sessions.keys())}") return redirect('/auth/signin?error=session_expired') session_data = wechat_qr_sessions[state] + print(f"✅ [CALLBACK] 找到 session_data, mode={session_data.get('mode')}") + # 检查过期 if time.time() > session_data['expires']: + print(f"❌ [CALLBACK] session 已过期") del wechat_qr_sessions[state] return redirect('/auth/signin?error=session_expired') try: # 获取access_token + print(f"🔑 [CALLBACK] 开始获取 access_token...") token_data = get_wechat_access_token(code) if not token_data: + print(f"❌ [CALLBACK] 获取 access_token 失败") return redirect('/auth/signin?error=token_failed') + print(f"✅ [CALLBACK] 获取 access_token 成功, openid={token_data.get('openid', '')[:8]}...") + # 获取用户信息 + print(f"👤 [CALLBACK] 开始获取用户信息...") user_info = get_wechat_userinfo(token_data['access_token'], token_data['openid']) if not user_info: + print(f"❌ [CALLBACK] 获取用户信息失败") return redirect('/auth/signin?error=userinfo_failed') + print(f"✅ [CALLBACK] 获取用户信息成功, nickname={user_info.get('nickname', 'N/A')}") + # 查找或创建用户 / 或处理绑定 openid = token_data['openid'] unionid = user_info.get('unionid') or token_data.get('unionid') @@ -2722,7 +2744,7 @@ def wechat_callback(): print(f"🔍 [DEBUG] session_item mode: {mode}, is_new_user: {is_new_user}") # 不是绑定模式才更新为登录状态 if not mode: - new_status = 'register_ready' if is_new_user else 'login_ready' + new_status = 'register_success' if is_new_user else 'login_success' session_item['status'] = new_status session_item['user_info'] = { 'user_id': user.id, @@ -2750,7 +2772,9 @@ def wechat_callback(): ''', 200 except Exception as e: - print(f"❌ 微信登录失败: {e}") + print(f"❌ [CALLBACK] 微信登录失败: {e}") + import traceback + print(f"❌ [CALLBACK] 错误堆栈:\n{traceback.format_exc()}") db.session.rollback() return redirect('/auth/signin?error=login_failed') @@ -2770,7 +2794,7 @@ def login_with_wechat(): return jsonify({'success': False, 'error': '会话不存在或已过期'}), 400 # 检查session状态 - if wechat_session['status'] not in ['login_ready', 'register_ready']: + if wechat_session['status'] not in ['login_success', 'register_success']: return jsonify({'success': False, 'error': '会话状态无效'}), 400 # 检查是否有用户信息 diff --git a/src/components/Auth/WechatRegister.js b/src/components/Auth/WechatRegister.js index 67f81447..9f32451c 100644 --- a/src/components/Auth/WechatRegister.js +++ b/src/components/Auth/WechatRegister.js @@ -111,8 +111,12 @@ export default function WechatRegister() { */ const handleLoginSuccess = useCallback(async (sessionId, status) => { try { + logger.info('WechatRegister', '开始调用登录接口', { sessionId: sessionId.substring(0, 8) + '...', status }); + const response = await authService.loginWithWechat(sessionId); + logger.info('WechatRegister', '登录接口返回', { success: response?.success, hasUser: !!response?.user }); + if (response?.success) { // Session cookie 会自动管理,不需要手动存储 // 如果后端返回了 token,可以选择性存储(兼容旧方式) @@ -128,6 +132,8 @@ export default function WechatRegister() { "正在跳转..." ); + logger.info('WechatRegister', '准备跳转到首页'); + // 延迟跳转,让用户看到成功提示 setTimeout(() => { navigate("/home"); @@ -159,6 +165,12 @@ export default function WechatRegister() { const { status } = response; + logger.debug('WechatRegister', '检测到微信状态', { + sessionId: wechatSessionId.substring(0, 8) + '...', + status, + userInfo: response.user_info + }); + // 组件卸载后不再更新状态 if (!isMountedRef.current) return; @@ -166,6 +178,7 @@ export default function WechatRegister() { // 处理成功状态 if (status === WECHAT_STATUS.LOGIN_SUCCESS || status === WECHAT_STATUS.REGISTER_SUCCESS) { + logger.info('WechatRegister', '检测到登录成功状态,停止轮询', { status }); clearTimers(); // 停止轮询 // 显示"扫码成功,登录中"提示