From 99320a018cf0758252817f072caeca4d910fa6d3 Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 9 Aug 2024 16:49:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E7=9B=B8=E5=85=B3=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B61?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/OrderMember.go | 35 +++++---------- api/service/OrderSingle.go | 35 +++++---------- config.yaml | 6 +-- extend/weChat/base.go | 89 +++++++++++++++++++------------------- 4 files changed, 71 insertions(+), 94 deletions(-) diff --git a/api/service/OrderMember.go b/api/service/OrderMember.go index 1655f4b..d5012fc 100644 --- a/api/service/OrderMember.go +++ b/api/service/OrderMember.go @@ -195,7 +195,7 @@ func (r *OrderMemberService) GetAppPrepay(m *model.OrderMember) (prepay *app.Pre // OrderRefund 订单退款 func (r *OrderMemberService) OrderRefund(tx *gorm.DB, order *model.OrderMember, refundAmount *float64, refundReason string) (*model.OrderMemberRefund, error) { var refundStatus int - var successTime time.Time + var successTime *time.Time var refundId string // 判断订单支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) @@ -217,7 +217,9 @@ func (r *OrderMemberService) OrderRefund(tx *gorm.DB, order *model.OrderMember, // 支付金额为0,模拟退款 refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) refundStatus = 3 - successTime = time.Now() + + now := time.Now() + successTime = &now } // 退款金额大于0 @@ -237,27 +239,14 @@ func (r *OrderMemberService) OrderRefund(tx *gorm.DB, order *model.OrderMember, return nil, err } - if refund.Status == nil { - return nil, errors.New("退款状态错误") + // 处理退款状态 + wxPayRefundResult, err := weChat.HandlePayRefundStatus(refund) + if err != nil { + return nil, err } - // 处理订单状态 - switch *refund.Status { - case "SUCCESS": // 退款成功 - refundStatus = 3 - if refund.SuccessTime != nil { - successTime = *refund.SuccessTime - } - case "CLOSED": // 退款关闭 - - refundStatus = 5 - case "PROCESSING": // 退款处理中 - refundStatus = 2 - case "ABNORMAL": // 退款异常 - return nil, errors.New("退款状态错误") - default: - return nil, errors.New("退款状态错误") - } + refundStatus = wxPayRefundResult.RefundStatus + successTime = wxPayRefundResult.SuccessTime if refund.RefundId == nil { return nil, errors.New("缺少退款订单编号") @@ -279,8 +268,8 @@ func (r *OrderMemberService) OrderRefund(tx *gorm.DB, order *model.OrderMember, RefundReason: refundReason, } - if refundStatus == 3 && !successTime.IsZero() { - t := model.LocalTime(successTime) + if refundStatus == 3 && successTime != nil { + t := model.LocalTime(*successTime) orderRefund.SuccessTime = &t } diff --git a/api/service/OrderSingle.go b/api/service/OrderSingle.go index ff464ae..dabdb47 100644 --- a/api/service/OrderSingle.go +++ b/api/service/OrderSingle.go @@ -221,7 +221,7 @@ func (r *OrderSingleService) CompleteUnPayOrderSingle(tx *gorm.DB, userId int64) // OrderRefund 订单退款 func (r *OrderSingleService) OrderRefund(tx *gorm.DB, order *model.OrderSingle, refundAmount *float64, refundReason string) (*model.OrderSingleRefund, error) { var refundStatus int - var successTime time.Time + var successTime *time.Time var refundId string // 判断订单支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) @@ -243,7 +243,9 @@ func (r *OrderSingleService) OrderRefund(tx *gorm.DB, order *model.OrderSingle, // 支付金额为0,模拟退款 refundId = "模拟退款:" + strconv.FormatInt(global.Snowflake.Generate().Int64(), 10) refundStatus = 3 - successTime = time.Now() + + now := time.Now() + successTime = &now } // 退款金额大于0 @@ -263,27 +265,14 @@ func (r *OrderSingleService) OrderRefund(tx *gorm.DB, order *model.OrderSingle, return nil, err } - if refund.Status == nil { - return nil, errors.New("退款状态错误") + // 处理退款状态 + wxPayRefundResult, err := weChat.HandlePayRefundStatus(refund) + if err != nil { + return nil, err } - // 处理订单状态 - switch *refund.Status { - case "SUCCESS": // 退款成功 - refundStatus = 3 - if refund.SuccessTime != nil { - successTime = *refund.SuccessTime - } - case "CLOSED": // 退款关闭 - - refundStatus = 5 - case "PROCESSING": // 退款处理中 - refundStatus = 2 - case "ABNORMAL": // 退款异常 - return nil, errors.New("退款状态错误") - default: - return nil, errors.New("退款状态错误") - } + refundStatus = wxPayRefundResult.RefundStatus + successTime = wxPayRefundResult.SuccessTime if refund.RefundId == nil { return nil, errors.New("缺少退款订单编号") @@ -305,8 +294,8 @@ func (r *OrderSingleService) OrderRefund(tx *gorm.DB, order *model.OrderSingle, RefundReason: refundReason, } - if refundStatus == 3 && !successTime.IsZero() { - t := model.LocalTime(successTime) + if refundStatus == 3 && successTime != nil { + t := model.LocalTime(*successTime) orderRefund.SuccessTime = &t } diff --git a/config.yaml b/config.yaml index 78f88ee..3860a0e 100644 --- a/config.yaml +++ b/config.yaml @@ -50,9 +50,9 @@ wechat: app-id: wx68affaa9d23528f8 app-secret: 2963c90242ddb2421c939591ad9e903d single-pay-notify-url: callback/wxpay/single # 单项支付回调地址 - single-refund-notify-url: callback/wxpay/inquiry/refund # 单项退款回调地址 - member-pay-notify-url: callback/wxpay/single # 会员支付回调地址 - member-refund-notify-url: callback/wxpay/inquiry/refund # 会员退款回调地址 + single-refund-notify-url: callback/wxpay/single/refund # 单项退款回调地址 + member-pay-notify-url: callback/wxpay/member # 会员支付回调地址 + member-refund-notify-url: callback/wxpay/member/refund # 会员退款回调地址 refund-notify-domain: https://dev-hepa.igandan.com/api/ pay-1281030301: mch-id: 1281030301 diff --git a/extend/weChat/base.go b/extend/weChat/base.go index 242318a..57dd518 100644 --- a/extend/weChat/base.go +++ b/extend/weChat/base.go @@ -6,6 +6,7 @@ import ( "github.com/wechatpay-apiv3/wechatpay-go/core" "github.com/wechatpay-apiv3/wechatpay-go/core/option" "github.com/wechatpay-apiv3/wechatpay-go/services/payments" + "github.com/wechatpay-apiv3/wechatpay-go/services/refunddomestic" "github.com/wechatpay-apiv3/wechatpay-go/utils" "hepa-calc-admin-api/config" "time" @@ -41,65 +42,63 @@ func createClient() (*core.Client, error) { return client, nil } +// WxPayResult 支付结果 type WxPayResult struct { - OrderStatus *int `json:"order_status"` // 订单状态(1:待支付 2:已完成 3:已取消) - PayStatus *int `json:"pay_status"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - PayTime *time.Time `json:"pay_time"` // 支付时间 + OrderStatus int `json:"order_status"` // 订单状态(1:待支付 2:已完成 3:已取消) + PayStatus int `json:"pay_status"` // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) + PayTime *string `json:"pay_time"` // 支付时间 +} + +// WxPayRefundResult 退款结果 +type WxPayRefundResult struct { + RefundStatus int `json:"refundStatus"` // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) + SuccessTime *time.Time `json:"successTime"` // 退款成功时间 } // HandlePayStatus 处理支付状态 func HandlePayStatus(t *payments.Transaction) (w *WxPayResult, err error) { - // 支付成功 - if *t.TradeState == "SUCCESS" { - orderStatus := 2 - w.OrderStatus = &orderStatus - - payStatus := 2 - w.PayStatus = &payStatus - - parse, err := time.Parse("2006-01-02T15:04:05+07:00", *t.SuccessTime) - if err != nil { - return nil, errors.New("支付时间处理错误") - } - - w.PayTime = &parse - if err != nil { - return nil, errors.New("支付时间错误") - } - } - switch *t.TradeState { case "SUCCESS": // 支付成功 - orderStatus := 2 - w.OrderStatus = &orderStatus - - payStatus := 2 - w.PayStatus = &payStatus - - parse, err := time.Parse("2006-01-02T15:04:05+07:00", *t.SuccessTime) - if err != nil { - return nil, errors.New("支付时间处理错误") - } - - w.PayTime = &parse - if err != nil { - return nil, errors.New("支付时间错误") - } + w.OrderStatus = 2 + w.PayStatus = 2 + w.PayTime = t.SuccessTime case "CLOSED": // 已关闭 - payStatus := 6 - w.PayStatus = &payStatus + w.PayStatus = 6 case "REVOKED": // 已撤销(付款码支付) - payStatus := 7 - w.PayStatus = &payStatus + w.PayStatus = 7 case "USERPAYING": // 用户支付中(付款码支付) - payStatus := 3 - w.PayStatus = &payStatus + w.PayStatus = 3 case "PAYERROR": // 支付失败(其他原因,如银行返回失败) - payStatus := 4 - w.PayStatus = &payStatus + w.PayStatus = 4 default: return nil, errors.New("未知支付状态") } return w, nil } + +// HandlePayRefundStatus 处理退款状态 +func HandlePayRefundStatus(r *refunddomestic.Refund) (w *WxPayRefundResult, err error) { + if r.Status == nil { + return nil, errors.New("退款状态错误") + } + + switch *r.Status { + case "SUCCESS": // 退款成功 + w.RefundStatus = 3 + if r.SuccessTime != nil { + //successTime := r.SuccessTime.Format("2006-01-02 15:04:05") + w.SuccessTime = r.SuccessTime + } + case "CLOSED": // 退款关闭 + w.RefundStatus = 5 + case "PROCESSING": // 退款处理中 + w.RefundStatus = 2 + case "ABNORMAL": // 退款异常 + return nil, errors.New("退款状态错误") + default: + return nil, errors.New("退款状态错误") + } + + return w, nil +}