From e3e033bb359f1dba628eae38a57d2cf5c9072b9b Mon Sep 17 00:00:00 2001 From: keaipiao <71310981+keaipiao@users.noreply.github.com> Date: Tue, 28 Jul 2026 11:46:12 -0700 Subject: [PATCH] fix(payment): preserve UTF-8 in EasyPay errors --- backend/internal/payment/provider/easypay.go | 7 ++++++- .../payment/provider/easypay_refund_test.go | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/backend/internal/payment/provider/easypay.go b/backend/internal/payment/provider/easypay.go index f1c17427a..c04f86479 100644 --- a/backend/internal/payment/provider/easypay.go +++ b/backend/internal/payment/provider/easypay.go @@ -15,6 +15,7 @@ import ( "strconv" "strings" "time" + "unicode/utf8" "github.com/Wei-Shaw/sub2api/internal/payment" ) @@ -477,7 +478,11 @@ func summarizeEasyPayResponse(body []byte) string { return "" } if len(summary) > maxEasypayErrorSummary { - return summary[:maxEasypayErrorSummary] + "..." + truncated := summary[:maxEasypayErrorSummary] + for len(truncated) > 0 && !utf8.ValidString(truncated) { + truncated = truncated[:len(truncated)-1] + } + return truncated + "..." } return summary } diff --git a/backend/internal/payment/provider/easypay_refund_test.go b/backend/internal/payment/provider/easypay_refund_test.go index 3b7632987..8d535b512 100644 --- a/backend/internal/payment/provider/easypay_refund_test.go +++ b/backend/internal/payment/provider/easypay_refund_test.go @@ -7,6 +7,7 @@ import ( "net/url" "strings" "testing" + "unicode/utf8" "github.com/Wei-Shaw/sub2api/internal/payment" ) @@ -179,6 +180,18 @@ func TestEasyPayRefundResponseErrors(t *testing.T) { } } +func TestSummarizeEasyPayResponsePreservesUTF8(t *testing.T) { + t.Parallel() + + summary := summarizeEasyPayResponse([]byte(strings.Repeat("错", 171))) + if !utf8.ValidString(summary) { + t.Fatalf("summarizeEasyPayResponse returned invalid UTF-8: %q", summary) + } + if !strings.HasSuffix(summary, "...") { + t.Fatalf("summarizeEasyPayResponse() = %q, want truncated suffix", summary) + } +} + func TestEasyPayCustomMethodsUseConfiguredUpstreamType(t *testing.T) { t.Parallel()