From 55c778b65bbaf7d2e1b6d51919fc3ce2bc067b34 Mon Sep 17 00:00:00 2001 From: shanshanzhong Date: Mon, 5 Jan 2026 18:36:24 -0800 Subject: [PATCH] =?UTF-8?q?fix(=E5=85=91=E6=8D=A2=E7=8E=87):=20=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=E7=A1=AC=E7=BC=96=E7=A0=81=E7=9A=84CNY=E5=85=91?= =?UTF-8?q?=E6=8D=A2=E7=8E=87=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=9B=BA=E5=AE=9A?= =?UTF-8?q?=E6=B1=87=E7=8E=87=E5=9B=9E=E9=80=80=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除之前硬编码的CNY兑换率检查,改为从系统配置中读取固定汇率 当API调用失败时,使用配置的固定汇率作为回退方案 添加对无AccessKey情况的固定汇率支持 --- .../public/portal/purchaseCheckoutLogic.go | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/internal/logic/public/portal/purchaseCheckoutLogic.go b/internal/logic/public/portal/purchaseCheckoutLogic.go index 9e0ea2d..f1e54e1 100644 --- a/internal/logic/public/portal/purchaseCheckoutLogic.go +++ b/internal/logic/public/portal/purchaseCheckoutLogic.go @@ -403,10 +403,10 @@ func (l *PurchaseCheckoutLogic) queryExchangeRate(to string, src int64) (amount // Convert cents to decimal amount amount = float64(src) / float64(100) - if l.svcCtx.ExchangeRate != 0 && to == "CNY" { - amount = amount * l.svcCtx.ExchangeRate - return amount, nil - } + // if l.svcCtx.ExchangeRate != 0 && to == "CNY" { + // amount = amount * l.svcCtx.ExchangeRate + // return amount, nil + // } // Retrieve system currency configuration currency, err := l.svcCtx.SystemModel.GetCurrencyConfig(l.ctx) @@ -420,12 +420,20 @@ func (l *PurchaseCheckoutLogic) queryExchangeRate(to string, src int64) (amount CurrencyUnit string CurrencySymbol string AccessKey string + FixedRate string }{} tool.SystemConfigSliceReflectToStruct(currency, &configs) l.Infow("queryExchangeRate", logger.Field("to", to), logger.Field("unit", configs.CurrencyUnit), logger.Field("hasAccessKey", strings.TrimSpace(configs.AccessKey) != "")) if strings.TrimSpace(configs.AccessKey) == "" { + if to == "CNY" && strings.TrimSpace(configs.CurrencyUnit) == "USD" && strings.TrimSpace(configs.FixedRate) != "" { + r := tool.FormatStringToFloat(strings.TrimSpace(configs.FixedRate)) + if r > 0 { + l.Infow("exchangeRate.fixed", logger.Field("rate", r)) + return amount * r, nil + } + } l.Infof("[PurchaseCheckout] AccessKey is empty, skip conversion") return amount, nil } @@ -433,7 +441,19 @@ func (l *PurchaseCheckoutLogic) queryExchangeRate(to string, src int64) (amount if strings.TrimSpace(configs.CurrencyUnit) != strings.TrimSpace(to) { result, err := exchangeRate.GetExchangeRete(configs.CurrencyUnit, to, strings.TrimSpace(configs.AccessKey), 1) if err != nil { - return 0, err + if to == "CNY" && strings.TrimSpace(configs.CurrencyUnit) == "USD" && strings.TrimSpace(configs.FixedRate) != "" { + r := tool.FormatStringToFloat(strings.TrimSpace(configs.FixedRate)) + if r > 0 { + l.Infow("exchangeRate.fixed.fallback", logger.Field("rate", r), logger.Field("error", err.Error())) + return amount * r, nil + } + } + // fallback: try without access key + result2, err2 := exchangeRate.GetExchangeRete(configs.CurrencyUnit, to, "", 1) + if err2 != nil { + return 0, err + } + result = result2 } l.Infow("exchangeRate", logger.Field("from", configs.CurrencyUnit), logger.Field("to", to), logger.Field("rate", result)) amount = result * amount