package do import ( "PaymentCenter/app/constants/common" "PaymentCenter/app/constants/errorcode" "PaymentCenter/app/services" "xorm.io/builder" "PaymentCenter/app/http/entities/front" "PaymentCenter/app/models/merchantmodel" "PaymentCenter/app/models/orderrequestlogmodel" "PaymentCenter/app/models/ordersmodel" "PaymentCenter/app/models/paychannelmodel" "context" ) type PayCheck struct { ctx *context.Context WebPayReqs *front.PayReqs AppCheck *services.AppCheck RequestLog *orderrequestlogmodel.OrderRequestLog Channel *paychannelmodel.PayChannel Merchant *merchantmodel.Merchant OldOrder *ordersmodel.Orders CheckCode int } func NewPayCheck(ctx *context.Context, reqs *front.PayReqs, appCheck *services.AppCheck, ip string) *PayCheck { if appCheck == nil { appCheck = services.GetAppCheck(reqs.AppId, ip) } return &PayCheck{ ctx: ctx, WebPayReqs: reqs, AppCheck: appCheck, CheckCode: appCheck.Code, } } func (w *PayCheck) CheckForm() { if _, ok := common.OrderTypeList[w.WebPayReqs.OrderType]; !ok { //判断是否是支持的支付渠道 w.CheckCode = errorcode.PayChannelNotFound return } } func (w *PayCheck) CheckPayChannel() { conn := builder.NewCond() conn = conn.And(builder.Eq{"id": w.WebPayReqs.PayChannelId}) w.Channel, w.CheckCode = services.GetAndCheckPayChannel(&paychannelmodel.PayChannel{}, conn) } func (w *PayCheck) CheckMerchant() { conn := builder.NewCond() conn = conn.And(builder.Eq{"id": w.AppCheck.App.MerchantId}) w.Merchant, w.CheckCode = services.GetAndCheckMerchant(&merchantmodel.Merchant{}, conn) } func (w *PayCheck) CheckOrder() { cond := builder.NewCond() cond = cond.And(builder.Eq{"out_tread_no": w.WebPayReqs.OutTradeNo}, builder.Eq{"app_id": w.AppCheck.AppId}) order, code := services.OrderFindOne(&ordersmodel.Orders{}, cond) if code == errorcode.SystemError { w.CheckCode = code return } if code == errorcode.OrdersExist { w.OldOrder = order switch order.Status { case common.ORDER_STATUS_CLOSE: w.CheckCode = errorcode.OrderClosed case common.ORDER_STATUS_FAILED: w.CheckCode = errorcode.OrderFailed case common.ORDER_STATUS_PAYED: w.CheckCode = errorcode.OrderPayed } } return }