支付项目中第三方支付公司需要和客户进行签约。需要调用支付公司的接口将用户提交的基本信息提交给支付公司,支付公司发送验证码并告知用户须知,签约成功之后需要将协约基本信息进行保存,以后使用该协约进行代收付等资金业务。
单纯演示,将概要设计简化如下:获取客户端提交的用户信息,校验数据,调用第三方支付的接口,持久化到SQLite数据库,激活领域事件存储到MongoDB,领域事件的处理。
signProtocolAPI := "/api/sign_protocol"
router.POST(signProtocolAPI, handles(signProtocolAPI))
2. application
3. domain
func init() {
eh.RegisterCommand(func() eh.Command { return &SignProtocol{} })
}
const (
SignCommand eh.CommandType = "/api/sign_protocol"
)
type SignProtocol struct {
ID uuid.UUID
//通道号
AisleType string `json:"AisleType"`
//银行code,各平台不一样
BankCode string `json:"BankCode"`
//账户类型
AccountType string `json:"AccountType"`
//账户属性
AccountProp string `json:"AccountProp"`
//银行卡号
BankCardNo string `json:"BankCardNo"`
//预留手机号
ReservePhone string `json:"Tel"`
//银行卡预留的证件类型
IDCardType string `json:"IDType"`
//银行卡开户姓名
CardName string `json:"CardName"`
//银行卡预留的证件号码
IDCardNo string `json:"IDCardNo"`
//提示标识
Merrem string `json:"Merrem"`
//备注
Remark string `json:"Remark"`
}
func (c SignProtocol) AggregateID() uuid.UUID { return c.ID }
func (c SignProtocol) CommandType() eh.CommandType { return SignCommand }
func (c SignProtocol) AggregateType() eh.AggregateType { return "" } //Command需要知道具体Aggregate的存在,貌似不甚合理呀!!!
func init() {
prdctAgg := &ProtocolAggregate{
AggregateBase: events.NewAggregateBase("ProtocolAggregate", uuid.New()),
}
bus.RegisterHandler(SignCommand, prdctAgg)
}
type ProtocolAggregate struct {
*events.AggregateBase
}
var _ = eh.Aggregate(&ProtocolAggregate{})
func (a *ProtocolAggregate) HandleCommand(ctx context.Context, cmd eh.Command) error {
switch cmd := cmd.(type) {
case *SignProtocol:
//命令只需要确定输入参数满足业务校验即可
err := a.CheckSign()
if err != nil {
return err
}
//实际的业务可以异步进行处理
go a.CfrmSign(cmd)
return nil
}
return fmt.Errorf("couldn't handle command")
}
func (a *ProtocolAggregate) CheckSign() error {
//校验输入参数是否有效,
return nil
}
func (a *ProtocolAggregate) CfrmSign(cmd *SignProtocol) error {
protocolOrm := &interfaces.ProtocolOrm{
ProtocolNo: uuid.New().String(),
AisleType: cmd.AisleType,
BankCode: cmd.BankCode,
BankCardNo: cmd.BankCardNo,
ReservePhone: cmd.ReservePhone,
CardName: cmd.CardName,
IDCardNo: cmd.IDCardNo,
Merrem: cmd.Merrem,
Remark: cmd.Remark,
Status: 1,
}
protocolOrm.AccountType, _ = strconv.Atoi(cmd.AccountType)
protocolOrm.AccountProp, _ = strconv.Atoi(cmd.AccountProp)
protocolOrm.IDCardType, _ = strco