接入顺成支付并优化配置列表

This commit is contained in:
yml
2026-06-18 21:33:15 +08:00
parent 40ae14d450
commit 6d385478a6
13 changed files with 1763 additions and 40 deletions
@@ -24,6 +24,7 @@ var (
ErrAppIDRequired = errors.New("extra_config.app_id is required for lakala provider")
ErrSerialNoRequired = errors.New("extra_config.serial_no is required for lakala provider")
ErrTermNoRequired = errors.New("extra_config.term_no is required for lakala provider")
ErrSecretIDRequired = errors.New("extra_config.secret_id is required for shuncheng provider")
)
// DTO 数据传输对象
@@ -57,7 +58,7 @@ type ConfigDTO struct {
// CreateRequest 创建支付配置请求
type CreateRequest struct {
Name string `json:"name" binding:"required"`
Provider string `json:"provider" binding:"required,oneof=leshua lakala mock"`
Provider string `json:"provider" binding:"required,oneof=leshua lakala shuncheng mock"`
MerchantID string `json:"merchant_id" binding:"required"`
GatewayURL string `json:"gateway_url"`
SignKey string `json:"sign_key"`
@@ -48,6 +48,28 @@ func TestImportCreateRequestPreservesTestingConfig(t *testing.T) {
}
}
func TestValidateCreateRequestRequiresShunchengSecretID(t *testing.T) {
repo := &Repository{}
req := CreateRequest{
Name: "顺成生产商户",
Provider: "shuncheng",
MerchantID: "0000000038",
GatewayURL: "http://jyzxapi.ydxnhb.com",
SignKey: "secret-key",
NotifyKey: "notify-key",
NotifyURL: "https://example.com/api/payments/shuncheng/notify",
PayWay: "ZFBZF",
}
if err := repo.validateCreateRequest(req); err != ErrSecretIDRequired {
t.Fatalf("validateCreateRequest() error = %v, want ErrSecretIDRequired", err)
}
req.ExtraConfig = map[string]any{"secret_id": "SEC-1"}
if err := repo.validateCreateRequest(req); err != nil {
t.Fatalf("validateCreateRequest() error = %v, want nil", err)
}
}
// TestListUsesSuccessfulPaymentStats 验证配置页只统计成功支付,不把打开二维码或取消订单算作成交。
func TestListUsesSuccessfulPaymentStats(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{Logger: logger.Default.LogMode(logger.Silent)})
@@ -62,12 +62,29 @@ func (r *Repository) validateCreateRequest(req CreateRequest) error {
return ErrTermNoRequired
}
}
if req.Provider == "shuncheng" {
if req.GatewayURL == "" {
return ErrGatewayURLRequired
}
if req.SignKey == "" {
return ErrSignKeyRequired
}
if req.NotifyKey == "" {
return ErrNotifyKeyRequired
}
if req.NotifyURL == "" {
return ErrNotifyURLRequired
}
if extraString(req.ExtraConfig, "secret_id") == "" {
return ErrSecretIDRequired
}
}
return nil
}
func isValidProvider(value string) bool {
return value == "leshua" || value == "lakala" || value == "mock"
return value == "leshua" || value == "lakala" || value == "shuncheng" || value == "mock"
}
func isValidSignType(value string) bool {