diff --git a/internal/service/client_order/payment_provider.go b/internal/service/client_order/payment_provider.go index d15041d..14db91a 100644 --- a/internal/service/client_order/payment_provider.go +++ b/internal/service/client_order/payment_provider.go @@ -46,14 +46,15 @@ func (w *wechatPaymentProvider) CreateJSAPIPayment(ctx context.Context, orderNo, // fuiouPaymentProvider 富友支付适配器。 type fuiouPaymentProvider struct { - client *fuiou.Client - appID string + client *fuiou.Client + appID string + tradeType string } // 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, "", "JSAPI", f.appID, openID) + resp, err := f.client.WxPreCreate(orderNo, amountStr, description, "127.0.0.1", f.tradeType, f.appID, openID) if err != nil { return nil, errors.Wrap(errors.CodeFuiouPayFailed, err, "富友预下单失败") } @@ -69,9 +70,14 @@ func (f *fuiouPaymentProvider) CreateJSAPIPayment(ctx context.Context, orderNo, } // newPaymentProvider 根据支付配置创建支付提供者。 -func (s *Service) newPaymentProvider(config *model.WechatConfig, appID string) (PaymentProvider, error) { +// appType: "official_account" 或 "miniapp" +func (s *Service) newPaymentProvider(config *model.WechatConfig, appID, appType string) (PaymentProvider, error) { switch config.ProviderType { case model.ProviderTypeFuiou: + tradeType := "JSAPI" + if appType == "miniapp" { + tradeType = "LETPAY" + } client, err := fuiou.NewClient( config.FyInsCd, config.FyMchntCd, @@ -85,7 +91,7 @@ func (s *Service) newPaymentProvider(config *model.WechatConfig, appID string) ( if err != nil { return nil, errors.Wrap(errors.CodeFuiouPayFailed, err, "创建富友客户端失败") } - return &fuiouPaymentProvider{client: client, appID: appID}, nil + return &fuiouPaymentProvider{client: client, appID: appID, tradeType: tradeType}, nil default: cache := wechat.NewRedisCache(s.redis) paymentApp, err := wechat.NewPaymentAppFromConfig(config, appID, cache, s.logger) diff --git a/internal/service/client_order/service.go b/internal/service/client_order/service.go index 18cd722..f040f3b 100644 --- a/internal/service/client_order/service.go +++ b/internal/service/client_order/service.go @@ -174,7 +174,7 @@ func (s *Service) CreateOrder(ctx context.Context, customerID uint, req *dto.Cli } }() - paymentProvider, err := s.newPaymentProvider(activeConfig, appID) + paymentProvider, err := s.newPaymentProvider(activeConfig, appID, req.AppType) if err != nil { return nil, err } diff --git a/pkg/fuiou/client.go b/pkg/fuiou/client.go index 8330de7..2f63a9b 100644 --- a/pkg/fuiou/client.go +++ b/pkg/fuiou/client.go @@ -202,6 +202,12 @@ func structToMap(data interface{}) map[string]string { for i := 0; i < t.NumField(); i++ { field := t.Field(i) + + // 排除 XMLName 字段(xml.Name 类型,仅用于指定根元素名称) + if field.Name == "XMLName" { + continue + } + value := v.Field(i).String() tag := field.Tag.Get("xml") diff --git a/pkg/fuiou/types.go b/pkg/fuiou/types.go index ed5834c..e5b458f 100644 --- a/pkg/fuiou/types.go +++ b/pkg/fuiou/types.go @@ -2,23 +2,26 @@ // 实现富友 wxPreCreate 接口的签名、通信和回调处理 package fuiou +import "encoding/xml" + // WxPreCreateRequest wxPreCreate 下单请求 type WxPreCreateRequest struct { - Version string `xml:"version"` // 版本号: 1.0 - InsCd string `xml:"ins_cd"` // 机构号 - MchntCd string `xml:"mchnt_cd"` // 商户号 - TermId string `xml:"term_id"` // 终端号 - RandomStr string `xml:"random_str"` // 随机字符串 - Sign string `xml:"sign"` // 签名 - MchntOrderNo string `xml:"mchnt_order_no"` // 商户订单号 - TradeType string `xml:"trade_type"` // 交易类型: JSAPI=公众号 LETPAY=小程序 - OrderAmt string `xml:"order_amt"` // 订单金额(分) - GoodsDesc string `xml:"goods_des"` // 商品描述 - TermIp string `xml:"term_ip"` // 终端IP - NotifyUrl string `xml:"notify_url"` // 回调地址 - SubAppid string `xml:"sub_appid"` // 子应用ID(公众号/小程序AppID) - SubOpenid string `xml:"sub_openid"` // 用户OpenID - LimitPay string `xml:"limit_pay"` // 限制支付方式(可选) + XMLName xml.Name `xml:"xml"` + Version string `xml:"version"` // 版本号: 1.0 + InsCd string `xml:"ins_cd"` // 机构号 + MchntCd string `xml:"mchnt_cd"` // 商户号 + TermId string `xml:"term_id"` // 终端号 + RandomStr string `xml:"random_str"` // 随机字符串 + Sign string `xml:"sign"` // 签名 + MchntOrderNo string `xml:"mchnt_order_no"` // 商户订单号 + TradeType string `xml:"trade_type"` // 交易类型: JSAPI=公众号 LETPAY=小程序 + OrderAmt string `xml:"order_amt"` // 订单金额(分) + GoodsDesc string `xml:"goods_des"` // 商品描述 + TermIp string `xml:"term_ip"` // 终端IP + NotifyUrl string `xml:"notify_url"` // 回调地址 + SubAppid string `xml:"sub_appid"` // 子应用ID(公众号/小程序AppID) + SubOpenid string `xml:"sub_openid"` // 用户OpenID + LimitPay string `xml:"limit_pay"` // 限制支付方式(可选) } // WxPreCreateResponse wxPreCreate 下单响应