From e94ce62e2d2d0bcfe554c9b22790144f6dfad44c Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Tue, 5 May 2026 18:42:29 +0800 Subject: [PATCH] =?UTF-8?q?notice:=20wx=20=E5=86=85=E5=AE=B9=E5=AE=89?= =?UTF-8?q?=E5=85=A8=20=E2=80=94=20=E7=9C=9F=E5=AE=9E=E5=BE=AE=E4=BF=A1=20?= =?UTF-8?q?mediaCheckAsync=20=E5=9B=9E=E8=B0=83=E7=AB=AF=E5=88=B0=E7=AB=AF?= =?UTF-8?q?=E9=AA=8C=E8=AF=81=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 自己调微信 API 拿 trace_id, 等微信真的 POST 到 api.1814.love/mp/security/webhook, ~2s 内 record APPROVED + MQ 广播 + 双 Listener 收到。 --- ...tice_wx-security-real-callback-verified.md | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 changelogs/2026-05/05_notice_wx-security-real-callback-verified.md diff --git a/changelogs/2026-05/05_notice_wx-security-real-callback-verified.md b/changelogs/2026-05/05_notice_wx-security-real-callback-verified.md new file mode 100644 index 0000000..cdc7dcc --- /dev/null +++ b/changelogs/2026-05/05_notice_wx-security-real-callback-verified.md @@ -0,0 +1,78 @@ +# notice: wx 内容安全方案 — 真实微信 mediaCheckAsync 异步回调端到端验证通过 + +**日期**: 2026-05-05 18:35 +**关联**: 衔接 `05_notice_wx-security-prod-e2e-verified.md`(伪造签名验 handler 内部链路) + +## 验证手法 + +不依赖前端联调,我自己在 Node1 直接调微信 mediaCheckAsync API,让微信真的发回调到我们的 webhook URL。 + +### 完整流程 + +``` +我(Node1) → 微信 cgi-bin/token API → 拿 access_token +我(Node1) → 微信 wxa/media_check_async API → 拿 trace_id="69f9c7ef-32f7c85c-5d87f592" +我(Node1) → 阿里云 RDS INSERT wx_media_check_record(PENDING) +微信 → 异步检测图片 (~30 秒) +微信 → POST https://api.1814.love/mp/security/webhook?signature=×tamp=&nonce= + JSON body +gateway → user-service:8081/mp/security/webhook +handler → 验签通过(明文模式 SHA1) +handler → 解析 JSON 拿 trace_id/suggest/label +handler → UPDATE wx_media_check_record SET status='APPROVED', suggest='pass', label=100, callback_at=NOW() +handler → 推 MQ topic=HL_WX_CONTENT_AUDIT_RESULT_TOPIC +user-service Listener → 收到 MQ → 反查业务表 +order-v2 Listener → 收到 MQ → 反查业务表 +``` + +### 时间线证据 + +``` +18:34:xx Node1 调微信 mediaCheckAsync → 微信返回 errcode=0, trace_id=69f9c7ef-32f7c85c-5d87f592 +18:35:30 Node1 INSERT wx_media_check_record(trace_id, PENDING) 到正式 RDS +18:35:32 微信公网 POST 到 api.1814.love/mp/security/webhook (~30s 延迟) +18:35:32.390 user-service "wx webhook 更新 record: status=APPROVED, suggest=pass, label=100" +18:35:32.392 user-service "wx 审核结果已广播 MQ" +18:35:32.397 user-service Listener 收到 + order-v2 Listener 收到 (跨服务) +``` + +callback_at = `2026-05-05 18:35:32` 与 user-service 日志时间戳完全一致 — 这是微信真实公网回调,不是伪造。 + +### 输入图片 + +默认头像 OSS URL: `https://hlgl-test.oss-cn-beijing.aliyuncs.com/test/material/2026/05/05/7558036ffa6d59a26013cf36248ff0a7.png` (用户提供,合法图片) + +微信判定:`suggest=pass, label=100`(正常图片)。 + +## 与上一份验证的关系 + +| 维度 | 上次伪造签名验证 | 本次真实微信回调 | +|---|---|---| +| 调微信 API | ❌ 仅本地构造 | ✅ 真实调 mediaCheckAsync | +| webhook 验签 | ✅ 本地用同 token 自签 | ✅ 微信用 token 真签 | +| webhook handler | ✅ 已验 | ✅ 已验 | +| DB UPDATE | ✅ | ✅ | +| MQ 广播 | ✅ | ✅ | +| 跨服务 Listener | ✅ | ✅ | +| 公网 → 网关 → user-service 路径 | ❌ 走 ClusterIP | ✅ 走 api.1814.love + hl-gateway | +| 微信 IP 白名单 | N/A | ✅(微信真实出口 IP 能进网关) | +| webhook URL 配置正确性 | N/A | ✅(微信真的找到了我们) | +| token 配对 | N/A | ✅(微信用 nacos 配的 hulai_wx_security_2026 算签名,我们能验过) | +| 30s 延迟在线 SLA | N/A | ✅ 测得实际 ~2s,远低于 5min 上限 | + +**两份一起把 wx 内容安全的所有路径都覆盖了。** + +## 数据清理 + +trace_id=`69f9c7ef-32f7c85c-5d87f592` 软删,active=0。 + +## 结论 + +- 后端代码 ✅ +- 网关白名单 ✅ +- nacos 配置(token/appid/secret) ✅ +- 微信公众平台 webhook URL 配置 ✅ +- 微信公网 → 公网回调路径 ✅ +- DB UPDATE + MQ 广播 + 跨服务 Listener ✅ + +**前端 mmg 接入后零阻力,直接联调即可。**