微服务项目:尚融宝(36)(核心业务流程:用户绑定(1))

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
云原生网关 MSE Higress,422元/月
简介: 尚融宝应该在网站引导客户在“资金托管平台“开设账户。也就是说投资人和借款人必须在资金托管平台页面上自主开户,与尚融宝建立对应的账户体系。

认清现实,放弃幻想,准备斗争


一、运行汇付宝



1、数据库


hfb.sql


2、程序


hfb


3、数据库配置


application-dev.yml 中修改数据库配置


4、启动程序


端口:9999


二、参考文档



1、传入参数


参考《汇付宝商户账户技术文档》业务接口3.1参数说明


2、返回结果


参考《汇付宝商户账户技术文档》业务接口3.2返回/通知结果


3、数据接口


参考《汇付宝商户账户技术文档》业务接口3.3账户绑定


三、账户绑定



1、账户绑定流程


尚融宝应该在网站引导客户在“资金托管平台“开设账户。也就是说投资人和借款人必须在资金托管平台页面上自主开户,与尚融宝建立对应的账户体系。


以后所有的资金操作都会到“资金托管平台”进行,绑定账户流程如图:

 

65922cddfbe447989a61694b58c3c862.png


2、相关数据库表


73f9031fab0149c3bb1b80c6669868ef.png


一、准备



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:签名工具


5e4e10d280584dffbe69cff2ea2a0ffb.png


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;
}


相关文章
|
16天前
|
消息中间件 监控 开发工具
微服务(三)-实现自动刷新配置(不重启项目情况下)
微服务(三)-实现自动刷新配置(不重启项目情况下)
|
5月前
|
微服务
jeecg微服务项目调用接口报错Token验证失效的解决方法
jeecg微服务项目调用接口报错Token验证失效的解决方法
|
3月前
|
负载均衡 Java 开发者
如何在Spring Boot项目中实现微服务架构?
如何在Spring Boot项目中实现微服务架构?
|
3月前
|
消息中间件 负载均衡 Java
最容易学会的springboot gralde spring cloud 多模块微服务项目
最容易学会的springboot gralde spring cloud 多模块微服务项目
|
5月前
|
监控 数据可视化 安全
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
环境实时数据、动态监测报警,实时监控施工环境状态,有针对性地预防施工过程中的环境污染问题,打造文明生态施工,创造绿色的生态环境。
57 0
智慧工地SaaS可视化平台源码,PC端+APP端,支持二开,项目使用,微服务+Java++vue+mysql
|
5月前
|
Java Maven 微服务
微服务项目-将普通文件夹设为模块与添加services窗口
微服务项目-将普通文件夹设为模块与添加services窗口
29 0
|
5月前
|
Cloud Native Dubbo Java
如何确定微服务项目中Spring Boot、Spring Cloud、Spring Cloud Alibaba三者之间的版本
如何确定微服务项目中Spring Boot、Spring Cloud、Spring Cloud Alibaba三者之间的版本
120 0
|
16天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
16天前
|
负载均衡 Java 应用服务中间件
微服务分布式系统架构之zookeeper与dubbor-1
微服务分布式系统架构之zookeeper与dubbor-1
|
2月前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。