新银行开发模式
开发步骤
银企直联服务和代理之前通过 grpc 交互,需要编写 proto 文件来定义交互数据结构。
proto 文件编写
编写之前可以先学习 proto3 的官方指南
hzero-starter-ebank-proxy
里包含银行统一封装的服务,rpc 方法,消息定义,枚举。
proto 注意事项如下
- 枚举项建议以枚举名的首字母大写为前缀,由于枚举项全局唯一
- 消息定义里的字段都有唯一的编号,建议1-15由经常用的字段,其他不常用的编号可以从16开始,官方文档
新增银行标志
在 src/main/proto/common/enum.proto
里的枚举 BankMark
。例如工商银行。
// 银行标识
enum BankMark {
BM_BOC = 0; // 中国银行
BM_ICBC = 1; // 工商银行
}
新增银行接口
在对应的包下的 service.proto
里添加 rpc 方法。例如 签退
// 基础金融服务
service FundService {
// 签到
rpc SignIn (SignInRequest) returns (SignInResponse) {}
// 签退
rpc SignOut (SignOutRequest) returns (SignOutResponse) {}
}
在 message.proto
里添加消息定义
在 enum.proto
里添加枚举
代理新增银行对应内部实现
在代理应用 hzero-ebank-proxy
的包 org.hzero.ebank.proxy.infra.bank
下新增内部实现。例如工商银行
新增包 org.hzero.ebank.proxy.infra.bank.icbc
新增服务定义和实现 org.hzero.ebank.proxy.infra.bank.icbc.service
新增 DO org.hzero.ebank.proxy.infra.bank.icbc.dataobject
新增转换器,将银行 DO 转换为统一 grpc 消息对象 org.hzero.ebank.proxy.infra.bank.icbc.converter
由于 grpc 消息对象字段的值不能为空,需使用
ObjectUtils.defaultIfNull
来提供默认值银企直联服务在提取字段值的时候,需排除默认值干扰,
StringUtils.defaultIfBlank(content.getDraftId(), null)
,保证数据库表字段值为null
代理新增对应 grpc 方法实现
在代理应用 hzero-ebank-proxy
的包 org.hzero.ebank.proxy.app.service.impl
下所有的实现类的各个方法实现新增新银行的实现。
例如
@Override
public ListResponse listDraft(ListRequest request) {
ListResponse resp;
if (BankMark.BM_BOC.equals(request.getBankMark())) {
resp = BocDraftListRespDoConverter.doToDto(bocDraftService.list(BocDraftListReqDoConverter.dtoTodo(request,
bocDraftService.newB2eHeadDO(TransactionCode.BOC_DRAFT_LIST), BocDraftListQueryType.I1.getCode())),
request.getPage());
} else {
throw new BocException(ResponseCode.BANK_MARK_NOT_EXISTS);
}
return resp;
}
新增工商银行实现
@Override
public ListResponse listDraft(ListRequest request) {
ListResponse resp;
if (BankMark.BM_BOC.equals(request.getBankMark())) {
resp = BocDraftListRespDoConverter.doToDto(bocDraftService.list(BocDraftListReqDoConverter.dtoTodo(request,
bocDraftService.newB2eHeadDO(TransactionCode.BOC_DRAFT_LIST), BocDraftListQueryType.I1.getCode())),
request.getPage());
} else if (BankMark.BM_ICBC.equals(request.getBankMark())) {
resp = IcbcDraftListRespDoConverter.doToDto(icbcDraftService.list(IcbcDraftListReqDoConverter.dtoTodo(
request, icbcDraftService.newB2eHeadDO(TransactionCode.ICBC_DRAFT_LIST)),
request.getPage()));
} else {
throw new BocException(ResponseCode.BANK_MARK_NOT_EXISTS);
}
return resp;
}