目录

一、提现

(一)需求

(二)前端

(三)后端

1、提现接口

2、回调接口

二、还款

(一)需求

(二)前端

(三)后端

1、还款接口

2、回调接口


一、提现

(一)需求

放款成功后,借款人可以申请提现。

参考《汇付宝商户账户技术文档》3.15用户申请提现

(二)前端

pages/user/withdraw.vue

<script>
export default {data() {return {fetchAmt: 0,}},methods: {commitWithdraw() {this.$alert('<div style="size: 18px;color: red;">您即将前往汇付宝提现</div>','前往汇付宝资金托管平台',{dangerouslyUseHTMLString: true,confirmButtonText: '立即前往',callback: (action) => {if (action === 'confirm') {this.$axios.$post('/api/core/userAccount/auth/commitWithdraw/' + this.fetchAmt).then((response) => {document.write(response.data.formStr)})}},})},},
}
</script>

(三)后端

1、提现接口

UserAccountController

@ApiOperation("用户提现")
@PostMapping("/auth/commitWithdraw/{fetchAmt}")
public R commitWithdraw(@ApiParam(value = "金额", required = true)@PathVariable BigDecimal fetchAmt, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);String formStr = userAccountService.commitWithdraw(fetchAmt, userId);return R.ok().data("formStr", formStr);
}

接口:UserAccountService

String commitWithdraw(BigDecimal fetchAmt, Long userId);

实现:UserAccountServiceImpl

@Resource
private UserBindService userBindService;@Resource
private UserAccountService userAccountService;@Override
public String commitWithdraw(BigDecimal fetchAmt, Long userId) {//账户可用余额充足:当前用户的余额 >= 当前用户的提现金额BigDecimal amount = userAccountService.getAccount(userId);//获取当前用户的账户余额Assert.isTrue(amount.doubleValue() >= fetchAmt.doubleValue(),ResponseEnum.NOT_SUFFICIENT_FUNDS_ERROR);String bindCode = userBindService.getBindCodeByUserId(userId);Map<String, Object> paramMap = new HashMap<>();paramMap.put("agentId", HfbConst.AGENT_ID);paramMap.put("agentBillNo", LendNoUtils.getWithdrawNo());paramMap.put("bindCode", bindCode);paramMap.put("fetchAmt", fetchAmt);paramMap.put("feeAmt", new BigDecimal(0));paramMap.put("notifyUrl", HfbConst.WITHDRAW_NOTIFY_URL);paramMap.put("returnUrl", HfbConst.WITHDRAW_RETURN_URL);paramMap.put("timestamp", RequestHelper.getTimestamp());String sign = RequestHelper.getSign(paramMap);paramMap.put("sign", sign);//构建自动提交表单String formStr = FormHelper.buildForm(HfbConst.WITHDRAW_URL, paramMap);return formStr;
}

2、回调接口

UserAccountController

@ApiOperation("用户提现异步回调")
@PostMapping("/notifyWithdraw")
public String notifyWithdraw(HttpServletRequest request) {Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());log.info("提现异步回调:" + JSON.toJSONString(paramMap));//校验签名if(RequestHelper.isSignEquals(paramMap)) {//提现成功交易if("0001".equals(paramMap.get("resultCode"))) {userAccountService.notifyWithdraw(paramMap);} else {log.info("提现异步回调充值失败:" + JSON.toJSONString(paramMap));return "fail";}} else {log.info("提现异步回调签名错误:" + JSON.toJSONString(paramMap));return "fail";}return "success";
}

接口:UserAccountService

void notifyWithdraw(Map<String, Object> paramMap);

实现:UserAccountServiceImpl

@Transactional(rollbackFor = Exception.class)
@Override
public void notifyWithdraw(Map<String, Object> paramMap) {log.info("提现成功");String agentBillNo = (String)paramMap.get("agentBillNo");boolean result = transFlowService.isSaveTransFlow(agentBillNo);if(result){log.warn("幂等性返回");return;}String bindCode = (String)paramMap.get("bindCode");String fetchAmt = (String)paramMap.get("fetchAmt");//根据用户账户修改账户金额baseMapper.updateAccount(bindCode, new BigDecimal("-" + fetchAmt), new BigDecimal(0));//增加交易流水TransFlowBO transFlowBO = new TransFlowBO(agentBillNo,bindCode,new BigDecimal(fetchAmt),TransTypeEnum.WITHDRAW,"提现");transFlowService.saveTransFlow(transFlowBO);
}

二、还款

(一)需求

放款成功后,会生成借款人的还款计划与出借人的回款计划,然后借款人按照还款计划日期操作还款即可。

参考《汇付宝商户账户技术文档》3.14还款扣款,处理业务即可

(二)前端

还款按钮pages/lend/_id.vue

<td><a href="javascript:" @click="commitReturn(lendReturn.id)">{{ lendReturn.status === 0 ? '还款' : '' }}</a>
</td>

脚本pages/lend/_id.vue

commitReturn(lendReturnId) {this.$alert('<div style="size: 18px;color: red;">您即将前往汇付宝确认还款</div>','前往汇付宝资金托管平台',{dangerouslyUseHTMLString: true,confirmButtonText: '立即前往',callback: (action) => {if (action === 'confirm') {this.$axios.$post('/api/core/lendReturn/auth/commitReturn/' + lendReturnId).then((response) => {document.write(response.data.formStr)})}},})
}

(三)后端

1、还款接口

LendReturnController

@ApiOperation("用户还款")
@PostMapping("/auth/commitReturn/{lendReturnId}")
public R commitReturn(@ApiParam(value = "还款计划id", required = true)@PathVariable Long lendReturnId, HttpServletRequest request) {String token = request.getHeader("token");Long userId = JwtUtils.getUserId(token);String formStr = lendReturnService.commitReturn(lendReturnId, userId);return R.ok().data("formStr", formStr);
}

接口:LendReturnService

String commitReturn(Long lendReturnId, Long userId);

实现:LendReturnServiceImpl

@Resource
private UserAccountService userAccountService;@Resource
private LendMapper lendMapper;@Resource
private UserBindService userBindService;@Resource
private LendItemReturnService lendItemReturnService;@Transactional(rollbackFor = Exception.class)
@Override
public String commitReturn(Long lendReturnId, Long userId) {//获取还款记录LendReturn lendReturn = baseMapper.selectById(lendReturnId);//判断账号余额是否充足BigDecimal amount = userAccountService.getAccount(userId);Assert.isTrue(amount.doubleValue() >= lendReturn.getTotal().doubleValue(),ResponseEnum.NOT_SUFFICIENT_FUNDS_ERROR);//获取借款人codeString bindCode = userBindService.getBindCodeByUserId(userId);//获取lendLong lendId = lendReturn.getLendId();Lend lend = lendMapper.selectById(lendId);Map<String, Object> paramMap = new HashMap<>();paramMap.put("agentId", HfbConst.AGENT_ID);//商户商品名称paramMap.put("agentGoodsName", lend.getTitle());//批次号paramMap.put("agentBatchNo",lendReturn.getReturnNo());//还款人绑定协议号paramMap.put("fromBindCode", bindCode);//还款总额paramMap.put("totalAmt", lendReturn.getTotal());paramMap.put("note", "");//还款明细List<Map<String, Object>> lendItemReturnDetailList = lendItemReturnService.addReturnDetail(lendReturnId);paramMap.put("data", JSONObject.toJSONString(lendItemReturnDetailList));paramMap.put("voteFeeAmt", new BigDecimal(0));paramMap.put("notifyUrl", HfbConst.BORROW_RETURN_NOTIFY_URL);paramMap.put("returnUrl", HfbConst.BORROW_RETURN_RETURN_URL);paramMap.put("timestamp", RequestHelper.getTimestamp());String sign = RequestHelper.getSign(paramMap);paramMap.put("sign", sign);//构建自动提交表单String formStr = FormHelper.buildForm(HfbConst.BORROW_RETURN_URL, paramMap);return formStr;
}

还款明细service

根据还款id获取回款列表

LendReturnService接口:

List<Map<String, Object>> addReturnDetail(Long lendReturnId);

LendReturnServiceImpl实现:

@Resource
private UserBindService userBindService;@Resource
private LendItemMapper lendItemMapper;@Resource
private LendMapper lendMapper;@Resource
private LendReturnMapper lendReturnMapper;/**
* 添加还款明细
* @param lendReturnId
*/
@Override
public List<Map<String, Object>> addReturnDetail(Long lendReturnId) {//获取还款记录LendReturn lendReturn = lendReturnMapper.selectById(lendReturnId);//获取标的信息Lend lend = lendMapper.selectById(lendReturn.getLendId());//根据还款id获取回款列表List<LendItemReturn> lendItemReturnList = this.selectLendItemReturnList(lendReturnId);List<Map<String, Object>> lendItemReturnDetailList = new ArrayList<>();for(LendItemReturn lendItemReturn : lendItemReturnList) {LendItem lendItem = lendItemMapper.selectById(lendItemReturn.getLendItemId());String bindCode = userBindService.getBindCodeByUserId(lendItem.getInvestUserId());Map<String, Object> map = new HashMap<>();//项目编号map.put("agentProjectCode", lend.getLendNo());//出借编号map.put("voteBillNo", lendItem.getLendItemNo());//收款人(出借人)map.put("toBindCode", bindCode);//还款金额map.put("transitAmt", lendItemReturn.getTotal());//还款本金map.put("baseAmt", lendItemReturn.getPrincipal());//还款利息map.put("benifitAmt", lendItemReturn.getInterest());//商户手续费map.put("feeAmt", new BigDecimal("0"));lendItemReturnDetailList.add(map);}return lendItemReturnDetailList;
}

根据还款计划id获取对应的回款计划列表

接口:

List<LendItemReturn> selectLendItemReturnList(Long lendReturnId);

实现:

@Override
public List<LendItemReturn> selectLendItemReturnList(Long lendReturnId) {QueryWrapper<LendItemReturn> queryWrapper = new QueryWrapper<>();queryWrapper.eq("lend_return_id", lendReturnId);List<LendItemReturn> lendItemReturnList = baseMapper.selectList(queryWrapper);return lendItemReturnList;
}

2、回调接口

LendReturnController

@ApiOperation("还款异步回调")
@PostMapping("/notifyUrl")
public String notifyUrl(HttpServletRequest request) {Map<String, Object> paramMap = RequestHelper.switchMap(request.getParameterMap());log.info("还款异步回调:" + JSON.toJSONString(paramMap));//校验签名if(RequestHelper.isSignEquals(paramMap)) {if("0001".equals(paramMap.get("resultCode"))) {lendReturnService.notify(paramMap);} else {log.info("还款异步回调失败:" + JSON.toJSONString(paramMap));return "fail";}} else {log.info("还款异步回调签名错误:" + JSON.toJSONString(paramMap));return "fail";}return "success";
}

接口:LendReturnService

void notify(Map<String, Object> paramMap);

实现:LendReturnServiceImpl

@Resource
private TransFlowService transFlowService;@Resource
private UserAccountMapper userAccountMapper;@Resource
private LendItemReturnMapper lendItemReturnMapper;@Resource
private LendItemMapper lendItemMapper;@Transactional(rollbackFor = Exception.class)
@Override
public void notify(Map<String, Object> paramMap) {log.info("还款成功");//还款编号String agentBatchNo = (String)paramMap.get("agentBatchNo");boolean result = transFlowService.isSaveTransFlow(agentBatchNo);if(result){log.warn("幂等性返回");return;}//获取还款数据String voteFeeAmt = (String)paramMap.get("voteFeeAmt");QueryWrapper lendReturnQueryWrapper = new QueryWrapper<LendReturn>();lendReturnQueryWrapper.eq("return_no", agentBatchNo);LendReturn lendReturn = baseMapper.selectOne(lendReturnQueryWrapper);;//更新还款状态lendReturn.setStatus(1);lendReturn.setFee(new BigDecimal(voteFeeAmt));lendReturn.setRealReturnTime(LocalDateTime.now());baseMapper.updateById(lendReturn);//更新标的信息Lend lend = lendMapper.selectById(lendReturn.getLendId());//最后一次还款更新标的状态if(lendReturn.getLast()) {lend.setStatus(LendStatusEnum.PAY_OK.getStatus());lendMapper.updateById(lend);}//借款账号转出金额BigDecimal totalAmt = new BigDecimal((String)paramMap.get("totalAmt"));//还款金额String bindCode = userBindService.getBindCodeByUserId(lend.getUserId());userAccountMapper.updateAccount(bindCode, totalAmt.negate(), new BigDecimal(0));//借款人交易流水TransFlowBO transFlowBO = new TransFlowBO(agentBatchNo,bindCode,totalAmt,TransTypeEnum.RETURN_DOWN,"借款人还款扣减,项目编号:" + lend.getLendNo() + ",项目名称:" + lend.getTitle());transFlowService.saveTransFlow(transFlowBO);//获取回款明细List<LendItemReturn> lendItemReturnList = lendItemReturnService.selectLendItemReturnList(lendReturn.getId());lendItemReturnList.forEach(item -> {//更新回款状态item.setStatus(1);item.setRealReturnTime(LocalDateTime.now());lendItemReturnMapper.updateById(item);//更新出借信息LendItem lendItem = lendItemMapper.selectById(item.getLendItemId());lendItem.setRealAmount(item.getInterest());lendItemMapper.updateById(lendItem);//投资账号转入金额String investBindCode = userBindService.getBindCodeByUserId(item.getInvestUserId());userAccountMapper.updateAccount(investBindCode, item.getTotal(), new BigDecimal(0));//投资账号交易流水TransFlowBO investTransFlowBO = new TransFlowBO(LendNoUtils.getReturnItemNo(),investBindCode,item.getTotal(),TransTypeEnum.INVEST_BACK,"还款到账,项目编号:" + lend.getLendNo() + ",项目名称:" + lend.getTitle());transFlowService.saveTransFlow(investTransFlowBO);});
}

尚融宝29-提现和还款相关推荐

  1. 微服务项目:尚融宝(59)(核心业务流程:提现和还款(2))

    认清现实,放弃幻想,准备斗争 需求 放款成功后,会生成借款人的还款计划与出借人的回款计划,然后借款人按照还款计划日期操作还款即可. 参考<汇付宝商户账户技术文档>3.14还款扣款,处理业务 ...

  2. 29. 尚融宝借款申请

    需求描述 整体流程图 相关数据库表 获取借款额度 需求 step1:借款人在"借款人信息认证"界面点击"我要借款" step2:展示借款信息填写页面 后端 co ...

  3. 【金融项目】尚融宝项目(十五)

    29.提现和还款 29.1.提现 29.1.1.需求 放款成功后,借款人可以申请提现. 参考<汇付宝商户账户技术文档>3.15用户申请提现 29.1.2.前端整合 pages/user/w ...

  4. 【金融项目】尚融宝项目(十三)

    25.充值 25.1.需求介绍 25.1.1.投资人充值 **1.需求描述 ** 标的产生后,平台展示标的,投资人就可以在平台投资标的,获取收益:投资人投资标的必须满足以下条件: 充值过程与绑定过程一 ...

  5. 【金融项目】尚融宝项目(一)

    1.尚融宝项目简介 1.1.前言 尚融宝项目是一个网络借贷信息中介服务平台,为个人投资者.个人融资用户和小微企业提供专业的线上信贷及出借撮合服务. 行业案例:人人贷 https://www.renre ...

  6. 【金融项目】尚融宝项目(十四)

    27.放款 27.1.需求介绍 27.1.1.平台放款 1.需求描述 标的募资时间到,平台会操作放款或撤标,如果达到放款条件则操作放款 说明:撤标过程与放款过程一致,处理业务相对简单,只是将出借金额返 ...

  7. 【金融项目】尚融宝项目(十)

    19.申请借款额度 19.1.需求介绍 19.1.1.借款人申请额度 1.需求描述 平台管理员根据借款人个人信息设置积分,通过积分规则借款人可以获取额度. 2.相关数据库表 19.1.2.具体步骤 s ...

  8. 【金融项目】尚融宝项目(十一)

    21.借款申请 21.1.需求介绍 21.1.1.借款人申请借款 1.需求描述 2.相关数据库表 21.1.2.具体步骤 step1:借款人点击"我要借款" step2:展示借款信 ...

  9. 金融项目学习——尚融宝

    尚融宝 欢迎关注公众号 一.项目简介 尚融宝是一个网络借贷信息中介服务平台,为个人投资者.个人融资用户和小微企业提供专业的线上信贷及出借撮合服务. 行业案例:人人贷 https://www.renre ...

最新文章

  1. 对象特性---->深拷贝与浅拷贝
  2. 南开大学教授:科研开源的行动倡议!
  3. ArXiv 2020 | 抖音“变身漫画”滤镜背后的技术,难道来自这篇论文?
  4. python导入自己的模块_python导入自定义模块
  5. 安卓在线按钮设计网站
  6. false shell 判断_六、Shell流程控制-if判断语句
  7. oneproxy mysql_在OneProxy的基础上实行MySQL读写分离与负载均衡
  8. if mybatis or test_真赞!IDEA中这么玩MyBatis,让编码速度飞起
  9. python 发送email邮件带附件
  10. bzoj1047-理想的正方形(二维单调队列)
  11. 线性代数 : 矩阵乘法和矩阵的逆
  12. python批量将word转换成pdf_python批量实现Word文件转换为PDF文件
  13. 破旧手机改造系列:最牛逼的行车记录仪
  14. C Library User 手册(25)
  15. 编译警告:backslash and newline separated by space
  16. 3.3Packet Tracer - 实施基本连接
  17. Android仿芝麻信用分雷达分布图
  18. 编辑距离及编辑距离算法 | Levenshtein距离 |DP
  19. Cesium通过primitives绘制大数据量扇形图
  20. Ps简单几步把人物图片转素描画

热门文章

  1. 实时语音转文字app简易demo(这里使用了阿里的接口,可以替换成科大讯飞)
  2. HTML+CSS+JAVASCRIPT 高仿低配网页版网易云音乐播放器 1
  3. Mac 设置 Git 代理
  4. sony android mp3播放器,高音质与流媒体兼具,索尼 NW-ZX500 安卓音乐播放器评测
  5. 安利几款软件给需要的你
  6. 实验三 使用CSS3
  7. 汽车驱动桥毕业设计【毕业设计(论文) +7张CAD图纸】
  8. 京沪高铁上火车位置的实时监视模拟网站的开发
  9. 如何在企业微信中打通私域闭环?
  10. Verilog实现减法器