feat(pay-v2): P8 Task6 拒付 chargeback 记录 + chargeback.received
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
|
||||
"github.com/wangjia/pay/internal/model"
|
||||
)
|
||||
|
||||
// ChargebackStore 持久化拒付留痕(P8 Task6)。与 SubscriptionStore/OrderStore 同惯例:
|
||||
// 幂等靠 DB 唯一约束 + ON CONFLICT DO NOTHING,不在应用层加锁。
|
||||
type ChargebackStore struct{ db *gorm.DB }
|
||||
|
||||
func NewChargebackStore(db *gorm.DB) *ChargebackStore { return &ChargebackStore{db: db} }
|
||||
|
||||
// Create 幂等插入:重复 dispute_ref(渠道重投同一拒付)→ no-op(created=false)。
|
||||
// Chargeback 表对"能否定位业务单"保持中立——OutTradeNo 为空也照常落一行留痕。
|
||||
func (s *ChargebackStore) Create(cb *model.Chargeback) (bool, error) {
|
||||
res := s.db.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "dispute_ref"}},
|
||||
DoNothing: true,
|
||||
}).Create(cb)
|
||||
if res.Error != nil {
|
||||
return false, fmt.Errorf("store.ChargebackStore.Create: %w", res.Error)
|
||||
}
|
||||
return res.RowsAffected > 0, nil
|
||||
}
|
||||
Reference in New Issue
Block a user