package service 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" "hepa-calc-admin-api/config" "hepa-calc-admin-api/extend/weChat" "hepa-calc-admin-api/global" "hepa-calc-admin-api/utils" "time" ) type OrderMemberService struct { } // CancelOrderMember 取消会员订单 // cancelReason:订单取消原因(1:主动取消 2:后台取消 3:支付超时取消) func (r *OrderMemberService) CancelOrderMember(tx *gorm.DB, userId, orderId int64, cancelReason int) (bool, error) { // 检测多次请求 redisKey := "CancelOrderMember" + fmt.Sprintf("%d", userId) + fmt.Sprintf("%d", orderId) res, _ := global.Redis.Get(context.Background(), redisKey).Result() if res != "" { return false, errors.New("请勿重复操作") } defer func(redisKey string) { global.Redis.Del(context.Background(), redisKey) }(redisKey) // 添加缓存 _, err := global.Redis.Set(context.Background(), redisKey, "1", (10)*time.Second).Result() if err != nil { return false, errors.New("取消订单失败") } // 获取订单数据 orderMemberDao := dao.OrderMemberDao{} maps := make(map[string]interface{}) maps["order_id"] = orderId orderMember, err := orderMemberDao.GetOrderMember(maps) if err != nil { return false, errors.New("订单异常") } // 订单状态(1:待支付 2:已完成 3:已取消) if orderMember.OrderStatus == 2 { return false, errors.New("订单已完成,无法取消") } if orderMember.OrderStatus == 3 { return false, errors.New("订单已取消,请勿重复操作") } // 取消状态(0:否 1:是) if orderMember.CancelStatus == 1 { 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("订单已申请退款") } if orderMember.RefundStatus == 2 { return false, errors.New("订单退款中") } if orderMember.RefundStatus == 3 { return false, errors.New("订单已退款成功") } if orderMember.RefundStatus == 6 { return false, errors.New("订单退款异常") } // 修改订单为取消 orderMemberData := make(map[string]interface{}) orderMemberData["order_status"] = 3 if cancelReason == 3 { // 支付超时取消 orderMemberData["pay_status"] = 5 } 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") err = orderMemberDao.EditOrderMemberById(tx, orderId, orderMemberData) if err != nil { return false, errors.New("订单取消失败") } // 退还订单优惠卷 if orderMember.CouponAmountTotal != 0 { // 获取订单优惠卷数据 orderMemberCouponDao := dao.OrderMemberCouponDao{} orderMemberCoupon, err := orderMemberCouponDao.GetOrderMemberCouponByOrderId(orderId) if err != nil { tx.Rollback() return false, errors.New("订单取消失败") } userCouponService := &UserCouponService{} userCouponService.ReturnUserCoupon(tx, orderMemberCoupon.UserCouponId) } 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.RefundNotifyUrl, 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.RefundNotifyUrl, Amount: weChat.AppRequestAmountRequest{ Total: int64(m.PaymentAmountTotal * 100), Currency: "CNY", }, } prepay, err = appRequest.GetAppPrepay() if err != nil { return nil, err } return prepay, nil }