Skip to content

fix(payment): propagate paid status update errors - #199

Merged
yyg-max merged 1 commit into
linux-do:masterfrom
huzhe01:fix/payment-status-update-error
Sep 18, 2026
Merged

yyg-max merged 1 commit into
linux-do:masterfrom
huzhe01:fix/payment-status-update-error

Conversation

@huzhe01

@huzhe01 huzhe01 commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

例行检查

  • 我已阅读并理解 贡献者公约,
  • 我已阅读并同意 贡献者许可协议 (CLA),确认我的贡献将根据项目的 MIT 许可证进行许可,
  • 我知晓如果此 PR 并不做出实质性更改,或可被认为是为了PR被合并而提交PR的,则可能不会被合并,

关联信息

Related to #192。该报告涉及支付成功但未发放内容,维护者曾指出机器网络异常;本 PR 修复其中一个可确定复现的数据库错误路径,但不声称覆盖该报告的所有可能原因。

变更内容

  • 将支付回调中的 PENDING → PAID CAS 更新提取为可测试函数。
  • 显式检查并传播 GORM 更新错误,记录错误并让回调返回 fail。
  • 添加 GORM dry-run 单元测试,通过回调注入数据库写入失败,不依赖真实 MySQL。

变更原因

原代码只读取 RowsAffected,丢弃了 Updates 返回的 Error。数据库或网络瞬时失败时,RowsAffected 为 0,代码会误走“并发或非待支付”分支并向支付网关返回 success。网关因此停止重试,而订单仍是待支付状态,后续发放不会执行。

修复后,数据库写入失败会返回 fail,保留支付网关的重试机会;无错误但影响 0 行的并发/幂等行为保持不变。

验证

  • 修复前:TestMarkOrderPaidReturnsUpdateError 失败,注入写错误后得到 err = nil
  • 修复后:专项测试通过
  • go test -race ./internal/apps/payment -run TestMarkOrderPaidReturnsUpdateError -count=1
  • go test ./...
  • go vet ./...
  • go build ./...
  • git diff --check

@yyg-max
yyg-max merged commit de5301c into linux-do:master Sep 18, 2026
11 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants