weixin qrcode_img_content 是微信liteapp HTML页(非图片),后端fetch转base64只得<!doctype>→前端img坏图。 - 后端 login-qr 改返回 qrUrl(qrcode_img_content URL)+qrCode(原始qrcode),去掉坏 qrImage - 前端用 qrcode 库从 qrUrl 生成真实二维码图片(微信扫https链接即开连接页), 新增 qrcode+@types/qrcode(纯UI依赖) - DecodeConfig: nil config map 当空map解码(不报错), 否则 pending账号(空config)构建被跳过→未注册→登录端点404 - 测试更新(DecodeConfigNil/admin QR端点断言 qrUrl+qrCode) - 另有 weixinAccountFor 裸weixin兜底(此前提交 d3b0921) 保证 accountId 命中 - 实测: login-qr 200{waiting, qrUrl=89}, 前端能看到可扫二维码 build/vet/test 全绿, 已部署.
d3b0921
weixin 适配器可能注册为裸 `weixin-ilink`(单账号)而非 `weixin-ilink:<acct>`, weixinAccountFor 只认复合名导致 accountId=05487->404。修为: 按平台匹配 + 优先复合名 + 找不到时兜底用裸 weixin 适配器(面板传config账号id)。实测 accountId=05487 登录端点 200{idle}。build/test绿。
适配器: login_admin.go(StartLogin 幂等取二维码/LoginStatus idle-waiting-confirmed-failed); login.go 重写 Connect 委托 StartLogin+等待,后台 runLogin 轮询,completeLogin/failLogin (锁序 loginMu->a.mu 不嵌套反向无死锁); adapter.go 加登录会话字段 网关: admin_channels_weixin.go(2 端点 login-qr/login-status owner+审计, confirmed 合并写回 channels.json 保留 base_url/cdn/黑白名单 + Reload 热重载连接; qrImage best-effort Base64, token 掩码) + server.go 路由 前端: WeixinLogin.tsx(token空→扫码按钮→二维码→1.5s轮询→confirmed提示已登录+显示bot_id), AdapterDetailPage 渲染, api/types 补类型 必需偏离(最小化): 允许空token的weixin账号被构建/持久化(channels.go+runtimeconfig移出 tokenRequiringPlatforms),否则空token账号无法注册调用StartLogin; 空token保持断开(configured 仍要求token非空),确认后才持久化连接——守红线。 测试: login_admin/admin端点用例; 后端 build/vet/test 全绿 + 前端 build 101模块绿.