文件
hyb-oa/issues/2026-05-19_14-11-20-wecom-approval-callback-readonly-poc-v1.csv

12 KiB

1IDTitleDescriptionAcceptanceTest_MethodToolsDev_StatusReview1_StatusRegression_StatusFilesDependenciesNotes
2WCBK1-0回调只读 POC 合同建档与边界冻结建立 WCBK1 企微审批回调只读 POC 合同;承接 WAPC2FLIVE 已创建 OA-POC 请假/补卡测试模板和低风险测试审批单,下一步只验证真实回调 URL、验签、解密、归一化、幂等和脱敏证据,不进入 wecom_attendance_approval_mirror_v1。1) CSV 校验通过;2) 固定只读范围为请假 + 补卡;3) 固定 WECOM_APPROVAL_CALLBACK_URL、WECOM_CALLBACK_TOKEN、WECOM_CALLBACK_ENCODING_AES_KEY;4) 回调属于自建应用审批能力,不使用通讯录 Secret,不尝试其他 Secret,不允许运行时猜 Secret;5) 缺配置记录 NEEDS_CONFIG,企微权限/可信 IP/可见范围/验签/解密阻断记录 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;6) 不写 OA 业务镜像、不写企微数据、不创建新模板或审批单;7) 不保存原始 XML、密文、完整 sp_no、完整 userid、完整 template_id、Token、EncodingAESKey、表单值、附件、评论或原始 payload。受影响流程:WAPC2FLIVE 样件 -> WCBK1 回调只读 POC -> WACP3 补偿拉取 POC -> WADM1 镜像数据模型设计;验证步骤:python3 /home/shunli/.codex/skills/plan/scripts/validate_issues_csv.py issues/2026-05-19_14-11-20-wecom-approval-callback-readonly-poc-v1.csv;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-19_14-11-20-wecom-approval-callback-readonly-poc-v1.csv --profile wecom-callback --json。python3|nodeDONEDONEDONEissues/2026-05-19_14-11-20-wecom-approval-callback-readonly-poc-v1.csv[]回滚/清理:本轮只新增只读回调端点、QA runner 和脱敏证据文件;CSV 与 wecom-callback process gate 已通过;如失败可停用回调 URL 或移除新增路由,不影响已保留审计的 OA-POC 样件。
3WCBK1-1process gate 增加企微回调 profile扩展 scripts/qa/check-process-contract.mjs,新增 wecom-callback profile,强制检查回调 URL、Token、EncodingAESKey、只读范围、缺配置分类、无 Secret fallback、脱敏边界和不得跳过 WACP3/WADM1。1) --profile wecom-callback 可解析并通过本 CSV;2) baseline gate 继续通过;3) 旧 wecom-approval-fixture profile 不回归;4) 关键词 WCBK1、WACP3、WADM1、WECOM_CALLBACK_TOKEN、WECOM_CALLBACK_ENCODING_AES_KEY、BLOCKED_BY_EXTERNAL_CONFIG 被覆盖。受影响流程:Issue CSV -> process gate -> 企微高风险能力准入;验证步骤:node --check scripts/qa/check-process-contract.mjs;node scripts/qa/check-process-contract.mjs --baseline --json;node scripts/qa/check-process-contract.mjs --issue issues/2026-05-19_14-11-20-wecom-approval-callback-readonly-poc-v1.csv --profile wecom-callback --json;cd server && npx vitest run tests/unit/scripts/check-process-contract.test.js --reporter=verbose。node|vitestDONEDONEDONEscripts/qa/check-process-contract.mjs|server/tests/unit/scripts/check-process-contract.test.js["WCBK1-0"]回滚/清理:process gate 为 QA-only 脚本,不影响运行时;失败时移除 wecom-callback profile 或修正规则。
4WCBK1-2企微回调加解密服务新增 wecomCallbackCrypto 服务,按企业微信回调规则实现 msg_signature 验签、EncodingAESKey AES 解密、URL 验证 echostr 解密、事件 XML 解析、审批事件归一化和脱敏摘要。1) 使用 WECOM_CALLBACK_TOKEN 和 WECOM_CALLBACK_ENCODING_AES_KEY;2) 签名按 token/timestamp/nonce/encrypt 排序后 SHA1;3) AES 解密校验 receiveId 与 WECOM_CORP_ID;4) XML 解析不输出原始 XML 或密文;5) 审批事件只归一化事件类型、审批状态、脱敏 sp_no/template 前缀和时间摘要;6) 缺配置或解密失败分类清晰。受影响流程:企微加密回调 -> 服务端验签解密 -> 只读事件摘要;验证步骤:cd server && node --check src/services/integrations/wecomCallbackCrypto.js;cd server && npx vitest run tests/unit/services/wecomCallbackCrypto.test.js --reporter=verbose。node|vitestDONEDONEDONEserver/src/services/integrations/wecomCallbackCrypto.js|server/tests/unit/services/wecomCallbackCrypto.test.js["WCBK1-1"]回滚/清理:新增服务无业务写入;如失败可移除服务和调用点。
5WCBK1-3只读回调路由新增 /api/wecom/approval/callback GET/POST 路由;GET 用于企微 URL 验证,POST 接收审批状态变化事件,验签解密后只写脱敏 POC 证据,不落业务镜像表。1) GET /api/wecom/approval/callback 能返回解密后的 echostr;2) POST /api/wecom/approval/callback 验签/解密/解析成功后返回 success;3) 错误签名返回阻断,不伪造成成功;4) 只写 artifacts/qa-flow 下脱敏事件证据,不保存原始 XML、密文、完整 sp_no、完整 userid、完整 template_id、Token、EncodingAESKey、表单值、附件、评论或原始 payload;5) 重复事件按幂等键去重;6) 不要求登录鉴权,避免企微回调被 OA 登录拦截。受影响流程:企微后台回调 URL 验证 -> 真实审批状态回调 -> 脱敏证据留存;验证步骤:cd server && node --check src/routes/wecomApprovalCallback.js;cd server && npx vitest run tests/unit/routes/wecomApprovalCallback.test.js --reporter=verbose。node|vitestDONEDONEDONEserver/src/routes/wecomApprovalCallback.js|server/src/app.js|server/tests/unit/routes/wecomApprovalCallback.test.js["WCBK1-2"]回滚/清理:如公网验证失败,可从企微后台移除 Callback URL 或删除新增路由;证据文件只含脱敏 POC 摘要。
6WCBK1-4QA-only 回调 POC runner新增 check-wecom-approval-callback-poc runner 和 package 脚本;默认 synthetic/dry-run 本地生成加密样例验证验签、解密、解析和脱敏;live 模式检查公网 URL 验证和真实事件证据。1) npm run check:wecom-approval-callback-poc 可执行;2) 缺 WECOM_APPROVAL_CALLBACK_URL、WECOM_CALLBACK_TOKEN 或 WECOM_CALLBACK_ENCODING_AES_KEY 时输出 PARTIAL_CALLBACK_NEEDS_CONFIG;3) live URL 验证通过输出 PASS_CALLBACK_URL_VERIFIED;4) 真实事件证据存在后输出 PASS_CALLBACK_EVENT_CONFIRMED;5) 验签/解密/公网阻断输出 SKIP/BLOCKED_BY_EXTERNAL_CONFIG;6) 报告不泄露密钥、原始 XML、完整 sp_no 或完整 userid。受影响流程:本地 synthetic 回调验证 -> 公网 URL 验证 -> 真实审批事件证据检查;验证步骤:cd server && node --check src/scripts/check-wecom-approval-callback-poc.js;cd server && npx vitest run tests/unit/scripts/check-wecom-approval-callback-poc.test.js --reporter=verbose。node|npm|vitestDONEDONEDONEserver/src/scripts/check-wecom-approval-callback-poc.js|server/package.json|server/tests/unit/scripts/check-wecom-approval-callback-poc.test.js["WCBK1-3"]回滚/清理:runner 为 QA-only;失败时不影响业务运行,也不会写 OA/企微业务数据。
7WCBK1-5配置口径与缺口分类在 server config 和 runtime ready 事实口径中固化 WECOM_APPROVAL_CALLBACK_URL、WECOM_CALLBACK_TOKEN、WECOM_CALLBACK_ENCODING_AES_KEY;不得使用通讯录 Secret 或历史别名作为默认。1) config 可读取三个回调变量;2) 新 WCBK1 代码只读取固定变量,不尝试其他 Secret;3) 缺变量统一分类为 PARTIAL_CALLBACK_NEEDS_CONFIG 或 NEEDS_CONFIG;4) 文档提示密钥仅进部署环境,不写仓库或聊天。受影响流程:部署环境配置 -> 回调 POC runner -> 公网回调验证;验证步骤:cd server && node --check src/config.js;rg -n 'WECOM_APPROVAL_CALLBACK_URL|WECOM_CALLBACK_TOKEN|WECOM_CALLBACK_ENCODING_AES_KEY|WECOM_CALLBACK_AES_KEY' server/src docs .agents/skills/hyb-oa-delivery/SKILL.md。node|rgDONEDONEDONEserver/src/config.js|docs/企微API能力目录.md["WCBK1-4"]回滚/清理:新增配置字段为空不启用写入;不持久化密钥值。
8WCBK1-6事实源回写更新路线图、API 能力目录、统一审批规约、企业微信基础设施规约、试运行报告、文档索引、事实源矩阵和项目 skill,记录 WCBK1 的只读边界、配置项、报告语义和后续 WACP3/WADM1 顺序。1) 文档明确 WCBK1 只证明回调链路,不代表镜像实现;2) 文档明确 WCBK1 后仍需 WACP3 补偿拉取 POC 和 WADM1 镜像数据模型设计;3) 文档不保存 Token、EncodingAESKey、完整 sp_no、完整 userid 或原始 XML;4) 文档索引和事实源矩阵登记本轮状态。受影响流程:WCBK1 证据回写 -> 后续路线判断;验证步骤:node scripts/qa/audit-docs.mjs --check-registry;python3 /home/shunli/.codex/skills/.system/skill-creator/scripts/quick_validate.py .agents/skills/hyb-oa-delivery;rg -n 'WCBK1|PASS_CALLBACK_URL_VERIFIED|PASS_CALLBACK_EVENT_CONFIRMED|WACP3|WADM1|WECOM_CALLBACK_ENCODING_AES_KEY' docs .agents/skills/hyb-oa-delivery/SKILL.md。node|python3|rgDONEDONEDONEdocs/企微优先开发路线图.md|docs/企微API能力目录.md|docs/需求-统一审批中心规约.md|docs/需求-企业微信基础设施规约.md|docs/trialrun/人工试运行报告.md|docs/文档索引.md|docs/文档事实源状态矩阵.md|.agents/skills/hyb-oa-delivery/SKILL.md["WCBK1-5"]回滚/清理:文档只记录事实源和脱敏报告语义,不写密钥或原始回调。
9WCBK1-7本地门禁与公网 dry-run 部署执行本地静态、focused vitest、process gate、文档门禁和最小门禁;通过后以 SYNC_ENV=0 受控部署,远端执行 runner synthetic/dry-run,不同步本地 env、不配置真实密钥。1) CSV、process gate、node --check、Prisma、focused vitest、文档审计、skill 校验、git diff --check、scripts/check-minimal.sh 通过;2) SYNC_ENV=0 部署成功;3) /ready 正常;4) 远端 runner 在未配置真实回调密钥时输出 PARTIAL_CALLBACK_NEEDS_CONFIG 且 synthetic check OK,不伪造成 PASS。受影响流程:本地实现 -> 受控部署 -> 公网 dry-run 证据;验证步骤:cd server && npm run prisma:validate;cd server && npx vitest run tests/unit/routes/wecomApprovalCallback.test.js tests/unit/services/wecomCallbackCrypto.test.js tests/unit/scripts/check-wecom-approval-callback-poc.test.js tests/unit/scripts/check-process-contract.test.js --reporter=verbose;git diff --check;bash scripts/check-minimal.sh;SYNC_ENV=0 bash deploy/trialrun/deploy.sh;远端 npm run check:wecom-approval-callback-poc -- --format=json。node|npm|vitest|bash|sshDONEDONEDONEexternal["WCBK1-6"]回滚/清理:本地 CSV/process gate/node --check/Prisma/focused vitest/git diff --check/scripts/check-minimal.sh 均通过;SYNC_ENV=0 部署成功;/ready 正常;远端报告 /app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T065414Z/summary.json 为 PARTIAL_CALLBACK_NEEDS_CONFIG 且 synthetic OK;未配置真实回调密钥时不会接收真实事件。
10WCBK1-8状态回填、提交与人工配置说明按实际结果回填 WCBK1 状态并中文提交;最终输出 Callback URL、需要配置的环境变量名和人工触发步骤。1) Issue 状态按实际结果回填;2) 中文提交为 WCBK1 实现企微审批回调只读 POC;3) 最终说明当前状态、改了什么、测试了什么、结果是什么、部署状态、Callback URL、环境变量名、企微后台配置步骤和 SMOKE101 处理现有测试单的人工动作;4) 不输出任何密钥值。受影响流程:WCBK1 交付闭环 -> 人工配置回调 -> 后续真实事件确认;验证步骤:git status --short;git log --oneline -1;最终问答说明配置后复跑 live runner 和真实事件触发步骤。gitDONEDONEDONEN/A["WCBK1-7"]回滚/清理:WCBK1 已完成真实回调 URL 验证和事件确认;远端报告 /app/artifacts/qa-flow/wecom-approval-callback-poc-20260519T092648Z/summary.json 为 PASS_CALLBACK_EVENT_CONFIRMED,记录 1 条脱敏已通过审批状态事件;如后续需停用,可在企微后台取消回调模板或移除回调 URL,不影响入口、消息、WAPC2FLIVE 样件和现有业务。