From 6c5a2452f29dbdcbd70614de4f140eb74ea29b04 Mon Sep 17 00:00:00 2001 From: erio Date: Tue, 7 Apr 2026 11:27:00 +0800 Subject: [PATCH] refactor(payment): unify all JSON tags to snake_case MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backend request/response structs used camelCase JSON tags while the rest of the codebase uses snake_case (from Ent ORM entities). This caused field name mismatches — notably the admin refund deduct_balance field was silently ignored. Backend: changed all camelCase JSON tags in payment handler/service structs to snake_case (CreateOrderRequest, CreateOrderResponse, CreatePlanRequest, UpdatePlanRequest, CreateProviderInstanceRequest, UpdateProviderInstanceRequest, AdminProcessRefundRequest, RefundResult). Frontend: updated all API call payloads and response field accesses to use snake_case, removed manual camelCase conversion in buildPlanPayload, toggleForSale, provider dialog emit, etc. --- .../internal/handler/admin/payment_handler.go | 2 +- backend/internal/handler/payment_handler.go | 6 +-- .../service/payment_config_service.go | 42 +++++++++---------- backend/internal/service/payment_service.go | 22 +++++----- .../payment/PaymentProviderDialog.vue | 12 +++--- .../payment/PaymentProviderList.vue | 2 +- .../src/components/payment/ProviderCard.vue | 4 +- frontend/src/types/payment.ts | 18 ++++---- frontend/src/views/admin/SettingsView.vue | 4 +- .../admin/orders/AdminPaymentPlansView.vue | 16 +++---- frontend/src/views/user/PaymentView.vue | 18 ++++---- 11 files changed, 73 insertions(+), 73 deletions(-) diff --git a/backend/internal/handler/admin/payment_handler.go b/backend/internal/handler/admin/payment_handler.go index e21c6ca42c..17648402ff 100644 --- a/backend/internal/handler/admin/payment_handler.go +++ b/backend/internal/handler/admin/payment_handler.go @@ -118,7 +118,7 @@ type AdminProcessRefundRequest struct { Amount float64 `json:"amount"` Reason string `json:"reason"` Force bool `json:"force"` - DeductBalance bool `json:"deductBalance"` + DeductBalance bool `json:"deduct_balance"` } // ProcessRefund processes a refund for an order (admin). diff --git a/backend/internal/handler/payment_handler.go b/backend/internal/handler/payment_handler.go index c3acd6d6ae..bbadb48687 100644 --- a/backend/internal/handler/payment_handler.go +++ b/backend/internal/handler/payment_handler.go @@ -80,9 +80,9 @@ func (h *PaymentHandler) GetLimits(c *gin.Context) { // CreateOrderRequest is the request body for creating a payment order. type CreateOrderRequest struct { Amount float64 `json:"amount"` - PaymentType string `json:"paymentType" binding:"required"` - OrderType string `json:"orderType"` - PlanID int64 `json:"planId"` + PaymentType string `json:"payment_type" binding:"required"` + OrderType string `json:"order_type"` + PlanID int64 `json:"plan_id"` } // CreateOrder creates a new payment order. diff --git a/backend/internal/service/payment_config_service.go b/backend/internal/service/payment_config_service.go index d4006d49f9..5c84c5f397 100644 --- a/backend/internal/service/payment_config_service.go +++ b/backend/internal/service/payment_config_service.go @@ -87,51 +87,51 @@ type MethodLimits struct { } type CreateProviderInstanceRequest struct { - ProviderKey string `json:"providerKey"` + ProviderKey string `json:"provider_key"` Name string `json:"name"` Config map[string]string `json:"config"` - SupportedTypes []string `json:"supportedTypes"` + SupportedTypes []string `json:"supported_types"` Enabled bool `json:"enabled"` - SortOrder int `json:"sortOrder"` + SortOrder int `json:"sort_order"` Limits string `json:"limits"` - RefundEnabled bool `json:"refundEnabled"` + RefundEnabled bool `json:"refund_enabled"` } type UpdateProviderInstanceRequest struct { Name *string `json:"name"` Config map[string]string `json:"config"` - SupportedTypes []string `json:"supportedTypes"` + SupportedTypes []string `json:"supported_types"` Enabled *bool `json:"enabled"` - SortOrder *int `json:"sortOrder"` + SortOrder *int `json:"sort_order"` Limits *string `json:"limits"` - RefundEnabled *bool `json:"refundEnabled"` + RefundEnabled *bool `json:"refund_enabled"` } type CreatePlanRequest struct { - GroupID int64 `json:"groupId"` + GroupID int64 `json:"group_id"` Name string `json:"name"` Description string `json:"description"` Price float64 `json:"price"` - OriginalPrice *float64 `json:"originalPrice"` - ValidityDays int `json:"validityDays"` - ValidityUnit string `json:"validityUnit"` + OriginalPrice *float64 `json:"original_price"` + ValidityDays int `json:"validity_days"` + ValidityUnit string `json:"validity_unit"` Features string `json:"features"` - ProductName string `json:"productName"` - ForSale bool `json:"forSale"` - SortOrder int `json:"sortOrder"` + ProductName string `json:"product_name"` + ForSale bool `json:"for_sale"` + SortOrder int `json:"sort_order"` } type UpdatePlanRequest struct { - GroupID *int64 `json:"groupId"` + GroupID *int64 `json:"group_id"` Name *string `json:"name"` Description *string `json:"description"` Price *float64 `json:"price"` - OriginalPrice *float64 `json:"originalPrice"` - ValidityDays *int `json:"validityDays"` - ValidityUnit *string `json:"validityUnit"` + OriginalPrice *float64 `json:"original_price"` + ValidityDays *int `json:"validity_days"` + ValidityUnit *string `json:"validity_unit"` Features *string `json:"features"` - ProductName *string `json:"productName"` - ForSale *bool `json:"forSale"` - SortOrder *int `json:"sortOrder"` + ProductName *string `json:"product_name"` + ForSale *bool `json:"for_sale"` + SortOrder *int `json:"sort_order"` } // PaymentConfigService manages payment configuration and CRUD for diff --git a/backend/internal/service/payment_service.go b/backend/internal/service/payment_service.go index 07f39b7962..455cca27ed 100644 --- a/backend/internal/service/payment_service.go +++ b/backend/internal/service/payment_service.go @@ -73,16 +73,16 @@ type CreateOrderRequest struct { } type CreateOrderResponse struct { - OrderID int64 `json:"orderId"` + OrderID int64 `json:"order_id"` Amount float64 `json:"amount"` - PayAmount float64 `json:"payAmount"` - FeeRate float64 `json:"feeRate"` + PayAmount float64 `json:"pay_amount"` + FeeRate float64 `json:"fee_rate"` Status string `json:"status"` - PaymentType string `json:"paymentType"` - PayURL string `json:"payUrl,omitempty"` - QRCode string `json:"qrCode,omitempty"` - ClientSecret string `json:"clientSecret,omitempty"` - ExpiresAt time.Time `json:"expiresAt"` + PaymentType string `json:"payment_type"` + PayURL string `json:"pay_url,omitempty"` + QRCode string `json:"qr_code,omitempty"` + ClientSecret string `json:"client_secret,omitempty"` + ExpiresAt time.Time `json:"expires_at"` } type OrderListParams struct { @@ -109,9 +109,9 @@ type RefundPlan struct { type RefundResult struct { Success bool `json:"success"` Warning string `json:"warning,omitempty"` - RequireForce bool `json:"requireForce,omitempty"` - BalanceDeducted float64 `json:"balanceDeducted,omitempty"` - SubDaysDeducted int `json:"subscriptionDaysDeducted,omitempty"` + RequireForce bool `json:"require_force,omitempty"` + BalanceDeducted float64 `json:"balance_deducted,omitempty"` + SubDaysDeducted int `json:"subscription_days_deducted,omitempty"` } type DashboardStats struct { diff --git a/frontend/src/components/payment/PaymentProviderDialog.vue b/frontend/src/components/payment/PaymentProviderDialog.vue index c962c536c9..bbd006b447 100644 --- a/frontend/src/components/payment/PaymentProviderDialog.vue +++ b/frontend/src/components/payment/PaymentProviderDialog.vue @@ -226,11 +226,11 @@ const props = defineProps<{ const emit = defineEmits<{ close: [] save: [payload: { - providerKey: string + provider_key: string name: string - supportedTypes: string[] + supported_types: string[] enabled: boolean - refundEnabled: boolean + refund_enabled: boolean config: Record limits: string }] @@ -388,11 +388,11 @@ function handleSave() { } emit('save', { - providerKey: form.provider_key, + provider_key: form.provider_key, name: form.name, - supportedTypes: form.supported_types, + supported_types: form.supported_types, enabled: form.enabled, - refundEnabled: form.refund_enabled, + refund_enabled: form.refund_enabled, config: filteredConfig, limits: serializeLimits(), }) diff --git a/frontend/src/components/payment/PaymentProviderList.vue b/frontend/src/components/payment/PaymentProviderList.vue index 99dbc76912..e795e99043 100644 --- a/frontend/src/components/payment/PaymentProviderList.vue +++ b/frontend/src/components/payment/PaymentProviderList.vue @@ -96,7 +96,7 @@ const emit = defineEmits<{ create: [] edit: [provider: ProviderInstance] delete: [provider: ProviderInstance] - toggleField: [provider: ProviderInstance, field: 'enabled' | 'refundEnabled'] + toggleField: [provider: ProviderInstance, field: 'enabled' | 'refund_enabled'] toggleType: [provider: ProviderInstance, type: string] }>() diff --git a/frontend/src/components/payment/ProviderCard.vue b/frontend/src/components/payment/ProviderCard.vue index 444bef5e36..fe8c0b7daf 100644 --- a/frontend/src/components/payment/ProviderCard.vue +++ b/frontend/src/components/payment/ProviderCard.vue @@ -45,7 +45,7 @@
- +