Files
junhong_cmp_fiber/internal/domain/agentrecharge/payment_confirmation.go
2026-08-18 17:13:20 +08:00

87 lines
3.7 KiB
Go

package agentrecharge
import (
"strings"
"github.com/break/junhong_cmp_fiber/internal/model"
"github.com/break/junhong_cmp_fiber/pkg/constants"
"github.com/break/junhong_cmp_fiber/pkg/errors"
)
// PaymentState 是支付单在确认用例中的领域状态。
type PaymentState int
const (
// PaymentStatePending 表示支付单仍待确认。
PaymentStatePending PaymentState = iota
// PaymentStatePaid 表示支付单已确认收款。
PaymentStatePaid
// PaymentStateFailed 表示支付单曾被明确关闭。
PaymentStateFailed
// PaymentStateRefunded 表示支付单已经退款。
PaymentStateRefunded
)
// PaymentConfirmationFacts 是支付确认所需的渠道与本地权威事实。
type PaymentConfirmationFacts struct {
OrderType string
ExpectedOrderType string
PaymentMethod string
RechargePaymentMethod string
RechargePaymentChannel string
PaymentConfigID uint
RechargePaymentConfigID uint
ConfirmedConfigID uint
MerchantIdentity string
ConfirmedMerchantIdentity string
PaymentAmount int64
RechargeAmount int64
ConfirmedAmount int64
PaymentOrderID uint
RechargeID uint
PaymentState PaymentState
RechargeStatus int
StoredTradeNo string
ConfirmedTradeNo string
}
// ValidatePaymentConfirmation 校验支付确认不变量,并返回是否属于完全一致的重复确认。
func ValidatePaymentConfirmation(facts PaymentConfirmationFacts) (bool, error) {
if facts.ExpectedOrderType == "" || facts.OrderType != facts.ExpectedOrderType ||
facts.RechargeID == 0 || facts.PaymentOrderID != facts.RechargeID {
return false, errors.New(errors.CodeConflict, "支付单与代理充值单关联不一致")
}
method := strings.TrimSpace(facts.PaymentMethod)
if method == "" || method != strings.TrimSpace(facts.RechargePaymentMethod) {
return false, errors.New(errors.CodeConflict, "支付渠道与代理充值单不一致")
}
channel := strings.TrimSpace(facts.RechargePaymentChannel)
if channel != method && !(method == constants.RechargeMethodWechat && channel == model.ProviderTypeFuiou) {
return false, errors.New(errors.CodeConflict, "支付渠道与代理充值单不一致")
}
identity := strings.TrimSpace(facts.MerchantIdentity)
if facts.PaymentConfigID == 0 || facts.PaymentConfigID != facts.RechargePaymentConfigID ||
facts.PaymentConfigID != facts.ConfirmedConfigID || identity == "" ||
identity != strings.TrimSpace(facts.ConfirmedMerchantIdentity) {
return false, errors.New(errors.CodeConflict, "支付配置身份与创建记录不一致")
}
tradeNo := strings.TrimSpace(facts.ConfirmedTradeNo)
if tradeNo == "" || facts.ConfirmedAmount <= 0 || facts.PaymentAmount != facts.RechargeAmount ||
facts.PaymentAmount != facts.ConfirmedAmount {
return false, errors.New(errors.CodeConflict, "支付金额或第三方交易号无效")
}
if facts.PaymentState == PaymentStatePaid {
if strings.TrimSpace(facts.StoredTradeNo) == tradeNo &&
(facts.RechargeStatus == constants.RechargeStatusPaid || facts.RechargeStatus == constants.RechargeStatusCompleted) {
return true, nil
}
return false, errors.New(errors.CodeConflict, "支付单已存在不一致的确认事实")
}
validPending := facts.PaymentState == PaymentStatePending && facts.RechargeStatus == constants.RechargeStatusPending
validLateSuccess := facts.PaymentState == PaymentStateFailed && facts.RechargeStatus == constants.RechargeStatusClosed
if !validPending && !validLateSuccess {
return false, errors.New(errors.CodeInvalidStatus, "代理充值单当前状态不可确认支付")
}
return false, nil
}