diff --git a/internal/service/client_order/payment_provider.go b/internal/service/client_order/payment_provider.go index 14db91a..16b71a4 100644 --- a/internal/service/client_order/payment_provider.go +++ b/internal/service/client_order/payment_provider.go @@ -54,7 +54,7 @@ type fuiouPaymentProvider struct { // CreateJSAPIPayment 创建富友 JSAPI 预下单。 func (f *fuiouPaymentProvider) CreateJSAPIPayment(ctx context.Context, orderNo, description, openID string, amount int) (*PaymentResult, error) { amountStr := strconv.Itoa(amount) - resp, err := f.client.WxPreCreate(orderNo, amountStr, description, "127.0.0.1", f.tradeType, f.appID, openID) + resp, err := f.client.WxPreCreate(orderNo, amountStr, description, fuiou.GetServerIP(), f.tradeType, f.appID, openID) if err != nil { return nil, errors.Wrap(errors.CodeFuiouPayFailed, err, "富友预下单失败") } diff --git a/pkg/fuiou/client.go b/pkg/fuiou/client.go index 2f63a9b..ef2543e 100644 --- a/pkg/fuiou/client.go +++ b/pkg/fuiou/client.go @@ -11,11 +11,13 @@ import ( "encoding/xml" "fmt" "io" + "net" "net/http" "net/url" "reflect" "sort" "strings" + "sync" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/transform" @@ -255,6 +257,26 @@ func generateRandomStr() string { return fmt.Sprintf("%x", b) } +var ( + serverIP string + serverIPOnce sync.Once +) + +// GetServerIP 获取服务器非回环 IPv4 地址(进程生命周期内缓存) +func GetServerIP() string { + serverIPOnce.Do(func() { + addrs, _ := net.InterfaceAddrs() + for _, addr := range addrs { + if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() && ipNet.IP.To4() != nil { + serverIP = ipNet.IP.String() + return + } + } + serverIP = "127.0.0.1" + }) + return serverIP +} + // parsePrivateKey 解析 Base64 编码的 RSA 私钥 // 支持多种格式: PEM(PKCS1/PKCS8) 和 DER(PKCS1/PKCS8) func parsePrivateKey(base64Str string) (*rsa.PrivateKey, error) { diff --git a/pkg/fuiou/types.go b/pkg/fuiou/types.go index 869212c..b4bd9ee 100644 --- a/pkg/fuiou/types.go +++ b/pkg/fuiou/types.go @@ -60,6 +60,7 @@ type NotifyRequest struct { // NotifyResponse 回调响应 type NotifyResponse struct { - ResultCode string `xml:"result_code"` // 结果码 - ResultMsg string `xml:"result_msg"` // 结果消息 + XMLName xml.Name `xml:"xml"` + ResultCode string `xml:"result_code"` // 结果码 + ResultMsg string `xml:"result_msg"` // 结果消息 }