优化结构

This commit is contained in:
Yvan
2026-08-28 11:51:37 +08:00
parent 5b04998731
commit 33ba777137
25 changed files with 163 additions and 125 deletions
+22 -26
View File
@@ -6,42 +6,42 @@ import (
"strings"
)
// Adapter is the provider boundary used by the payment repository. Provider
// SDK types stay in this package and are normalized to biz/payment results.
type Adapter = bizpayment.PaymentAdapter
type Factory struct{}
func NewFactory() *Factory { return &Factory{} }
type adapterFactory func() Adapter
type adapterFactory func() bizpayment.PaymentAdapter
// adapterFactories is the single payment integration registration point.
// Keep constructors zero-state: provider configuration belongs to each call,
// so an adapter can never accidentally retain secrets or order data.
var adapterFactories = map[string]adapterFactory{
bizpayment.PaymentAlipay: func() Adapter { return &alipayAdapter{} },
bizpayment.PaymentAlipayV3: func() Adapter { return &alipayV3Adapter{} },
bizpayment.PaymentWechatV2: func() Adapter { return &wechatV2Adapter{} },
bizpayment.PaymentWechatV3: func() Adapter { return &wechatV3Adapter{} },
bizpayment.PaymentApple: func() Adapter { return &appleAdapter{} },
bizpayment.PaymentDouyin: func() Adapter { return &douyinAdapter{} },
bizpayment.PaymentQQ: func() Adapter { return &qqAdapter{} },
bizpayment.PaymentAllinPay: func() Adapter { return &allinpayAdapter{} },
bizpayment.PaymentLakala: func() Adapter { return &lakalaAdapter{} },
bizpayment.PaymentPayPal: func() Adapter { return &paypalAdapter{} },
bizpayment.PaymentSaobei: func() Adapter { return &saobeiAdapter{} },
bizpayment.PaymentChinaums: func() Adapter { return newVendorAdapter(bizpayment.PaymentChinaums, vendorChinaums) },
bizpayment.PaymentSFT: func() Adapter { return newVendorAdapter(bizpayment.PaymentSFT, vendorSFT) },
bizpayment.PaymentSuperPay: func() Adapter { return newVendorAdapter(bizpayment.PaymentSuperPay, vendorSupperPay) },
bizpayment.PaymentWechatGame: func() Adapter { return newVendorAdapter(bizpayment.PaymentWechatGame, vendorWechatGame) },
bizpayment.PaymentDouyinGame: func() Adapter { return newVendorAdapter(bizpayment.PaymentDouyinGame, vendorDouyinGame) },
bizpayment.PaymentAlipay: func() bizpayment.PaymentAdapter { return &alipayAdapter{} },
bizpayment.PaymentAlipayV3: func() bizpayment.PaymentAdapter { return &alipayV3Adapter{} },
bizpayment.PaymentWechatV2: func() bizpayment.PaymentAdapter { return &wechatV2Adapter{} },
bizpayment.PaymentWechatV3: func() bizpayment.PaymentAdapter { return &wechatV3Adapter{} },
bizpayment.PaymentApple: func() bizpayment.PaymentAdapter { return &appleAdapter{} },
bizpayment.PaymentDouyin: func() bizpayment.PaymentAdapter { return &douyinAdapter{} },
bizpayment.PaymentQQ: func() bizpayment.PaymentAdapter { return &qqAdapter{} },
bizpayment.PaymentAllinPay: func() bizpayment.PaymentAdapter { return &allinpayAdapter{} },
bizpayment.PaymentLakala: func() bizpayment.PaymentAdapter { return &lakalaAdapter{} },
bizpayment.PaymentPayPal: func() bizpayment.PaymentAdapter { return &paypalAdapter{} },
bizpayment.PaymentSaobei: func() bizpayment.PaymentAdapter { return &saobeiAdapter{} },
bizpayment.PaymentChinaums: func() bizpayment.PaymentAdapter { return newVendorAdapter(bizpayment.PaymentChinaums, vendorChinaums) },
bizpayment.PaymentSFT: func() bizpayment.PaymentAdapter { return newVendorAdapter(bizpayment.PaymentSFT, vendorSFT) },
bizpayment.PaymentSuperPay: func() bizpayment.PaymentAdapter { return newVendorAdapter(bizpayment.PaymentSuperPay, vendorSupperPay) },
bizpayment.PaymentWechatGame: func() bizpayment.PaymentAdapter {
return newVendorAdapter(bizpayment.PaymentWechatGame, vendorWechatGame)
},
bizpayment.PaymentDouyinGame: func() bizpayment.PaymentAdapter {
return newVendorAdapter(bizpayment.PaymentDouyinGame, vendorDouyinGame)
},
}
// New constructs the SDK-backed adapter for a configured provider. Provider
// identifiers are normalized at this I/O boundary so direct callers get the
// same behavior as the configuration and business layers.
func New(provider string) (Adapter, error) {
func (*Factory) New(provider string) (bizpayment.PaymentAdapter, error) {
provider = strings.ToLower(strings.TrimSpace(provider))
factory, ok := adapterFactories[provider]
if !ok {
@@ -49,7 +49,3 @@ func New(provider string) (Adapter, error) {
}
return factory(), nil
}
func (*Factory) New(provider string) (bizpayment.PaymentAdapter, error) {
return New(provider)
}
+5 -3
View File
@@ -6,9 +6,10 @@ import (
)
func TestEverySupportedProviderHasAdapter(t *testing.T) {
factory := NewFactory()
for _, provider := range bizpayment.SupportedPaymentProviders {
t.Run(provider, func(t *testing.T) {
adapter, err := New(provider)
adapter, err := factory.New(provider)
if err != nil {
t.Fatalf("New(%q): %v", provider, err)
}
@@ -20,8 +21,9 @@ func TestEverySupportedProviderHasAdapter(t *testing.T) {
}
func TestNewNormalizesProviderIdentifier(t *testing.T) {
factory := NewFactory()
for _, provider := range bizpayment.SupportedPaymentProviders {
adapter, err := New(" " + provider + " ")
adapter, err := factory.New(" " + provider + " ")
if err != nil {
t.Fatalf("New(%q): %v", provider, err)
}
@@ -32,7 +34,7 @@ func TestNewNormalizesProviderIdentifier(t *testing.T) {
}
func TestNewRejectsUnknownProvider(t *testing.T) {
if _, err := New("unknown-provider"); err == nil {
if _, err := NewFactory().New("unknown-provider"); err == nil {
t.Fatal("unknown provider unexpectedly accepted")
}
}
+1 -1
View File
@@ -33,7 +33,7 @@ type vendorPaymentAdapter struct {
profile vendorProfile
}
func newVendorAdapter(provider string, profile vendorProfile) Adapter {
func newVendorAdapter(provider string, profile vendorProfile) bizpayment.PaymentAdapter {
return &vendorPaymentAdapter{provider: provider, profile: profile}
}