一、运行汇付宝
1、数据库
hfb.sql
2、程序
hfb
3、数据库配置
application-dev.yml 中修改数据库配置
4、启动程序
端口:9999
二、参考文档
1、传入参数
参考《汇付宝商户账户技术文档》业务接口3.1参数说明
2、返回结果
参考《汇付宝商户账户技术文档》业务接口3.2返回/通知结果
3、数据接口
参考《汇付宝商户账户技术文档》业务接口3.3账户绑定
三、账户绑定
1、账户绑定流程
尚融宝应该在网站引导客户在“资金托管平台“开设账户。也就是说投资人和借款人必须在资金托管平台页面上自主开户,与尚融宝建立对应的账户体系。
以后所有的资金操作都会到“资金托管平台”进行,绑定账户流程如图:
2、相关数据库表
一、准备
1、引入HttpUtils
guigu-common中引入HttpUtils工具类
这个工具类使用了另一个常见的远程连接工具:java.net.HttpURLConnection
代码语言:javascript复制<!-- json解析 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
3、添加辅助类
service-core中添加FormHelper:构建表单工具
service-core中添加HfbConst:常量定义
service-core中添加RequestHelper:签名工具
4、定义UserBindVO
service-core中添加
代码语言:javascript复制@Data
@ApiModel(description = "账户绑定")
public class UserBindVO {
@ApiModelProperty(value = "身份证号")
private String idCard;
@ApiModelProperty(value = "用户姓名")
private String name;
@ApiModelProperty(value = "银行类型")
private String bankType;
@ApiModelProperty(value = "银行卡号")
private String bankNo;
@ApiModelProperty(value = "手机号")
private String mobile;
}
5、创建枚举
service-core中创建包enums,创建枚举UserBindEnum
代码语言:javascript复制@AllArgsConstructor
@Getter
public enum UserBindEnum {
NO_BIND(0, "未绑定"),
BIND_OK(1, "绑定成功"),
BIND_FAIL(-1, "绑定失败"),
;
private Integer status;
private String msg;
}
完整的枚举源代码:资料中 java代码service-coreenums目录
二、后端接口实现
1、要动态构建的表单模板
代码语言:javascript复制<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head> </head>
<body>
<form name="form" action="远程地址" method="post">
<!-- 参数 -->
<input type="text" name="mobile" value="13900000000" />
<input type="text" name="sign" value="123456" />
</form>
<script>
document.form.submit()
</script>
</body>
</html>
2、Controller
UserBindController
代码语言:javascript复制@Api(tags = "会员账号绑定")
@RestController
@RequestMapping("/api/core/userBind")
@Slf4j
public class UserBindController {
@Resource
private UserBindService userBindService;
@ApiOperation("账户绑定提交数据")
@PostMapping("/auth/bind")
public R bind(@RequestBody UserBindVO userBindVO, HttpServletRequest request) {
String token = request.getHeader("token");
Long userId = JwtUtils.getUserId(token);
String formStr = userBindService.commitBindUser(userBindVO, userId);
return R.ok().data("formStr", formStr);
}
}
3、Service
接口:UserBindService
代码语言:javascript复制/**
* 账户绑定提交到托管平台的数据
*/
String commitBindUser(UserBindVO userBindVO, Long userId);
相关常量:HfbConst
代码语言:javascript复制/**
* 用户绑定
*/
//用户绑定汇付宝平台url地址
public static final String USERBIND_URL = "http://localhost:9999/userBind/BindAgreeUserV2";
//用户绑定异步回调
public static final String USERBIND_NOTIFY_URL = "http://localhost/api/core/userBind/notify";
//用户绑定同步回调
public static final String USERBIND_RETURN_URL = "http://localhost:3000/user";
实现:UserBindServiceImpl
代码语言:javascript复制@Override
public String commitBindUser(UserBindVO userBindVO, Long userId) {
//查询身份证号码是否绑定
QueryWrapper<UserBind> userBindQueryWrapper = new QueryWrapper<>();
userBindQueryWrapper
.eq("id_card", userBindVO.getIdCard())
.ne("user_id", userId);
UserBind userBind = baseMapper.selectOne(userBindQueryWrapper);
//USER_BIND_IDCARD_EXIST_ERROR(-301, "身份证号码已绑定"),
Assert.isNull(userBind, ResponseEnum.USER_BIND_IDCARD_EXIST_ERROR);
//查询用户绑定信息
userBindQueryWrapper = new QueryWrapper<>();
userBindQueryWrapper.eq("user_id", userId);
userBind = baseMapper.selectOne(userBindQueryWrapper);
//判断是否有绑定记录
if(userBind == null) {
//如果未创建绑定记录,则创建一条记录
userBind = new UserBind();
BeanUtils.copyProperties(userBindVO, userBind);
userBind.setUserId(userId);
userBind.setStatus(UserBindEnum.NO_BIND.getStatus());
baseMapper.insert(userBind);
} else {
//曾经跳转到托管平台,但是未操作完成,此时将用户最新填写的数据同步到userBind对象
BeanUtils.copyProperties(userBindVO, userBind);
baseMapper.updateById(userBind);
}
Map<String, Object> paramMap = new HashMap<>();
paramMap.put("agentId", HfbConst.AGENT_ID);
paramMap.put("agentUserId", userId);
paramMap.put("idCard",userBindVO.getIdCard());
paramMap.put("personalName", userBindVO.getName());
paramMap.put("bankType", userBindVO.getBankType());
paramMap.put("bankNo", userBindVO.getBankNo());
paramMap.put("mobile", userBindVO.getMobile());
paramMap.put("returnUrl", HfbConst.USERBIND_RETURN_URL);
paramMap.put("notifyUrl", HfbConst.USERBIND_NOTIFY_URL);
paramMap.put("timestamp", RequestHelper.getTimestamp());
paramMap.put("sign", RequestHelper.getSign(paramMap));
//构建充值自动提交表单
String formStr = FormHelper.buildForm(HfbConst.USERBIND_URL, paramMap);
return formStr;
}