0
点赞
收藏
分享

微信扫一扫

聚合支付项目-18

2.4 商户注册

2.4.1 系统设计

商户拿到获取的验证码即可提交注册信息,完成商户注册,本节完成商户注册功能。

商户注册信息向三个地方写入数据 ,如下图:

当前阶段暂时只向商户表写入数据 ,待接入SaaS系统时向员工表、SaaS系统写入。

2.4.2 商户服务-注册商户(接口②)

商户服务提供商户注册的服务接口供商户平台应用使用,本节实现商户服务注册商户接口。

2.4.2.1 接口定义

在商户服务定义商户注册接口

1、接口描述如下:

1)校验商户注册的基础数据:账号、密码、手机号

2)添加商户

注意:本节暂不实现对接SaaS系统,仅实现新增一个商户,并将手机号填写到商户表。

3)返回注册结果给商户平台应用

2、定义商户注册DTO

此DTO作为商户注册、资质申请的公共类。

在 huiminpay-merchant-api 工程的 com.huiminpay.merchant.api.dto 包下添加 MerchantDTO:

package com.yh.merchant.api.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
@ApiModel(value="MerchantDTO", description="")
public class MerchantDTO implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键")
    private Long id;

    @ApiModelProperty(value = "商户名称")
    private String merchantName;

    @ApiModelProperty(value = "企业编号")
    private String merchantNo;

    @ApiModelProperty(value = "企业地址")
    private String merchantAddress;

    @ApiModelProperty(value = "商户类型")
    private String merchantType;

    @ApiModelProperty(value = "营业执照(企业证明)")
    private String businessLicensesImg;

    @ApiModelProperty(value = "法人身份证正面照片")
    private String idCardFrontImg;

    @ApiModelProperty(value = "法人身份证反面照片")
    private String idCardAfterImg;

    @ApiModelProperty(value = "联系人姓名")
    private String username;

    @ApiModelProperty(value = "联系人手机号(关联统一账号)")
    private String mobile;

    @ApiModelProperty(value = "联系人地址")
    private String contactsAddress;

    @ApiModelProperty(value = "审核状态 0-未申请,1-已申请待审核,2-审核通过,3-审核拒绝")
    private String auditStatus;

    @ApiModelProperty(value = "租户ID,关联统一用户")
    private Long tenantId;
}

DTO可以使用 “代码生成工具” 自动生成:

修改代码生成工具中的 MyBatisPlusGenerator 类:

private static final Boolean IS_DTO = true; 
      
if (IS_DTO) {
    globalConfig.setSwagger2(true); 
    globalConfig.setEntityName("%sDTO"); 
    packageConfig.setEntity("dto"); 
}

当生成dto时将IS_DTO设置为true,运行生成工具即可。

3、接口定义如下:

在MerchantService接口类中定义如下接口:

/**
 * 商户注册
 * @return
 */
MerchantDTO createMerchant(MerchantDTO merchantDTO);

2.4.2.2 接口实现

实现MerchantServiceImpl中的createMerchant方法:

@Override
public MerchantDTO createMerchant(MerchantDTO merchantDTO) {
    Merchant merchant = new Merchant();
    //设置审核状态0‐未申请,1‐已申请待审核,2‐审核通过,3‐审核拒绝
    merchant.setAuditStatus("0");
    //设置手机号
    merchant.setMobile(merchantDTO.getMobile());
    //...
    //保存商户
    merchantMapper.insert(merchant);
    //将新增商户id返回
    merchantDTO.setId(merchant.getId());
    return merchantDTO;
}

2.4.3 商户平台应用-注册商户(接口③)

商户平台应用调用商户服务提供的商户注册接口即可完成商户注册业务,本节实现商户平台应用注册商户接口的开发。

2.4.3.1 接口定义

1、接口描述如下:

1)接收商户填写的注册数据

2)商户平台应用校验手机验证码

3)请求商户服务进行商户注册

4)返回注册结果给前端

2、定义商户注册VO:

在 com.huiminpay.merchant.vo 包下添加VO类型,VO类型负责接收前端请求的数据。

下图是商户注册的用户界面,根据用户界面中的元素定义VO类的属性:

package com.huiminpay.merchant.vo;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@ApiModel(value = "MerchantRegisterVo", description = "商户注册信息")
@Data
public class MerchantRegisterVo implements Serializable {
    @ApiModelProperty("商户手机号")
    private String mobile;
    @ApiModelProperty("商户用户名")
    private String username;
    @ApiModelProperty("商户密码")
    private String password;
    @ApiModelProperty("验证码的key")
    private String verifiykey;
    @ApiModelProperty("验证码")
    private String verifiyCode;
}

3、接口定义如下:

在MerchantController类中定义如下接口:

@ApiOperation("注册商户")
@ApiImplicitParam(name = "merchantRegister", value = "注册信息", required = true, dataType =
        "MerchantRegisterVo", paramType = "body")
@PostMapping("/merchants/register")
public MerchantRegisterVo registerMerchant(@RequestBody MerchantRegisterVo merchantRegister) {
    //校验验证码
    //...
    //注册商户
    //...
    return merchantRegister;
}

2.4.3.2 校验验证码实现

  1. 在SmsService中定义校验验证码的service接口

/**
 * 校验验证码,抛出异常则校验无效
 * @param verifiyKey  验证码key
 * @param verifiyCode 验证码
 */
void checkVerifiyCode(String verifiyKey, String verifiyCode);

  1. 在SmsServiceImpl中定义校验验证码的service 实现方法

@Override
public void checkVerifiyCode(String verifiyKey, String verifiyCode) {
    String url = smsUrl + "/verify?name=sms&verificationCode=" + verifiyCode + "&verificationKey=" + verifiyKey;
    Map responseMap = null;
    try {
        //请求校验验证码
        ResponseEntity<Map> exchange = restTemplate
            .exchange(url, HttpMethod.POST, HttpEntity.EMPTY, Map.class);
        responseMap = exchange.getBody();
        log.info("校验验证码,响应内容:{}", JSON.toJSONString(responseMap));
    } catch (RestClientException e) {
        e.printStackTrace();
        log.info(e.getMessage(), e);
        throw new RuntimeException("验证码错误");
    }
    if (responseMap == null || responseMap.get("result") == null || !(Boolean)responseMap.get("result")) {
        throw new RuntimeException("验证码错误");
    }
}

  1. 在controller中调用校验验证码

@ApiOperation("注册商户")
@ApiImplicitParam(name = "merchantRegister", value = "注册信息", required = true, dataType =
        "MerchantRegisterVo", paramType = "body")
@PostMapping("/merchants/register")
public MerchantRegisterVo registerMerchant(@RequestBody MerchantRegisterVo merchantRegister) {
    //校验验证码
    smsService.checkVerifiyCode(merchantRegister.getVerifiykey(),
            merchantRegister.getVerifiyCode());
    //注册商户
    return merchantRegister;
}

2.4.3.3 注册商户实现

在Controller中调用Dubbo接口实现注册商户

@ApiOperation("注册商户")
@ApiImplicitParam(name = "merchantRegister", value = "注册信息", required = true, dataType =
        "MerchantRegisterVo", paramType = "body")
@PostMapping("/merchants/register")
public MerchantRegisterVo registerMerchant(@RequestBody MerchantRegisterVo merchantRegister) {
    //校验验证码
    smsService.checkVerifiyCode(merchantRegister.getVerifiykey(),
            merchantRegister.getVerifiyCode());
    //注册商户
    MerchantDTO merchantDTO = new MerchantDTO();
    merchantDTO.setUsername(merchantRegister.getUsername());
    merchantDTO.setMobile(merchantRegister.getMobile());
    merchantDTO.setPassword(merchantRegister.getPassword());
    merchantService.createMerchant(merchantDTO);
    return merchantRegister;
}

2.4.3.4 接口测试

下面使用Postman对注册商户整体流程进行测试:

  1. 获取短信验证码过程略。
  2. 商户注册:http://localhost:57010/merchant/merchants/register,
    填写注册信息:

{
  "mobile": "13081936214",
  "password": "123456",
  "username": "13081936214",
  "verifiyCode": "424737",
  "verifiykey": "sms:1a22c4a19e8a48a0adf7c17cd09ed717"
}

  1. 注册成功

2.4.4 MapStruct对象转换

2.4.4.1 数据传输对象

在商户注册开发过程中用于数据传输的对象有 MerchantRegisterVO、MerchantDTO、entity(实体类),

它们的用途如下:

1、MerchantRegisterVO用于应用层接收前端请求及响应前端数据。

2、MerchantDTO 用于服务层传入及响应数据。

3、entity(实体类) 用于持久层传入及响应数据。

如下图:

数据传输对象(Data Transfer Object)是系统在交互过程中根据需要及规范将数据封装到数据对象中进行传输。

本项目数据传输对象的规范:

1、应用层

如没有接口参数的特殊要求,应用层使用DTO结尾的对象传输,否则单独定义VO结尾的对象传输。

2、服务层

统一使用DTO结尾的对象传输。

3、持久层

统一使用Entity对象传输。

举报

相关推荐

0 条评论