From 796c8d34317178a08b4c14abf53546ec3214e2f1 Mon Sep 17 00:00:00 2001 From: stswangzhiping <59632378+stswangzhiping@users.noreply.github.com> Date: Fri, 15 May 2026 17:27:57 +0800 Subject: [PATCH] fix: handle binded_redirect state inconsistency in WeChat login Co-authored-by: Cursor --- lib/channel/weixin.js | 23 ++++++++++++++++++++--- package.json | 2 +- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/lib/channel/weixin.js b/lib/channel/weixin.js index 8f9ef6a..6c2bcc5 100644 --- a/lib/channel/weixin.js +++ b/lib/channel/weixin.js @@ -385,10 +385,27 @@ async function _runLogin({ callId, timeoutMs, botType, emit, isAborted }) { break; } - case 'binded_redirect': - log.info('weixin', `callId=${callId} already connected`); - emit({ action: 'finish', event: 'success', data: { accountId: 'already_connected' } }); + case 'binded_redirect': { + // WeChat server considers this OpenClaw already bound. + // Check if local token exists — if yes, treat as success; if not, local state was + // cleared (e.g. logout) but remote binding wasn't revoked → state inconsistency. + const indexedIds = _listIndexedAccountIds(); + const hasLocalToken = indexedIds.some(id => { + const acct = _loadAccount(id); + return acct && acct.token; + }); + if (hasLocalToken) { + log.info('weixin', `callId=${callId} already connected, local token intact`); + emit({ action: 'finish', event: 'success', data: { accountId: indexedIds[0] } }); + } else { + log.warn('weixin', `callId=${callId} binded_redirect but local token missing — state inconsistency`); + emit({ + action: 'finish', event: 'failed', code: 1010, + message: '微信服务端已绑定,但本地登录状态已清除。请在微信公众号后台解绑此 OpenClaw 后重新扫码登录。', + }); + } return; + } case 'confirmed': { if (!status.ilink_bot_id) throw new Error('confirmed: missing ilink_bot_id'); diff --git a/package.json b/package.json index 7f84e99..fe746c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clawd", - "version": "1.4.0", + "version": "1.4.1", "description": "Claw Box daemon - connects local Linux box to claw.cutos.ai via WebSocket", "main": "lib/client.js", "bin": {