From 9108c2bce9c9fb042ad626afef1e3c0f36e537d9 Mon Sep 17 00:00:00 2001 From: wolter <11@gmail> Date: Wed, 18 Jun 2025 19:09:29 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E5=AE=9Djsapi=E6=94=AF=E4=BB=98=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E5=9B=9E=E8=B0=83=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E5=85=83=E8=BD=AC=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/services/thirdpay/do/pay.go | 5 ++- app/services/thirdpay/do/pay_way.go | 1 + app/third/paymentService/ali_service.go | 45 ++++++++++++++++++++- app/third/paymentService/payment_service.go | 3 ++ 4 files changed, 52 insertions(+), 2 deletions(-) diff --git a/app/services/thirdpay/do/pay.go b/app/services/thirdpay/do/pay.go index 26da8d6..976cbdd 100644 --- a/app/services/thirdpay/do/pay.go +++ b/app/services/thirdpay/do/pay.go @@ -145,7 +145,6 @@ func (w *Pay) PayUrl() (url string) { } case common.PAY_CHANNEL_WECHAT_MINI: // 微信小程序支付 - // 如果传openid,获取支付参数 if w.PayParam.OpenId != "" { res = paymentService.PaymentService(*w.ctx, *thirdPay) @@ -176,6 +175,10 @@ func (w *Pay) PayUrl() (url string) { } } + case common.PAY_CHANNEL_ALIPAY_JSAPI: + // 支付宝jsapi支付 + res = paymentService.PaymentService(*w.ctx, *thirdPay) + default: w.PayCode = errorcode.PayChannelNotBuild return diff --git a/app/services/thirdpay/do/pay_way.go b/app/services/thirdpay/do/pay_way.go index 6dd9867..4c6fe6b 100644 --- a/app/services/thirdpay/do/pay_way.go +++ b/app/services/thirdpay/do/pay_way.go @@ -14,6 +14,7 @@ var PayWayList = map[int]func(commonPayInfo *paymentService.PayOrderRequest, cha common.PAY_CHANNEL_ALIPAY_PC: AlipayWeb, common.PAY_CHANNEL_WECHAT_JSAPI: WechatJSAPI, common.PAY_CHANNEL_WECHAT_MINI: WechatJSAPI, + common.PAY_CHANNEL_ALIPAY_JSAPI: AlipayWeb, } func WechatH5(commonPayInfo *paymentService.PayOrderRequest, channel *paychannelmodel.PayChannel) error { diff --git a/app/third/paymentService/ali_service.go b/app/third/paymentService/ali_service.go index 1833174..80446c3 100644 --- a/app/third/paymentService/ali_service.go +++ b/app/third/paymentService/ali_service.go @@ -155,7 +155,15 @@ func ALiCallBack(notifyReq gopay.BodyMap, aliConfig AliPay) error { // 拼装数据触发下游回调,触发下游回调 orderId, _ := strconv.Atoi(notifyReq.Get("out_trade_no")) - payerTotal, _ := strconv.Atoi(notifyReq.Get("buyer_pay_amount")) + buyerPayAmount := notifyReq.Get("buyer_pay_amount") // 单位为元 + // 将字符串转换为浮点数,转为分 + buyerPayAmountFloat, err := strconv.ParseFloat(buyerPayAmount, 64) + if err != nil { + logger.Error(context.Background(), "ALiCallBack 发生错误", fmt.Sprintf("回调时,金额转换失败,失败原因:%s", err.Error())) + return err + } + payerTotal := int(buyerPayAmountFloat * 100) + // 订单状态 tradeStatus := notifyReq.Get("trade_status") errCode := 0 @@ -356,3 +364,38 @@ func AliCloseOrder(ctx context.Context, orderCloseRequest OrderCloseRequest) (Or OutTradeNo: int64(outTradeNo), }, nil } + +// 支付宝,jsapi支付, 返回支付宝交易号用于小程序支付 +func ALiJsApiPayInfo(c context.Context, payOrderRequest PayOrderRequest) (string, error) { + // 初始化支付宝客户端 + aliClient, err := AliInitClient(payOrderRequest.Ali) + if err != nil { + return "", err + } + // 初始化 BodyMap + amount := float64(payOrderRequest.Amount) / 100.0 + + envConfig := config.GetConf() + bm := make(gopay.BodyMap) + bm.Set("out_trade_no", payOrderRequest.OrderId). + Set("total_amount", amount). + Set("subject", payOrderRequest.Description). + Set("qr_pay_mode", "JSAPI_PAY"). + Set("op_app_id", payOrderRequest.Ali.AppId). + Set("buyer_open_id", payOrderRequest.OpenId). + Set("notify_url", fmt.Sprintf(envConfig.PayService.Host+payCommon.ALI_NOTIFY_URL_TEST+"%d", payOrderRequest.PayChannelId)) + if payOrderRequest.ReturnUrl != "" { + bm.Set("return_url", payOrderRequest.ReturnUrl) + } + + aliRsp, err := aliClient.TradeCreate(c, bm) + if err != nil { + logger.Error(c, "ALiH5PayInfo 发生错误", fmt.Sprintf("错误信息:%s", err.Error())) + if bizErr, ok := alipay.IsBizError(err); ok { + return "", bizErr + } + return "", err + } + + return aliRsp.Response.TradeNo, nil +} diff --git a/app/third/paymentService/payment_service.go b/app/third/paymentService/payment_service.go index 4939b1e..912633f 100644 --- a/app/third/paymentService/payment_service.go +++ b/app/third/paymentService/payment_service.go @@ -66,6 +66,9 @@ func PaymentService(c context.Context, payOrderRequest PayOrderRequest) PayOrder case payCommon.PAY_CHANNEL_ALIPAY_PC: // 支付宝PC支付 info, err = ALiPCPayInfo(c, payOrderRequest) + case payCommon.PAY_CHANNEL_ALIPAY_JSAPI: + // 支付宝JSAPI支付 + info, err = ALiJsApiPayInfo(c, payOrderRequest) default: payOrderResponse = PayOrderResponse{