周明轩研发负责人
门禁阻断
  • 严重问题 2 超过上限 0

支付退款回调接入第三方网关

hanpay-apifeat/refund-callback周慕白 · 2026-06-05 14:23
改动文件 (2)
src/payment/refundCallback.ts+102
11 export async function handleRefundCallback(req: Request) {
2- const { orderId, amount } = req.body;
2+ const { orderId, amount, sign } = req.body;
A
AI 审查官AI严重
缺幂等控制:第三方网关回调会重试,同一 orderId 可能多次进入此函数,导致重复退款 / 重复通知。需先查询订单当前状态或加唯一回调流水号。
3+ // 验签
4+ if (!verifySign(req.body, sign)) {
5+ return { ok: false, msg: "签名校验失败" };
6+ }
A
AI 审查官AI次要
验签失败应返回 4xx 状态码并记录告警日志,当前仅返回业务体易被忽略。
7+ // 直接拼接 orderId 进 SQL
38 await db.query(
4- 'UPDATE orders SET status = "refunded" WHERE id = ' + orderId
9+ 'UPDATE orders SET status = "refunded", refund_amount = ' +
10+ amount +
11+ ' WHERE id = ' + orderId
A
AI 审查官AI严重
SQL 注入:orderId / amount 直接字符串拼接进 UPDATE 语句,攻击者可构造 `1; DROP TABLE orders` 篡改任意订单。必须用参数化查询。
建议修改
+23
11 await db.query(
2- 'UPDATE orders SET status = "refunded", refund_amount = ' +
3- amount +
4- ' WHERE id = ' + orderId
2+ 'UPDATE orders SET status = ?, refund_amount = ? WHERE id = ?',
3+ ['refunded', amount, orderId]
54 );
512 );
13+ await notifyUser(orderId);
614 return { ok: true };
715 }
A
AI 审查官AI重要
notifyUser 未 await 的副作用未做失败兜底;且通知失败不应阻塞回调成功响应,建议改为 fire-and-forget + 落日志。
AI 审查过程

审查计划

  1. 制定审查计划改动涉及支付退款回调与验签,命中安全敏感路径,升级到 Opus 做深度安全审计:先静态扫描,再 grep 注入/密钥模式,最后跑测试。

结果

4 problems (2 errors, 2 warnings) — security/detect-object-injection, no-hardcoded-secrets

结果

2 findings: sql-injection (refundCallback.ts:11), hardcoded-secret (sign.ts:1)

结果

Tests: 6 passed, 0 failed — 但缺少重放/注入场景用例
审查结论

发现 3 个严重问题(SQL 注入、缺幂等、硬编码密钥),门禁判定 block。建议补参数化查询、幂等流水号与密钥外置后重新提交。

36
F
质量分

问题汇总

    严重3
    重要2
    次要1
    提示0
主审模型Claude Opus 4.7
代码覆盖率72%
本次成本¥0.048