ymt/api/v2/models.go

167 lines
4.7 KiB
Go

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
}