修复退款幂等与补偿重试

This commit is contained in:
yml2213
2026-06-14 07:55:02 +08:00
parent 607d2415a1
commit fec8e37181
11 changed files with 772 additions and 143 deletions
@@ -282,3 +282,67 @@ func TestNotifyResultHasRequiredFields(t *testing.T) {
t.Fatal("NotifyResult.Message should not be empty")
}
}
func TestStartRefundDoesNotCreateNewOrderWhenFailedRefundExists(t *testing.T) {
db := setupPaymentTestDB(t)
repo := NewRepository(db, nil, nil)
order := model.RentalOrder{
ID: 1001,
OrderNo: "ORD202606140001",
RenterID: 11,
RentAmountCent: 800,
DepositAmountCent: 200,
RefundStatus: "failed",
RefundAmountCent: 1000,
Status: "closed",
}
if err := db.Create(&order).Error; err != nil {
t.Fatalf("create order failed: %v", err)
}
original := model.PaymentOrder{
PaymentNo: "PAY202606140001",
OrderID: order.ID,
OrderNo: order.OrderNo,
UserID: order.RenterID,
Provider: "mock",
ThirdOrderID: "PAY202606140001",
ProviderOrderID: "MOCKPAY202606140001",
AmountCent: 1000,
BizType: "order_pay",
Status: "paid",
}
if err := db.Create(&original).Error; err != nil {
t.Fatalf("create original payment failed: %v", err)
}
existingRefund := model.PaymentOrder{
PaymentNo: "PAY202606140002",
OrderID: order.ID,
OrderNo: order.OrderNo,
UserID: order.RenterID,
Provider: "mock",
ThirdOrderID: "REF202606140002",
AmountCent: 1000,
BizType: "admin_refund",
Status: "failed",
}
if err := db.Create(&existingRefund).Error; err != nil {
t.Fatalf("create existing refund failed: %v", err)
}
dto, err := repo.StartRefund(t.Context(), order.ID, 1000, "admin_refund", "后台人工退款")
if err != nil {
t.Fatalf("StartRefund() error = %v", err)
}
if dto.ID != existingRefund.ID {
t.Fatalf("StartRefund() returned payment id %d, want existing %d", dto.ID, existingRefund.ID)
}
var count int64
if err := db.Model(&model.PaymentOrder{}).
Where("order_id = ? AND biz_type = ?", order.ID, "admin_refund").
Count(&count).Error; err != nil {
t.Fatalf("count refund orders failed: %v", err)
}
if count != 1 {
t.Fatalf("refund order count = %d, want 1", count)
}
}