优化结构

This commit is contained in:
Yvan
2026-08-28 09:19:54 +08:00
parent 03a4131f6e
commit 279692375b
57 changed files with 778 additions and 799 deletions
+6 -20
View File
@@ -82,7 +82,7 @@ func (a *alipayAdapter) Create(ctx context.Context, req *bizpayment.PaymentReque
case "10003":
status = "pending"
default:
return nil, fmt.Errorf("支付宝付款码支付失败: %s", firstNonEmptyAlipay(response.SubMsg, response.Msg, response.SubCode, response.Code))
return nil, fmt.Errorf("支付宝付款码支付失败: %s", firstNonEmpty(response.SubMsg, response.Msg, response.SubCode, response.Code))
}
if strings.TrimSpace(response.OutTradeNo) == "" {
return nil, errors.New("支付宝付款码支付响应缺少 out_trade_no")
@@ -125,7 +125,7 @@ func (a *alipayAdapter) Create(ctx context.Context, req *bizpayment.PaymentReque
}
return &bizpayment.PaymentResult{
Provider: bizpayment.PaymentAlipay, Status: "created", TradeNo: req.TradeNo,
Payload: mustMarshalAlipayPayload(map[string]string{"order_string": orderString}),
Payload: mustJSON(map[string]string{"order_string": orderString}),
}, nil
case "alipay.trade.page.pay":
payURL, callErr := sdk.client.TradePagePay(ctx, bm)
@@ -141,7 +141,7 @@ func (a *alipayAdapter) Create(ctx context.Context, req *bizpayment.PaymentReque
}
return &bizpayment.PaymentResult{
Provider: bizpayment.PaymentAlipay, Status: "created", TradeNo: req.TradeNo,
Payload: mustMarshalAlipayPayload(map[string]string{"pay_url": payURL}),
Payload: mustJSON(map[string]string{"pay_url": payURL}),
}, nil
case "alipay.trade.wap.pay":
payURL, callErr := sdk.client.TradeWapPay(ctx, bm)
@@ -157,7 +157,7 @@ func (a *alipayAdapter) Create(ctx context.Context, req *bizpayment.PaymentReque
}
return &bizpayment.PaymentResult{
Provider: bizpayment.PaymentAlipay, Status: "created", TradeNo: req.TradeNo,
Payload: mustMarshalAlipayPayload(map[string]string{"pay_url": payURL}),
Payload: mustJSON(map[string]string{"pay_url": payURL}),
}, nil
default:
rsp, callErr := sdk.client.TradeCreate(ctx, bm)
@@ -214,7 +214,7 @@ func (a *alipayAdapter) Query(ctx context.Context, tradeNo string, c map[string]
if err != nil {
return nil, fmt.Errorf("解析支付宝订单金额: %w", err)
}
result.Currency = strings.ToUpper(firstNonEmptyAlipay(response.TransCurrency, response.PayCurrency))
result.Currency = strings.ToUpper(firstNonEmpty(response.TransCurrency, response.PayCurrency))
if result.Currency == "" {
result.Currency = "CNY"
}
@@ -383,7 +383,7 @@ func (c *alipayClient) payload(fallback any) []byte {
if c.response.Len() > 0 {
return append([]byte(nil), c.response.Bytes()...)
}
return mustMarshalAlipayPayload(fallback)
return mustJSON(fallback)
}
func (c *alipayClient) rewriteGeneratedURL(value string) (string, error) {
@@ -466,20 +466,6 @@ func alipayResponseValues(value any) (map[string]any, error) {
return result, nil
}
func mustMarshalAlipayPayload(value any) []byte {
raw, _ := json.Marshal(value)
return raw
}
func firstNonEmptyAlipay(values ...string) string {
for _, value := range values {
if value = strings.TrimSpace(value); value != "" {
return value
}
}
return ""
}
func populateAlipayBreakdown(result *bizpayment.PaymentResult, response map[string]any) error {
if result == nil || result.Status != "success" {
return nil
-9
View File
@@ -688,15 +688,6 @@ func paypalNestedMapString(values map[string]any, keys ...string) string {
return strings.TrimSpace(fmt.Sprint(current))
}
func firstNonEmpty(values ...string) string {
for _, value := range values {
if value = strings.TrimSpace(value); value != "" && value != "<nil>" {
return value
}
}
return ""
}
func paypalResponseError(operation string, code int, detail string) error {
detail = strings.TrimSpace(detail)
if detail == "" {
+1 -10
View File
@@ -103,7 +103,7 @@ func (a *qqAdapter) Create(ctx context.Context, req *bizpayment.PaymentRequest,
if status == "pending" && strings.EqualFold(rsp.ResultCode, "SUCCESS") && strings.TrimSpace(rsp.TransactionId) != "" {
status = "success"
}
return &bizpayment.PaymentResult{Provider: bizpayment.PaymentQQ, Status: status, TradeNo: firstNonEmptyQQ(rsp.OutTradeNo, req.TradeNo), ProviderTradeNo: strings.TrimSpace(rsp.TransactionId), Payload: mustJSON(rsp)}, nil
return &bizpayment.PaymentResult{Provider: bizpayment.PaymentQQ, Status: status, TradeNo: firstNonEmpty(rsp.OutTradeNo, req.TradeNo), ProviderTradeNo: strings.TrimSpace(rsp.TransactionId), Payload: mustJSON(rsp)}, nil
}
bm.Set("trade_type", tradeType)
mergeGoPayExtras(bm, req.Extra, "nonce_str", "body", "out_trade_no", "total_fee", "spbill_create_ip", "notify_url", "trade_type", "mch_id", "sign_type")
@@ -143,15 +143,6 @@ func qqCreateMethod(extra, config map[string]any) (string, error) {
}
}
func firstNonEmptyQQ(values ...string) string {
for _, value := range values {
if strings.TrimSpace(value) != "" {
return strings.TrimSpace(value)
}
}
return ""
}
func (a *qqAdapter) Query(ctx context.Context, tradeNo string, c map[string]any) (*bizpayment.PaymentResult, error) {
tradeNo = strings.TrimSpace(tradeNo)
if tradeNo == "" {
+13 -35
View File
@@ -1,55 +1,29 @@
package payment
import (
"encoding/json"
"errors"
"fmt"
bizpayment "kra/internal/biz/payment"
"net/url"
"strings"
"kra/internal/paymentkit"
)
func callbackFields(callback *bizpayment.PaymentCallback) map[string]string {
fields := map[string]string{}
if callback == nil {
return fields
return map[string]string{}
}
for key, value := range callback.Query {
fields[key] = value
}
contentType := ""
for key, value := range callback.Headers {
if strings.EqualFold(key, "Content-Type") {
contentType = strings.ToLower(value)
break
}
}
if strings.Contains(contentType, "application/x-www-form-urlencoded") {
if values, err := url.ParseQuery(string(callback.Body)); err == nil {
for key, value := range values {
if len(value) > 0 {
fields[key] = value[0]
}
}
}
}
var object map[string]any
if json.Unmarshal(callback.Body, &object) == nil {
for key, value := range object {
if stringValue, ok := value.(string); ok {
fields[key] = stringValue
}
}
}
return fields
return paymentkit.CallbackFields(callback.Query, callback.Headers, callback.Body)
}
func first(values map[string]string, keys ...string) string {
for _, key := range keys {
if values[key] != "" {
return values[key]
return paymentkit.FirstString(values, keys...)
}
func firstNonEmpty(values ...string) string {
for _, value := range values {
if value = strings.TrimSpace(value); value != "" && value != "<nil>" {
return value
}
}
return ""
@@ -69,6 +43,10 @@ func normalizePaymentStatus(value, fallback string) string {
return paymentkit.NormalizeStatus(value, fallback)
}
func normalizeRefundStatus(value, fallback string) string {
return paymentkit.NormalizeRefundStatus(value, fallback)
}
func parseIntegerAmount(value string) (int64, error) {
return paymentkit.ParseIntegerAmount(value)
}
+1 -1
View File
@@ -164,7 +164,7 @@ func (a *vendorPaymentAdapter) call(ctx context.Context, endpointKey string, pay
result.Status = "created"
default:
if operation == "refund" {
normalized := normalizePaymentStatus(state, "")
normalized := normalizeRefundStatus(state, "")
switch normalized {
case "success", "pending", "failed":
result.Status = normalized