认清现实,放弃幻想,准备斗争
一、运行汇付宝
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
<!-- json解析 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> </dependency>
3、添加辅助类
service-core中添加FormHelper:构建表单工具
service-core中添加HfbConst:常量定义
service-core中添加RequestHelper:签名工具
4、定义UserBindVO
service-core中添加
@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
@AllArgsConstructor @Getter public enum UserBindEnum { NO_BIND(0, "未绑定"), BIND_OK(1, "绑定成功"), BIND_FAIL(-1, "绑定失败"), ; private Integer status; private String msg; }
完整的枚举源代码:资料中 java代码\service-core\enums目录
二、后端接口实现
1、要动态构建的表单模板
<!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
@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
/** * 账户绑定提交到托管平台的数据 */ String commitBindUser(UserBindVO userBindVO, Long userId);
相关常量:HfbConst
/** * 用户绑定 */ //用户绑定汇付宝平台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
@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; }