【金融项目】尚融宝项目(九)
18、账户绑定
18.1、需求介绍
18.1.1、运行汇付宝
1、数据库
hfb.sql
2、程序
hfb
3、数据库配置
application-dev.yml 中修改数据库配置
4、启动程序
端口:9999
18.1.2、参考文档
1、传入参数
参考《汇付宝商户账户技术文档》业务接口3.1参数说明
2、返回结果
参考《汇付宝商户账户技术文档》业务接口3.2返回/通知结果
3、数据接口
参考《汇付宝商户账户技术文档》业务接口3.3账户绑定
18.1.3、账户绑定
18.1.3.1、账户绑定流程
尚融宝应该在网站引导客户在“资金托管平台“开设账户。也就是说投资人和借款人必须在资金托管平台页面上自主开户,与尚融宝建立对应的账户体系。
以后所有的资金操作都会到“资金托管平台”进行,绑定账户流程如图:
18.1.3.2、相关数据库表
18.2、调用汇付宝实现账户创建
18.2.1、准备
18.2.1.1、引入HttpUtils
guigu-common中引入HttpUtils工具类
这个工具类使用了另一个常见的远程连接工具:java.net.HttpURLConnection
18.2.1.2、添加依赖
service-base中添加依赖
<!-- json解析 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId>
</dependency>
18.2.1.3、添加辅助类
service-core中添加FormHelper:构建表单工具
service-core中添加HfbConst:常量定义
service-core中添加RequestHelper:签名工具
18.2.1.4、定义UserBindVO
service-core中添加
package com.atguigu.srb.core.pojo.vo;@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;
}
18.2.1.5、创建枚举
service-core中创建包enums,创建枚举UserBindEnum
package com.atguigu.srb.core.enums;@AllArgsConstructor
@Getter
public enum UserBindEnum {NO_BIND(0, "未绑定"),BIND_OK(1, "绑定成功"),BIND_FAIL(-1, "绑定失败"),;private Integer status;private String msg;
}
完整的枚举源代码:资料中 java代码\service-core\enums目录
18.2.2、后端接口实现
18.2.2.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>
18.2.2.2、Controller
UserBindController
package com.atguigu.srb.core.controller.api;@Api(tags = "会员账号绑定")
@RestController
@RequestMapping("/api/core/userBind")
@Slf4j
public class UserBindController {@Resourceprivate 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);}
}
18.2.2.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;
}
18.2.3、前端整合
pages/user/bind.vue
commitBind() {this.$alert('<div style="size: 18px;color: red;">您即将前往汇付宝绑定账号</div>','前往汇付宝资金托管平台',{dangerouslyUseHTMLString: true,confirmButtonText: '立即前往',callback: (action) => {if (action === 'confirm') {this.$axios.$post('/api/core/userBind/auth/bind', this.userBind).then((response) => {document.write(response.data.formStr)})}},})
},
18.2.4、测试
1、登录
使用借款人账号登录
2、测试
访问 http://127.0.0.1:3000/user/bind
3、结果
尚融宝数据库中创建了user_bind记录
汇付宝数据库中创建了user_bind 和 user_account两条数据记录
18.3、回调接口实现账户绑定
18.3.1、绑定步骤总结
step1:用户在个人中心点击 “立即开通” (http://localhost:3000/user/bind)
step2:尚融宝展示账户绑定页面
step3:用户填写基本信息(注意:身份证必须是尚未开户),点击“开户”按钮
step4:尚融宝后台创建用户绑定信息(新建user_bind记录)
step5:跳转到汇付宝页面(资金托管接口调用)
step6:汇付宝验证用户身份、用户设置交易密码
step7:汇付宝创建绑定账号(新建user_bind和user_account记录)
step8:异步回调:
尚融宝user_bind表更新bind_code字段、status字段
尚融宝user_info表更新 bind_code字段、name字段、idCard字段、bind_status字段
step9:用户点击“返回平台”,返回尚融宝
18.3.2、尚融宝回调接口
18.3.2.1、controller
UserBindController中创建回调方法
@ApiOperation("账户绑定异步回调")
@PostMapping("/notify")
public String notify(HttpServletRequest request) {Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());log.info("用户账号绑定异步回调:" + JSON.toJSONString(paramMap));//校验签名if(!RequestHelper.isSignEquals(paramMap)) {log.error("用户账号绑定异步回调签名错误:" + JSON.toJSONString(paramMap));return "fail";}//修改绑定状态userBindService.notify(paramMap);return "success";
}
18.3.2.2、service
接口:UserBindService
void notify(Map<String, Object> paramMap);
实现:UserBindServiceImpl
@Resource
private UserInfoMapper userInfoMapper;@Override
@Transactional(rollbackFor = Exception.class)
public void notify(Map<String, Object> paramMap) {// 校验是否绑定成功String resultCode = (String) paramMap.get("resultCode");if (!"0001".equals(resultCode)) {throw new BusinessException("用户绑定失败");}String bindCode = (String)paramMap.get("bindCode");//会员idString agentUserId = (String)paramMap.get("agentUserId");//根据user_id查询user_bind记录QueryWrapper<UserBind> userBindQueryWrapper = new QueryWrapper<>();userBindQueryWrapper.eq("user_id", agentUserId);//更新用户绑定表UserBind userBind = baseMapper.selectOne(userBindQueryWrapper);userBind.setBindCode(bindCode);userBind.setStatus(UserBindEnum.BIND_OK.getStatus());baseMapper.updateById(userBind);//更新用户表UserInfo userInfo = userInfoMapper.selectById(agentUserId);userInfo.setBindCode(bindCode);userInfo.setName(userBind.getName());userInfo.setIdCard(userBind.getIdCard());userInfo.setBindStatus(UserBindEnum.BIND_OK.getStatus());userInfoMapper.updateById(userInfo);
}
本文章参考B站 尚硅谷《尚融宝》Java微服务分布式金融项目,仅供个人学习使用,部分内容为本人自己见解,与尚硅谷无关。
【金融项目】尚融宝项目(九)相关推荐
- 【金融项目】尚融宝项目(一)
1.尚融宝项目简介 1.1.前言 尚融宝项目是一个网络借贷信息中介服务平台,为个人投资者.个人融资用户和小微企业提供专业的线上信贷及出借撮合服务. 行业案例:人人贷 https://www.renre ...
- 【金融项目】尚融宝项目(十四)
27.放款 27.1.需求介绍 27.1.1.平台放款 1.需求描述 标的募资时间到,平台会操作放款或撤标,如果达到放款条件则操作放款 说明:撤标过程与放款过程一致,处理业务相对简单,只是将出借金额返 ...
- 【金融项目】尚融宝项目(十六)
31.RabbitMQ 31.1.整合Rabbit MQ发送短信 31.1.1.MQ服务器设置 1.访问MQ控制台 http://192.168.100.103:15672 2.创建用户 创建用户 s ...
- 【金融项目】尚融宝项目(十五)
29.提现和还款 29.1.提现 29.1.1.需求 放款成功后,借款人可以申请提现. 参考<汇付宝商户账户技术文档>3.15用户申请提现 29.1.2.前端整合 pages/user/w ...
- 【金融项目】尚融宝项目(十)
19.申请借款额度 19.1.需求介绍 19.1.1.借款人申请额度 1.需求描述 平台管理员根据借款人个人信息设置积分,通过积分规则借款人可以获取额度. 2.相关数据库表 19.1.2.具体步骤 s ...
- 【金融项目】尚融宝项目(四)
6.Alibaba EasyExcel 6.1.EasyExcel简介 6.1.1.Excel导入导出的应用场景 6.1.1.1.数据导入 减轻录入工作量 6.1.1.2.数据导出 统计信息归档 6. ...
- 【金融项目】尚融宝项目(六)
11.访问令牌 11.1.单点登录 11.1.1.用户身份认证 11.1.1.1.单一服务器模式 一般过程如下: 用户向服务器发送用户名和密码. 验证服务器后,相关数据(如用户名,用户角色等)将保存在 ...
- 【金融项目】尚融宝项目(八)
16.服务调用 16.1.注册中心和服务发现 16.1.1.运行Nacos注册中心 16.1.1.1.Nacos下载和安装 下载地址:https://github.com/alibaba/nacos/ ...
- 【金融项目】尚融宝项目(十一)
21.借款申请 21.1.需求介绍 21.1.1.借款人申请借款 1.需求描述 2.相关数据库表 21.1.2.具体步骤 step1:借款人点击"我要借款" step2:展示借款信 ...
最新文章
- NumPy库入门教程:基础知识总结
- Codeforces Round 263(Div. 2)
- 值引用和引用问题分析
- 保存您的lambda,以备不时之需-保存到文件
- poj2942(双联通分量,交叉染色判二分图)
- Unity3D中关于场景销毁时事件调用顺序的一点记录
- 如何判断lib是/md or /mt编译的
- System.load 和 System.loadLibrary详解
- 使用流程图描述程序的功能与流程
- 计算机网络 DNS解析命令汇总
- Kmeans参数n_clusters_labels_centers_
- 深度学习-lecture2(图像分类)李飞飞计算机视觉
- 关于sungard和博彦的笔试
- Linux kali系统使用fcrackzip/rarcrack破解zip/rar(或者zip 7z)类型的加密压缩文件
- PHP文件怎么改tne,修改 · thinkphp6文档 · 看云
- 【ByteCTF 2022】Crypto Writeup
- 基于Python实现的全球新冠病毒数据分析
- 十大面试问题解惑,秒杀一切HR、技术面试
- 订单数据表SQL语句练习
- 数学建模(7)回归分析
热门文章
- 系统架构设计师论文历年考题(2015-2017)考前冲刺来一波真题
- 计算机终桌面操作系统,支持国产电脑操作系统,光威、中兴新支点桌面系统首次触电...
- 使用swift语言进行IOS应用开发
- 关于京东商城在宜宾开通货到付款的随想
- 个人开公司的流程及费用
- [转载]一篇经典的求职经历博客,值得深入研究和学习
- SharePoint专家新闻轮转器WebPart----亲测力推之Web部件
- 音频基础之麦克风、功放、扬声器
- 如何快速将显示未签收的单号物流归类为签收件
- 手机社会化分享到qq好友、qq空间、微信、微信朋友圈、微博等(区分浏览器)