package v2 import ( "encoding/json" "fmt" "github.com/go-playground/validator/v10" ) type OrderRequest struct { OutBizNo string `validate:"required,alphanum,min=2,max=32" json:"out_biz_no"` // 同一商户应用下不可重复 ActivityNo string `validate:"required,min=2,max=32" json:"activity_no"` Number int32 `validate:"required,min=1,max=10000" json:"number"` NotifyUrl string `json:"notify_url,omitempty"` // 回调地址,为空则使用客户应用设置地址 Extra string `json:"extra,omitempty"` // 拓展参数,备用 } type OrderResponse struct { OutBizNo string `json:"out_biz_no"` TradeNo string `json:"trade_no"` } func (a *OrderRequest) String() (string, error) { b, err := json.Marshal(a) if err != nil { return "", err } return string(b), nil } func (c *OrderRequest) Validate() error { if err := validator.New().Struct(c); err != nil { for _, err = range err.(validator.ValidationErrors) { return fmt.Errorf(err.Error()) } } return nil } type QueryRequest struct { OutBizNo string `json:"out_biz_no,omitempty" validate:"omitempty,alphanum,min=2,max=32"` // out_biz_no/trade_no二选一 同一商户应用下不可重复 TradeNo string `json:"trade_no,omitempty" validate:"omitempty,alphanum,min=2,max=32"` // out_biz_no/trade_no二选一 若不为空,则优先使用 } type QueryResponse struct { OutBizNo string `json:"out_biz_no"` TradeNo string `json:"trade_no"` Status Status `json:"status"` Number int32 `json:"number"` KeyMapCiphertext string `json:"ciphertext" validate:"required"` } type KeyInfo struct { Key string `json:"key,omitempty"` // key码 Url string `json:"url,omitempty"` // 短链接 UsableNum uint32 `json:"usable_num"` // 可兑换次数 UsageNum uint32 `json:"usage_num"` // 已核销次数 Status KeyStatus `json:"status"` // 状态 BeginTime string `json:"begin_time"` // 开始时间 EndTime string `json:"end_time"` // 结束时间 Amount float32 `json:"amount,omitempty"` // 金额 PayAmount float32 `json:"pay_amount,omitempty"` // 支付金额 PayTime string `json:"pay_time,omitempty"` // 支付时间 SettlementPrice float32 `json:"settlement_price,omitempty"` // 结算价 UsageTime string `json:"usage_time,omitempty"` // 最后一次核销时间 DiscardTime string `json:"discard_time,omitempty"` // 作废时间 } func (a *QueryRequest) String() (string, error) { b, err := json.Marshal(a) if err != nil { return "", err } return string(b), nil } func (q *QueryRequest) Validate() error { if q.OutBizNo == "" && q.TradeNo == "" { return fmt.Errorf("参数错误,out_biz_no/trade_no 二选一") } if err := validator.New().Struct(q); err != nil { for _, err = range err.(validator.ValidationErrors) { return fmt.Errorf(err.Error()) } } return nil } type Notify struct { AppId string `json:"app_id" validate:"required"` SignType string `json:"sign_type" validate:"required"` Timestamp string `json:"timestamp" validate:"required"` Sign string `json:"sign" validate:"required"` Data NotifyData `json:"data" validate:"required"` } type NotifyData struct { Event NotifyEvent `json:"event" validate:"required"` NotifyId string `json:"notify_id" validate:"required"` OutBizNo string `json:"out_biz_no" validate:"required"` TradeNo string `json:"trade_no" validate:"required"` ActivityNo string `json:"activity_no" validate:"required"` Number int32 `json:"number" validate:"required"` Status Status `json:"status" validate:"required"` KeyMapCiphertext string `json:"ciphertext" validate:"required"` } func (d *Notify) Validate() error { if err := validator.New().Struct(d); err != nil { for _, err = range err.(validator.ValidationErrors) { return fmt.Errorf(err.Error()) } } return nil } func (a *Notify) String() (string, error) { b, err := json.Marshal(a) if err != nil { return "", err } return string(b), nil } func (d *NotifyData) Validate() error { if err := validator.New().Struct(d); err != nil { for _, err = range err.(validator.ValidationErrors) { return fmt.Errorf(err.Error()) } } return nil } func (a *NotifyData) String() (string, error) { b, err := json.Marshal(a) if err != nil { return "", err } return string(b), nil } func (a *Notify) SignString() (string, error) { b, err := a.Data.String() if err != nil { return "", nil } return a.AppId + a.Timestamp + b, nil }