From 427c0aef188a4e82acbddc3982552c2f1548999e Mon Sep 17 00:00:00 2001 From: API Changelog Bot Date: Tue, 5 May 2026 12:21:47 +0800 Subject: [PATCH] =?UTF-8?q?feat(wx-security):=20Phase=202A=20UGC=20?= =?UTF-8?q?=E6=8E=A5=E5=85=A5=20+=20=E5=85=AC=E5=BC=80=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=20+=20MQ=20Consumer=20(PR=20#1661=20/=20Issu?= =?UTF-8?q?e=20#1660)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2026-05/05_feat_wx-security_phase2a.md | 77 +++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 changelogs/2026-05/05_feat_wx-security_phase2a.md diff --git a/changelogs/2026-05/05_feat_wx-security_phase2a.md b/changelogs/2026-05/05_feat_wx-security_phase2a.md new file mode 100644 index 0000000..ce72fa3 --- /dev/null +++ b/changelogs/2026-05/05_feat_wx-security_phase2a.md @@ -0,0 +1,77 @@ +# feat(wx-security): Phase 2A UGC 接入 + 公开列表过滤 + MQ Consumer + +**PR**: [#1661](https://git.1814.love:8443/wx/HL/pulls/1661) **Issue**: [#1660](https://git.1814.love:8443/wx/HL/issues/1660) **合并**: 2026-05-05 + +让 Phase 1 (#1659) 基础设施真正落地业务,覆盖契约 §3-§5。 + +## UGC API body 字段新增 `mediaTraceIds: string[]` + +前端调 `POST /mp/security/media-check` 拿到 traceId 后,在以下 5 个业务 API body 中传 traceId 数组: + +| API | 业务表 | 字段 | +|---|---|---| +| POST /mp/review/create | order_review | media_trace_ids | +| POST /mp/complaint/create | order_complaint | media_trace_ids | +| POST /mp/order/{}/refund | refund_application | media_trace_ids | +| POST /mp/order/.../appeal /direct-appeal | refund_application | media_trace_ids | +| POST /mp/common/feedback | user_feedback (V20260505_003 增量 SQL) | media_trace_ids | + +## 公开列表强制 audit_status='APPROVED' 过滤 + +8 个 Mapper 公开方法叠加 wx 机审过滤: +- selectTargetApprovedPage / selectAllReviewsPage / selectFeaturedReviews / selectTargetsApprovedPage / selectSearchPage +- selectTopRatedByProduct / selectTopLikedByProduct / selectGoodWithImageByProduct / selectCustomizerReviewsPage + +`/mp/review/my` 私有列表**不**过滤;`MpReviewVO` 加 `auditStatus` 字段供前端展示状态条文案: +- PENDING → "审核中,通过后展示" +- APPROVED → 无提示 +- MANUAL_REVIEW → "审核中,预计 24h 内" +- REJECTED → "内容未通过审核" + +## MQ Consumer 双服务订阅 wx-content-audit-result + +异步审核结果广播到 order-v2 + user-service,各自按 trace_id 反查更新业务表 audit_status: + +**order-v2** 反查 review/complaint/refund 三表: +- 通过 `WxSecurityFeignClient` 跨 schema 调 user-service `GET /internal/security/trace-status`(≤50 batch)拿其他 trace 状态 +- `WxAuditStatusResolver` 聚合:任一 REJECTED→REJECTED / 任一 MANUAL→MANUAL / 全 APPROVED→APPROVED / 否则维持 PENDING +- REJECTED 联动:review status=REJECTED + 业务隐藏;complaint status=WITHDRAWN + 软删 deletedAt;refund 仅更新 audit_status + +**user-service** 反查 user_feedback + user.avatar_trace_id: +- avatar REJECTED 时重置为 `wechat.miniapp.default-avatar-url` 配置项 + +## 跨服务接口 (前端不用关心,内部调用) + +- `WxSecurityFeignClient` (hl-common-feign) + Fallback (返空 List 不阻塞业务) +- `GET /internal/security/trace-status?traceIds=t1,t2,...` user-service 暴露 +- `POST /internal/mp/feedback` mp-service 透传 feedback 到 user-service 落库 + +## 跨服务统一常量 + +`WxAuditStatusConstants` (hl-common-core) `PENDING/APPROVED/MANUAL_REVIEW/REJECTED`,替换 17+ 散落字面量。 + +## 前端契约要点 (mmg) + +- 评价/投诉/退款/申诉/反馈 5 个业务 API body 加 `mediaTraceIds: string[]` 字段(前端先调 `/mp/security/media-check` 拿 traceId 数组) +- 评价响应 VO 加 `auditStatus` 字段(私有列表展示用) +- 公开列表(产品评价、首页精选、定制师评价、旅行相册)已自动过滤未审核内容 + +## Phase 2 剩余范围(独立工单跟进) + +- Phase 2B:评价举报子系统(POST /mp/review/report + 阈值 3/10) +- Phase 2C:出行人三层兜底(异步审 + 选用挡 REJECTED + 本地正则) +- Phase 2D:hl-admin 后台(复审队列 + 命中日志 + 白名单 + 举报队列 + 头像违规处置) +- Phase 2E:AES 加密回调模式(Phase 1 仅明文) + +## 待办(无新增,与 Phase 1 共用) + +- 微信公众平台开通「内容安全」接口权限 +- 配置回调 URL + Token(明文模式) +- nacos `wechat.miniapp.webhook.token` + `wechat.miniapp.default-avatar-url`(新加,REJECTED 头像重置目标 URL,未配置则只更新 audit_status 不动 avatar) + +## 测试 + +- mvn compile 全工程 BUILD SUCCESS +- mvn test 145/145 全绿(user-service 44 + order-v2 101) +- CR 通过:2 P0 + 3 P1 全修(详见 PR body) +- 留 cleanup PR:P1-4 / P1-5 / 6 P2