支持微信支付宝独立支付渠道

This commit is contained in:
yml
2026-06-14 23:38:03 +08:00
parent 2dc5a8121e
commit 3ff8c1de88
27 changed files with 550 additions and 97 deletions
@@ -37,9 +37,10 @@ func (r *Repository) Create(ctx context.Context, req CreateRequest, actorID uint
if environment == "" {
environment = "production"
}
payWay := firstNonEmpty(req.PayWay, "ZFBZF")
isDefault := req.IsDefault
if status == "active" {
if err := deactivateOtherConfigs(tx, 0, actorID); err != nil {
if err := deactivateOtherConfigs(tx, 0, actorID, payWay); err != nil {
return err
}
isDefault = true
@@ -56,7 +57,7 @@ func (r *Repository) Create(ctx context.Context, req CreateRequest, actorID uint
NotifyKey: encryptedNotifyKey,
NotifyURL: req.NotifyURL,
JumpURL: req.JumpURL,
PayWay: firstNonEmpty(req.PayWay, "ZFBZF"),
PayWay: payWay,
JSPayFlag: firstNonEmpty(req.JSPayFlag, "2"),
SignType: firstNonEmpty(req.SignType, defaultSignType(req.Provider)),
ExtraConfig: req.ExtraConfig,
@@ -97,6 +98,9 @@ func (r *Repository) Update(ctx context.Context, id uint64, req UpdateRequest, a
if req.SignType != nil && *req.SignType != "" && !isValidSignType(*req.SignType) {
return nil, ErrInvalidSignType
}
if req.PayWay != nil && !isValidPayWay(*req.PayWay) {
return nil, ErrInvalidPayWay
}
if req.Status != nil && !isValidStatus(*req.Status) {
return nil, ErrInvalidStatus
}
@@ -145,7 +149,7 @@ func (r *Repository) Update(ctx context.Context, id uint64, req UpdateRequest, a
updates["jump_url"] = *req.JumpURL
}
if req.PayWay != nil {
updates["pay_way"] = *req.PayWay
updates["pay_way"] = firstNonEmpty(*req.PayWay, "ZFBZF")
}
if req.JSPayFlag != nil {
updates["jspay_flag"] = *req.JSPayFlag
@@ -174,8 +178,15 @@ func (r *Repository) Update(ctx context.Context, id uint64, req UpdateRequest, a
if req.Status != nil {
finalStatus = *req.Status
}
finalPayWay := item.PayWay
if req.PayWay != nil && *req.PayWay != "" {
finalPayWay = *req.PayWay
}
if finalPayWay == "" {
finalPayWay = "ZFBZF"
}
if finalStatus == "active" {
if err := deactivateOtherConfigs(tx, id, actorID); err != nil {
if err := deactivateOtherConfigs(tx, id, actorID, finalPayWay); err != nil {
return err
}
updates["status"] = "active"
@@ -225,8 +236,10 @@ func (r *Repository) Delete(ctx context.Context, id uint64, actorID uint64, meta
}
var usedCount int64
if err := tx.Model(&model.PaymentOrder{}).
Where("provider = ? AND merchant_id = ?", item.Provider, item.MerchantID).
usedDB := tx.Model(&model.PaymentOrder{}).
Where("payment_config_id = ?", item.ID).
Or("(payment_config_id = ? OR payment_config_id IS NULL) AND provider = ? AND merchant_id = ? AND pay_way = ?", 0, item.Provider, item.MerchantID, item.PayWay)
if err := usedDB.
Count(&usedCount).Error; err != nil {
return err
}
@@ -246,12 +259,10 @@ func (r *Repository) Delete(ctx context.Context, id uint64, actorID uint64, meta
})
}
// IncrementUsage 增加使用统计
// deactivateOtherConfigs 保证全局同一时间只有一个启用配置。
func deactivateOtherConfigs(tx *gorm.DB, activeID uint64, actorID uint64) error {
// deactivateOtherConfigs 保证同一个支付方式同一时间只有一个启用配置。
func deactivateOtherConfigs(tx *gorm.DB, activeID uint64, actorID uint64, payWay string) error {
db := tx.Model(&model.PaymentMerchantConfig{}).
Where("status = ? OR is_default = ?", "active", true)
Where("pay_way = ? AND (status = ? OR is_default = ?)", payWay, "active", true)
if activeID > 0 {
db = db.Where("id != ?", activeID)
}