From 68adc70ba6680bdcf71878e686ca50f6cad8081e Mon Sep 17 00:00:00 2001 From: wucongxing8150 <815046773@qq.com> Date: Fri, 9 Aug 2024 18:14:58 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86=E9=80=80=E6=AC=BE?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/service/OrderMember.go | 114 ++++---------------------------- api/service/OrderSingle.go | 132 ++----------------------------------- 2 files changed, 18 insertions(+), 228 deletions(-) diff --git a/api/service/OrderMember.go b/api/service/OrderMember.go index d5012fc..979b2a6 100644 --- a/api/service/OrderMember.go +++ b/api/service/OrderMember.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/app" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi" "gorm.io/gorm" "hepa-calc-admin-api/api/dao" "hepa-calc-admin-api/api/model" @@ -41,10 +39,6 @@ func (r *OrderMemberService) CancelOrderMember(tx *gorm.DB, orderMember *model.O } // 订单状态(1:待支付 2:已完成 3:已取消) - if orderMember.OrderStatus == 2 { - return false, errors.New("订单已完成,无法取消") - } - if orderMember.OrderStatus == 3 { return false, errors.New("订单已取消,请勿重复操作") } @@ -54,11 +48,6 @@ func (r *OrderMemberService) CancelOrderMember(tx *gorm.DB, orderMember *model.O return false, errors.New("订单已取消") } - // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - if orderMember.PayStatus == 2 { - return false, errors.New("订单已支付,无法取消") - } - // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) if orderMember.RefundStatus == 1 { return false, errors.New("订单已申请退款") @@ -77,6 +66,8 @@ func (r *OrderMemberService) CancelOrderMember(tx *gorm.DB, orderMember *model.O } // 修改订单为取消 + orderMemberDao := dao.OrderMemberDao{} + orderMemberData := make(map[string]interface{}) orderMemberData["order_status"] = 3 if cancelReason == 3 { @@ -86,112 +77,29 @@ func (r *OrderMemberService) CancelOrderMember(tx *gorm.DB, orderMember *model.O orderMemberData["cancel_status"] = 1 orderMemberData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") orderMemberData["cancel_remarks"] = utils.OrderCancelReasonToString(cancelReason) - orderMemberData["updated_at"] = time.Now().Format("2006-01-02 15:04:05") - - orderMemberDao := dao.OrderMemberDao{} err = orderMemberDao.EditOrderMemberById(tx, orderMember.OrderId, orderMemberData) if err != nil { return false, errors.New("订单取消失败") } - // 退还订单优惠卷 - if orderMember.CouponAmountTotal != 0 { - // 获取订单优惠卷数据 - orderMemberCouponDao := dao.OrderMemberCouponDao{} - orderMemberCoupon, err := orderMemberCouponDao.GetOrderMemberCouponByOrderId(orderMember.OrderId) - if err != nil { - tx.Rollback() - return false, errors.New("订单取消失败") - } - - userCouponService := &UserCouponService{} - userCouponService.ReturnUserCoupon(tx, orderMemberCoupon.UserCouponId) - } - - // 退还订单优惠卷 - err = r.OrderCouponRefund(tx, orderMember) - if err != nil { - tx.Rollback() - return false, err - } - // 订单退款 _, err = r.OrderRefund(tx, orderMember, refundAmount, utils.OrderCancelReasonToString(cancelReason)) if err != nil { - tx.Rollback() return false, err } + // 处理支付金额为0时退还优惠卷问题 + if orderMember.PaymentAmountTotal == 0 { + // 退还订单优惠卷 + err = r.OrderCouponRefund(tx, orderMember) + if err != nil { + return false, err + } + } + return true, nil } -// GetJsapiPrepay 获取jsapi预支付交易会话标识 -func (r *OrderMemberService) GetJsapiPrepay(m *model.OrderMember) (prepay *jsapi.PrepayWithRequestPaymentResponse, err error) { - // 获取用户数据 - userDao := dao.UserDao{} - user, err := userDao.GetUserById(m.UserId) - if err != nil || user == nil { - return nil, errors.New("用户错误") - } - - if user.OpenId != "" { - return nil, errors.New("发起支付失败") - } - - jsapiRequest := weChat.JsapiRequest{ - AppId: config.C.Wechat.AppId, - MchId: config.C.Wechat.Pay1281030301.MchId, - Description: "肝病算一算", - OutTradeNo: m.OrderNo, - NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.MemberRefundNotifyUrl, - Amount: weChat.JsapiRequestAmountRequest{ - Total: int64(m.PaymentAmountTotal * 100), - Currency: "CNY", - }, - Payer: weChat.JsapiRequestPayerRequest{OpenId: user.OpenId}, - } - - prepay, err = jsapiRequest.GetJsapiPrepay() - if err != nil { - return nil, err - } - - return prepay, nil -} - -// GetAppPrepay 获取app预支付交易会话标识 -func (r *OrderMemberService) GetAppPrepay(m *model.OrderMember) (prepay *app.PrepayWithRequestPaymentResponse, err error) { - // 获取用户数据 - userDao := dao.UserDao{} - user, err := userDao.GetUserById(m.UserId) - if err != nil || user == nil { - return nil, errors.New("用户错误") - } - - if user.OpenId != "" { - return nil, errors.New("发起支付失败") - } - - appRequest := weChat.AppRequest{ - AppId: config.C.Wechat.AppId, - MchId: config.C.Wechat.Pay1281030301.MchId, - Description: "肝病算一算", - OutTradeNo: m.OrderNo, - NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.MemberRefundNotifyUrl, - Amount: weChat.AppRequestAmountRequest{ - Total: int64(m.PaymentAmountTotal * 100), - Currency: "CNY", - }, - } - - prepay, err = appRequest.GetAppPrepay() - if err != nil { - return nil, err - } - - return prepay, nil -} - // OrderRefund 订单退款 func (r *OrderMemberService) OrderRefund(tx *gorm.DB, order *model.OrderMember, refundAmount *float64, refundReason string) (*model.OrderMemberRefund, error) { var refundStatus int diff --git a/api/service/OrderSingle.go b/api/service/OrderSingle.go index dabdb47..c2d1d54 100644 --- a/api/service/OrderSingle.go +++ b/api/service/OrderSingle.go @@ -4,8 +4,6 @@ import ( "context" "errors" "fmt" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/app" - "github.com/wechatpay-apiv3/wechatpay-go/services/payments/jsapi" "gorm.io/gorm" "hepa-calc-admin-api/api/dao" "hepa-calc-admin-api/api/model" @@ -41,10 +39,6 @@ func (r *OrderSingleService) CancelOrderSingle(tx *gorm.DB, orderSingle *model.O } // 订单状态(1:待支付 2:已完成 3:已取消) - if orderSingle.OrderStatus == 2 { - return false, errors.New("订单已完成,无法取消") - } - if orderSingle.OrderStatus == 3 { return false, errors.New("订单已取消,请勿重复操作") } @@ -54,11 +48,6 @@ func (r *OrderSingleService) CancelOrderSingle(tx *gorm.DB, orderSingle *model.O return false, errors.New("订单已取消") } - // 支付状态(1:未支付 2:已支付 3:支付中 4:支付失败 5:支付超时 6:支付关闭 7:已撤销 8:转入退款) - if orderSingle.PayStatus == 2 { - return false, errors.New("订单已支付,无法取消") - } - // 订单退款状态(0:无退款 1:申请退款 2:退款中 3:退款成功 4:拒绝退款 5:退款关闭 6:退款异常 7:部分退款) if orderSingle.RefundStatus == 1 { return false, errors.New("订单已申请退款") @@ -77,6 +66,8 @@ func (r *OrderSingleService) CancelOrderSingle(tx *gorm.DB, orderSingle *model.O } // 修改订单为取消 + orderSingleDao := dao.OrderSingleDao{} + orderSingleData := make(map[string]interface{}) orderSingleData["order_status"] = 3 if cancelReason == 3 { @@ -86,130 +77,21 @@ func (r *OrderSingleService) CancelOrderSingle(tx *gorm.DB, orderSingle *model.O orderSingleData["cancel_status"] = 1 orderSingleData["cancel_time"] = time.Now().Format("2006-01-02 15:04:05") orderSingleData["cancel_remarks"] = utils.OrderCancelReasonToString(cancelReason) - orderSingleData["updated_at"] = time.Now().Format("2006-01-02 15:04:05") - - orderSingleDao := dao.OrderSingleDao{} err = orderSingleDao.EditOrderSingleById(tx, orderSingle.OrderId, orderSingleData) if err != nil { return false, errors.New("订单取消失败") } - // 退还订单优惠卷 - err = r.OrderCouponRefund(tx, orderSingle) - if err != nil { - tx.Rollback() - return false, err - } - // 订单退款 _, err = r.OrderRefund(tx, orderSingle, refundAmount, utils.OrderCancelReasonToString(cancelReason)) if err != nil { - tx.Rollback() return false, err } - return true, nil -} - -// GetJsapiPrepay 获取jsapi预支付交易会话标识 -func (r *OrderSingleService) GetJsapiPrepay(m *model.OrderSingle) (prepay *jsapi.PrepayWithRequestPaymentResponse, err error) { - // 获取用户数据 - userDao := dao.UserDao{} - user, err := userDao.GetUserById(m.UserId) - if err != nil || user == nil { - return nil, errors.New("用户错误") - } - - if user.OpenId == "" { - return nil, errors.New("发起支付失败") - } - - jsapiRequest := weChat.JsapiRequest{ - AppId: config.C.Wechat.AppId, - MchId: config.C.Wechat.Pay1281030301.MchId, - Description: "肝病算一算", - OutTradeNo: m.OrderNo, - NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.SingleRefundNotifyUrl, - Amount: weChat.JsapiRequestAmountRequest{ - Total: int64(m.PaymentAmountTotal * 100), - Currency: "CNY", - }, - Payer: weChat.JsapiRequestPayerRequest{OpenId: user.OpenId}, - } - - prepay, err = jsapiRequest.GetJsapiPrepay() - if err != nil { - return nil, err - } - - return prepay, nil -} - -// GetAppPrepay 获取app预支付交易会话标识 -func (r *OrderSingleService) GetAppPrepay(m *model.OrderSingle) (prepay *app.PrepayWithRequestPaymentResponse, err error) { - // 获取用户数据 - userDao := dao.UserDao{} - user, err := userDao.GetUserById(m.UserId) - if err != nil || user == nil { - return nil, errors.New("用户错误") - } - - if user.OpenId == "" { - return nil, errors.New("发起支付失败") - } - - appRequest := weChat.AppRequest{ - AppId: config.C.Wechat.AppId, - MchId: config.C.Wechat.Pay1281030301.MchId, - Description: "肝病算一算", - OutTradeNo: m.OrderNo, - NotifyUrl: config.C.Wechat.RefundNotifyDomain + config.C.Wechat.SingleRefundNotifyUrl, - Amount: weChat.AppRequestAmountRequest{ - Total: int64(m.PaymentAmountTotal * 100), - Currency: "CNY", - }, - } - - prepay, err = appRequest.GetAppPrepay() - if err != nil { - return nil, err - } - - return prepay, nil -} - -// CompleteUnPayOrderSingle 完成未支付单项订单-开通会员成功时使用 -func (r *OrderSingleService) CompleteUnPayOrderSingle(tx *gorm.DB, userId int64) (bool, error) { - // 获取所有未支付单项订单 - orderSingleDao := dao.OrderSingleDao{} - maps := make(map[string]interface{}) - maps["user_id"] = userId - maps["order_status"] = 1 - maps["pay_status"] = 1 - maps["cancel_status"] = 0 - orderSingles, err := orderSingleDao.GetOrderSingleList(maps) - if err != nil { - return false, err - } - - for _, single := range orderSingles { - // 生成第三方支付流水号 - escrowTradeNo := "GD" + global.Snowflake.Generate().String() - - orderSingleData := make(map[string]interface{}) - orderSingleData["order_status"] = 2 - orderSingleData["pay_status"] = 2 - orderSingleData["pay_time"] = time.Now().Format("2006-01-02 15:04:05") - orderSingleData["escrow_trade_no"] = escrowTradeNo - orderSingleData["updated_at"] = time.Now().Format("2006-01-02 15:04:05") - err = orderSingleDao.EditOrderSingleById(tx, single.OrderId, orderSingleData) - if err != nil { - return false, err - } - - // 增加题目支付次数 - questionDao := dao.QuestionDao{} - err = questionDao.Inc(tx, single.QuestionId, "pay_count", 1) + // 处理支付金额为0时退还优惠卷问题 + if orderSingle.PaymentAmountTotal == 0 { + // 退还订单优惠卷 + err = r.OrderCouponRefund(tx, orderSingle) if err != nil { return false, err } @@ -302,7 +184,7 @@ func (r *OrderSingleService) OrderRefund(tx *gorm.DB, order *model.OrderSingle, orderSingleRefundDao := dao.OrderSingleRefundDao{} orderSingleRefund, err := orderSingleRefundDao.AddOrderSingleRefund(tx, orderRefund) if err != nil || orderSingleRefund == nil { - return nil, errors.New(err.Error()) + return nil, errors.New("退款失败") } return orderSingleRefund, nil