package payment import ( "SciencesServer/app/api/website/model" model2 "SciencesServer/app/common/model" "SciencesServer/app/session" "SciencesServer/serve/orm" "errors" "gorm.io/gorm" "time" ) // Instance 支付管理 type Instance struct { *session.Enterprise } type IInstance interface { grant(tx *gorm.DB) error } type InstanceHandle func(session *session.Enterprise) *Instance type InstanceGrant struct { tx *gorm.DB uid uint64 params *model2.OrderInstanceParams } // handle 发放操作 func (c *InstanceGrant) handle() error { var _handle IInstance if c.params.Kind == model2.OrderInstanceParamsKindForActivity { data := c.params.Data.(*model2.OrderInstanceParamsForActivity) _handle = NewActivity()(c.uid, data.ID, data.Identity) } else if c.params.Kind == model2.OrderInstanceParamsKindForVIP { data := c.params.Data.(*model2.OrderInstanceParamsForVip) _handle = NewVip()(c.uid, data.ID, data.EffectTime) } if _handle != nil { return _handle.grant(c.tx) } return nil } // Launch 支付发起 func (c *Instance) Launch(id uint64) (interface{}, error) { mOrderInstance := model.NewOrderInstance() mOrderInstance.ID = id isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "order_no", "amount", "status"}) if err != nil { return nil, err } else if !isExist { return nil, errors.New("操作错误,订单信息不存在或已被删除") } else if mOrderInstance.Status != model2.OrderInstanceStatusForInit { return nil, errors.New("操作错误,当前订单状态不允许支付") } // 保存日志 mOrderLog := model.NewOrderLog() mOrderLog.UID = c.UID mOrderLog.OrderID = id if err = model2.Create(mOrderLog.OrderLog); err != nil { return nil, err } // 返回第三方支付接口参数 return nil, nil } // Callback 支付回调 func (c *Instance) Callback(orderNo string) error { mOrderInstance := model.NewOrderInstance() isExist, err := model2.FirstField(mOrderInstance.OrderInstance, []string{"id", "uid", "amount", "params", "status"}, model2.NewWhere("order_no", orderNo)) if err != nil { return err } else if !isExist { return errors.New("订单信息不存在或已被删除") } else if mOrderInstance.OrderInstance.Status != model2.OrderInstanceStatusForInit { // 状态异常 return errors.New("状态异常,不允许支付") } now := time.Now() // 更改订单状态为已支付 if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{ "status": model2.OrderInstanceStatusForPaid, "updated_at": now, }); err != nil { return nil } return orm.GetDB().Transaction(func(tx *gorm.DB) error { // 发放操作 if err = (&InstanceGrant{ tx: tx, uid: mOrderInstance.UID, params: mOrderInstance.GetParamsAttribute(), }).handle(); err != nil { return err } if err = model2.Updates(mOrderInstance.OrderInstance, map[string]interface{}{ "status": model2.OrderInstanceStatusForComplete, "updated_at": now, }, tx); err != nil { return err } return nil }) } func NewInstance() InstanceHandle { return func(session *session.Enterprise) *Instance { return &Instance{session} } }