Bladeren bron

添加汇付支付,以及优化订单明细等

soobin 2 jaren geleden
bovenliggende
commit
f283582020
27 gewijzigde bestanden met toevoegingen van 2619 en 442 verwijderingen
  1. 12 0
      pom.xml
  2. 17 0
      src/main/java/com/szwl/common/myAnnotation/HuifuBaseCommon.java
  3. 33 0
      src/main/java/com/szwl/config/OppsMerchantConfig.java
  4. 391 0
      src/main/java/com/szwl/constant/HuifuConstant.java
  5. 42 6
      src/main/java/com/szwl/controller/TEquipmentController.java
  6. 21 0
      src/main/java/com/szwl/controller/THuifuMchCheckController.java
  7. 256 0
      src/main/java/com/szwl/controller/THuifuMchController.java
  8. 28 10
      src/main/java/com/szwl/controller/TJoinpayMchCheckController.java
  9. 7 5
      src/main/java/com/szwl/controller/TJoinpayMchController.java
  10. 510 419
      src/main/java/com/szwl/controller/TOrderController.java
  11. 17 1
      src/main/java/com/szwl/feign/bean/PayFeign.java
  12. 16 0
      src/main/java/com/szwl/mapper/THuifuMchCheckMapper.java
  13. 16 0
      src/main/java/com/szwl/mapper/THuifuMchMapper.java
  14. 61 0
      src/main/java/com/szwl/mapper/xml/THuifuMchCheckMapper.xml
  15. 32 0
      src/main/java/com/szwl/mapper/xml/THuifuMchMapper.xml
  16. 6 1
      src/main/java/com/szwl/mapper/xml/TOrderMapper.xml
  17. 1 0
      src/main/java/com/szwl/model/bo/JoinpayConstant.java
  18. 80 0
      src/main/java/com/szwl/model/entity/THuifuMch.java
  19. 169 0
      src/main/java/com/szwl/model/entity/THuifuMchCheck.java
  20. 9 0
      src/main/java/com/szwl/model/entity/TOrder.java
  21. 70 0
      src/main/java/com/szwl/model/entity/TOrderDetails.java
  22. 16 0
      src/main/java/com/szwl/service/THuifuMchCheckService.java
  23. 70 0
      src/main/java/com/szwl/service/THuifuMchService.java
  24. 20 0
      src/main/java/com/szwl/service/impl/THuifuMchCheckServiceImpl.java
  25. 636 0
      src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java
  26. 3 0
      src/main/java/com/szwl/service/impl/TOrderServiceImpl.java
  27. 80 0
      src/main/java/com/szwl/util/HuifuUtils.java

+ 12 - 0
pom.xml

@@ -214,6 +214,12 @@
 			<artifactId>hmpay-sdk</artifactId>
 			<version>1.1.4</version>
 		</dependency>
+		<!--汇付支付-->
+		<dependency>
+			<groupId>com.huifu.bspay.sdk</groupId>
+			<artifactId>dg-java-sdk</artifactId>
+			<version>3.0.8</version>
+		</dependency>
 		<!-- 导出Excel -->
 		<dependency>
 			<groupId>cn.afterturn</groupId>
@@ -227,6 +233,12 @@
 		</dependency>
 
 		<dependency>
+			<groupId>com.squareup.okhttp3</groupId>
+			<artifactId>okhttp</artifactId>
+			<version>4.9.3</version>
+		</dependency>
+
+		<dependency>
 			<groupId>org.springframework.boot</groupId>
 			<artifactId>spring-boot-starter</artifactId>
 		</dependency>

+ 17 - 0
src/main/java/com/szwl/common/myAnnotation/HuifuBaseCommon.java

@@ -0,0 +1,17 @@
+package com.szwl.common.myAnnotation;
+
+import com.huifu.bspay.sdk.opps.core.BasePay;
+import com.huifu.bspay.sdk.opps.core.config.MerConfig;
+
+public class HuifuBaseCommon {
+
+    /***
+     * @Description: 初始化设置商户公共参数(全局只需设置一次)
+     * @param merConfig
+     * @throws Exception
+     * @date: 2021年7月5日17:59:33
+     */
+    public static void doInit(MerConfig merConfig) throws Exception {
+        BasePay.initWithMerConfig(merConfig);
+    }
+}

+ 33 - 0
src/main/java/com/szwl/config/OppsMerchantConfig.java

@@ -0,0 +1,33 @@
+package com.szwl.config;
+
+import com.huifu.bspay.sdk.opps.core.BasePay;
+import com.huifu.bspay.sdk.opps.core.config.MerConfig;
+import com.szwl.constant.HuifuConstant;
+
+/**
+ * 初始化汇付商户调用参数
+ */
+public class OppsMerchantConfig {
+
+    public static MerConfig getMerchantConfig() {
+        /** debug 模式,开启后有详细的日志
+         */
+        BasePay.debug = true;
+
+        /**
+         * prodMode 模式,默认为生产模式
+         * MODE_PROD = "prod"; // 生产环境
+         * MODE_TEST = "test"; // 线上联调环境(针对商户联调测试)
+         */
+        BasePay.prodMode = BasePay.MODE_PROD;
+
+
+        MerConfig merConfig = new MerConfig();
+        merConfig.setSysId(HuifuConstant.SYS_ID);
+        merConfig.setProcutId(HuifuConstant.PRODUCT_ID);
+        merConfig.setRsaPublicKey(HuifuConstant.RSA_PUBLIC_KEY);
+        merConfig.setRsaPrivateKey(HuifuConstant.RSA_PRIVATE_KEY);
+        return merConfig;
+    }
+
+}

File diff suppressed because it is too large
+ 391 - 0
src/main/java/com/szwl/constant/HuifuConstant.java


+ 42 - 6
src/main/java/com/szwl/controller/TEquipmentController.java

@@ -95,6 +95,14 @@ public class TEquipmentController {
 
         LambdaQueryWrapper<TEquipment> query = Wrappers.lambdaQuery();
         TAdmin admin = tAdminService.getById(id);
+        // 申泽管理员
+        if(id == 2738) {
+            companyType = "0";
+        }
+        // 七云管理员
+        if(id == 2739) {
+            companyType = "1";
+        }
         Integer type = admin.getType();
         if (type > 1) {
             if (type == 2) {
@@ -334,8 +342,7 @@ public class TEquipmentController {
         }
 
         if (type == 3) {
-
-            //查找属于这个商家子账户的设备 todo
+            //查找属于这个商家子账户的设备
             TAdminEquipment adminEquipment = tAdminEquipmentService.getById(admin.getId());
             if (adminEquipment.getType().equals("0")) {
                 //全部机器
@@ -559,7 +566,7 @@ public class TEquipmentController {
 //            TEquipmentExample.Criteria criteria = example.createCriteria();
 //            criteria.andAdminIdEqualTo(param.getId());
 //            List<TEquipment> equipmentList = tEquipmentService.selectByOption(example);
-            //todo 需要区分是否商家子账户
+            // 需要区分是否商家子账户
             LambdaQueryWrapper<TEquipment> query = Wrappers.lambdaQuery();
             query.eq(TEquipment::getAdminId, param.getId());
             List<TEquipment> equipmentList = tEquipmentService.list(query);
@@ -817,7 +824,7 @@ public class TEquipmentController {
             Long adminId = equipment.getAdminId();
             String dminId = String.valueOf(adminId);
             param.setAdminId(dminId);
-            //todo 需要区分是否商家子账户
+            // 需要区分是否商家子账户
         }
         machineTotalNum = tEquipmentService.findMachineTotalNum(param);
         machineUseNum = tEquipmentService.findMachineUseNum(param);
@@ -871,8 +878,7 @@ public class TEquipmentController {
 //                        .setMessage("SUCCESS"));
 //    }
 
-    //修改机器状态  type(类型,0:外门,1:内门),
-    //            status(状态:0:关闭,1:开启)
+    //修改机器状态  type(类型,0:外门,1:内门), status(状态:0:关闭,1:开启)
     @ApiOperation(value = "远程开门")
     @GetMapping("/openDoor")
     public ResponseModel<?> openDoor(String equipmentId, String type, String status) {
@@ -1555,5 +1561,35 @@ public class TEquipmentController {
         DownloadUtils.downloadFile(filepath, response);
         return R.ok();
     }
+
+    // 从服务器下载文件
+    public void downloadFile(String filepath, HttpServletResponse response) throws IOException {
+        File logFile = new File(filepath);
+        response.setHeader("Content-Disposition", "attachment; filename=\"" + logFile.getName() + "\"");
+
+        FileInputStream fis = new FileInputStream(logFile);
+        OutputStream os = response.getOutputStream();
+
+        byte[] buffer = new byte[4096];
+        int length;
+        while ((length = fis.read(buffer)) > 0) {
+            os.write(buffer, 0, length);
+            os.flush();
+        }
+        os.close();
+        fis.close();
+        response.flushBuffer();
+    }
+
+    //查找设备
+    @ApiOperation(value = "获取对应的机器编号")
+    @GetMapping("/findEquipmentByClientIds")
+    public ResponseModel<List<TEquipment>> findEquipmentByClientIds(@RequestParam("clientIds") List<String> clientIds) {
+
+        LambdaQueryWrapper<TEquipment> wrapper = new LambdaQueryWrapper<>();
+        wrapper.in(TEquipment::getClientId,clientIds);
+        List<TEquipment> list = tEquipmentService.list(wrapper);
+        return R.ok(list);
+    }
 }
 

+ 21 - 0
src/main/java/com/szwl/controller/THuifuMchCheckController.java

@@ -0,0 +1,21 @@
+package com.szwl.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-13
+ */
+@RestController
+@RequestMapping("/tHuifuMchCheck")
+public class THuifuMchCheckController {
+
+}
+

+ 256 - 0
src/main/java/com/szwl/controller/THuifuMchController.java

@@ -0,0 +1,256 @@
+package com.szwl.controller;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.szwl.constant.HuifuConstant;
+import com.szwl.constant.ResponseCodesEnum;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.THuifuMch;
+import com.szwl.model.entity.THuifuMchCheck;
+import com.szwl.service.THuifuMchCheckService;
+import com.szwl.service.THuifuMchService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.Date;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-12
+ */
+@Api(value = "/tHuifuMch", tags = {"汇付支付"})
+@RestController
+@RequestMapping("/tHuifuMch")
+public class THuifuMchController {
+
+
+    @Autowired
+    private THuifuMchService tHuifuMchService;
+
+    @Autowired
+    private THuifuMchCheckService tHuifuMchCheckService;
+
+
+    @ApiOperation(value = "商户入驻申请")
+    @PostMapping("/addMerchant")
+    public ResponseModel<?> addMerchant(@Valid @RequestBody THuifuMchCheck tHuifuMchCheck) {
+        if (tHuifuMchCheck.getAdminId() == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        tHuifuMchCheck.setCreateDate(new Date());
+        tHuifuMchCheck.setModifyDate(new Date());
+        tHuifuMchCheck.setStatus("0");
+        tHuifuMchCheckService.save(tHuifuMchCheck);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "商户修改申请")
+    @PostMapping("/updateMerchant")
+    public ResponseModel<?> updateMerchant(@Valid @RequestBody THuifuMchCheck tHuifuMchCheck) {
+        if (tHuifuMchCheck.getAdminId() == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        // 排除掉不复制的属性
+        String[] ignoreProperties = {"id", "createDate","adminId","huifuId"};
+        LambdaQueryWrapper<THuifuMchCheck> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(THuifuMchCheck::getAdminId,tHuifuMchCheck.getAdminId());
+        THuifuMchCheck newHuifuMchCheck = tHuifuMchCheckService.getOne(queryWrapper);
+        BeanUtil.copyProperties(tHuifuMchCheck,newHuifuMchCheck,ignoreProperties);
+        newHuifuMchCheck.setModifyDate(new Date());
+        newHuifuMchCheck.setStatus("4");
+        tHuifuMchCheckService.updateById(newHuifuMchCheck);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "审核商户入驻")
+    @GetMapping ("/auditAddMerchant")
+    public ResponseModel<?> auditAddMerchant(Long id, String status) throws Exception {
+        if (id == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        // 找到用户id对应的审核信息
+        THuifuMchCheck huifuMchCheck = tHuifuMchCheckService.getById(id);
+        String data = null;
+        if(status.equals("1")) {
+            //通过
+            // 判断商户类型,“0”为个人,“1”为企业
+            if(huifuMchCheck.getType().equals("0")) {
+                data = tHuifuMchService.addPersonage(huifuMchCheck);
+            } else {
+                data = tHuifuMchService.addEnterprise(huifuMchCheck);
+            }
+            // 判断是否入驻成功
+            String success = "success";
+            // 判断是否修改成功
+            if(success.equals(data)) {
+                return R.ok();
+            } else {
+                return R.fail(ResponseCodesEnum.A0001,data);
+            }
+        } else {
+            // 拒绝
+            huifuMchCheck.setModifyDate(new Date());
+            huifuMchCheck.setStatus("3");
+            tHuifuMchCheckService.updateById(huifuMchCheck);
+            return R.ok();
+        }
+    }
+
+    @ApiOperation(value = "审核商户修改")
+    @GetMapping("/auditUpdateMerchant")
+    public ResponseModel<?> auditUpdateMerchant(Long id, String status) throws Exception {
+        if (id == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        // 找到id对应的审核信息
+        THuifuMchCheck huifuMchCheck = tHuifuMchCheckService.getById(id);
+        if(status.equals("1")) {
+            // 同意
+            String data = tHuifuMchService.updateMerchant(huifuMchCheck);
+            String success = "success";
+            // 判断是否修改成功
+            if(success.equals(data)) {
+                return R.ok();
+            } else {
+                return R.fail(ResponseCodesEnum.A0001,data);
+            }
+        } else {
+            // 拒绝
+            // 拒绝
+            huifuMchCheck.setModifyDate(new Date());
+            huifuMchCheck.setStatus("3");
+            tHuifuMchCheckService.updateById(huifuMchCheck);
+            return R.ok();
+        }
+    }
+
+    @ApiOperation(value = "上传材料图片")
+    @PostMapping("/uploadPic")
+    public ResponseModel<?> uploadPic(@RequestParam("file") MultipartFile file,
+                                      @RequestParam("adminId") Long adminId,
+                                      @RequestParam("fileType") String fileType){
+        if (adminId == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        // 找到用户id对应的审核信息
+        LambdaQueryWrapper<THuifuMchCheck> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(THuifuMchCheck::getAdminId,adminId);
+        THuifuMchCheck tHuifuMchCheck = tHuifuMchCheckService.getOne(queryWrapper);
+        if(tHuifuMchCheck == null) {
+            return R.fail(ResponseCodesEnum.A0206,"还未填写个人资料");
+        }
+        String result = "";
+        if(file != null) {
+            try{
+                if(fileType.equals(HuifuConstant.fileType.F03.toString())) {
+                    result = tHuifuMchService.uploadPic(file, HuifuConstant.fileType.F03);
+                    tHuifuMchCheck.setCertBackPic(result);
+                } else if (fileType.equals(HuifuConstant.fileType.F02.toString())){
+                    result = tHuifuMchService.uploadPic(file, HuifuConstant.fileType.F02);
+                    tHuifuMchCheck.setCertFrontPic(result);
+                } else if (fileType.equals(HuifuConstant.fileType.F13.toString())) {
+                    result = tHuifuMchService.uploadPic(file, HuifuConstant.fileType.F13);
+                    tHuifuMchCheck.setCardFrontPic(result);
+                } else if (fileType.equals(HuifuConstant.fileType.F07.toString())) {
+                    result = tHuifuMchService.uploadPic(file, HuifuConstant.fileType.F07);
+                    tHuifuMchCheck.setLicensePic(result);
+                } else if (fileType.equals(HuifuConstant.fileType.F08.toString())) {
+                    result = tHuifuMchService.uploadPic(file, HuifuConstant.fileType.F08);
+                    tHuifuMchCheck.setRegAcctPic(result);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+        if(StrUtil.isNotEmpty(result)) {
+            tHuifuMchCheckService.updateById(tHuifuMchCheck);
+            return R.ok("上传成功").setData(result);
+        } else {
+            return R.fail(ResponseCodesEnum.F0000,"上传失败");
+        }
+    }
+
+    @ApiOperation(value = "提交审核")
+    @PostMapping("/submitCheck")
+    public ResponseModel<?> submitCheck(@RequestBody THuifuMchCheck tHuifuMchCheck){
+        if (tHuifuMchCheck.getAdminId() == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        // 找到用户id对应的审核信息
+        LambdaQueryWrapper<THuifuMchCheck> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(THuifuMchCheck::getAdminId,tHuifuMchCheck.getAdminId());
+        THuifuMchCheck huifuMchCheck = tHuifuMchCheckService.getOne(queryWrapper);
+        huifuMchCheck.setStatus("1");
+        tHuifuMchCheckService.updateById(huifuMchCheck);
+        return R.ok();
+    }
+
+    @ApiOperation(value = "审核回调")
+    @PostMapping("/auditNotify")
+    public ResponseModel<?> auditNotify(HttpServletRequest request){
+        String data = request.getParameter("data");
+        JSONObject jsonObject = JSONObject.parseObject(data);
+        String auditStatus = jsonObject.getString("audit_status");
+        String auditDesc = jsonObject.getString("audit_desc");
+        System.out.println("data:" + data);
+        System.out.println("audit_status:" + auditStatus);
+        System.out.println("audit_desc:" + auditDesc);
+        return R.ok().setData(data);
+    }
+
+    @ApiOperation(value = "获取汇付商户号")
+    @GetMapping("/getHuifuId")
+    public ResponseModel<THuifuMch> getHuifuId(@RequestParam Long adminId) {
+        if(adminId == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        LambdaQueryWrapper<THuifuMch> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(THuifuMch::getAdminId,adminId);
+        THuifuMch huifuMch = tHuifuMchService.getOne(wrapper);
+        return R.ok(huifuMch);
+    }
+
+    @ApiOperation(value = "获取审核信息")
+    @GetMapping("/getHuifuMchCheck")
+    public ResponseModel<THuifuMchCheck> getHuifuMchCheck(@RequestParam Long adminId) {
+        if(adminId == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        LambdaQueryWrapper<THuifuMchCheck> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(THuifuMchCheck::getAdminId,adminId);
+        THuifuMchCheck huifuMchCheck = tHuifuMchCheckService.getOne(queryWrapper);
+        return R.ok(huifuMchCheck);
+    }
+
+    @ApiOperation(value = "发送验证码")
+    @GetMapping("/sendSms")
+    public ResponseModel<?> sendSms(@RequestParam Long adminId) throws Exception {
+        if(adminId == null) {
+            return R.fail(ResponseCodesEnum.A0001);
+        }
+        LambdaQueryWrapper<THuifuMch> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(THuifuMch::getAdminId,adminId);
+        THuifuMch tHuifuMch = tHuifuMchService.getOne(queryWrapper);
+        String result = tHuifuMchService.sendSms(tHuifuMch);
+        if(result.equals("000000")) {
+            return R.ok(tHuifuMch);
+        } else {
+            return R.fail(ResponseCodesEnum.A0001,"验证码发送失败");
+        }
+    }
+
+}
+

+ 28 - 10
src/main/java/com/szwl/controller/TJoinpayMchCheckController.java

@@ -46,6 +46,8 @@ public class TJoinpayMchCheckController {
     @Autowired
     TShandeMchService tShandeMchService;
     @Autowired
+    THuifuMchCheckService tHuifuMchCheckService;
+    @Autowired
     TAdminService adminService;
 
     @ApiOperation(value = "平台查找审核信息列表")
@@ -97,22 +99,38 @@ public class TJoinpayMchCheckController {
         }
         if(type.equals("1")) {
             //杉德的审核信息
-            LambdaQueryWrapper<TShandeMchCheck> query = Wrappers.lambdaQuery();
+            LambdaQueryWrapper<THuifuMchCheck> query = Wrappers.lambdaQuery();
             if(admin.getType()>1){
-                query.eq(TShandeMchCheck::getAdminId,admin.getId());
+                query.eq(THuifuMchCheck::getAdminId,admin.getId());
             }
             if(StringUtils.isNotEmpty(username)){
                 LambdaQueryWrapper<TAdmin> query1 = Wrappers.lambdaQuery();
                 query1.eq(TAdmin::getUsername,username);
                 List<TAdmin> list1 = adminService.list(query1);
                 if(list1.size()>0){
-                    query.eq(TShandeMchCheck::getAdminId,list1.get(0).getId());
+                    query.eq(THuifuMchCheck::getAdminId,list1.get(0).getId());
                 }
             }
-            query.orderByDesc(TShandeMchCheck::getCreateDate);
-            query.eq(TShandeMchCheck::getCheckType,"0");
-            Page<TShandeMchCheck> page = new Page<>(current, size, true);
-            IPage<TShandeMchCheck> iPage = tShandeMchCheckService.page(page, query);
+            if (admin.getId() == 2738) {
+                LambdaQueryWrapper<TAdmin> adminQuery = Wrappers.lambdaQuery();
+                adminQuery.isNull(TAdmin::getCompanyType).or()
+                        .eq(TAdmin::getCompanyType, "0");
+                List<Long> adminIds = adminService.list(adminQuery).stream()
+                        .map(TAdmin::getId).collect(Collectors.toList());
+                query.in(THuifuMchCheck::getAdminId,adminIds);
+            }
+            // 七云平台管理员
+            if (admin.getId() == 2739) {
+                LambdaQueryWrapper<TAdmin> adminQuery = Wrappers.lambdaQuery();
+                adminQuery.eq(TAdmin::getCompanyType, "1");
+                List<Long> adminIds = adminService.list(adminQuery).stream()
+                        .map(TAdmin::getId).collect(Collectors.toList());
+                query.in(THuifuMchCheck::getAdminId,adminIds);
+            }
+            query.orderByDesc(THuifuMchCheck::getCreateDate);
+            query.eq(THuifuMchCheck::getStatus,"1").or().eq(THuifuMchCheck::getStatus,"4");
+            Page<THuifuMchCheck> page = new Page<>(current, size, true);
+            IPage<THuifuMchCheck> iPage = tHuifuMchCheckService.page(page, query);
             return R.ok(iPage);
         }
         return R.ok();
@@ -144,9 +162,9 @@ public class TJoinpayMchCheckController {
                 return R.ok(joinpayMchCheck);
             }
             if(type.equals("1")){
-                //杉德
-                TShandeMchCheck shandeMchCheck = tShandeMchCheckService.getById(id);
-                return R.ok(shandeMchCheck);
+                //汇付
+                THuifuMchCheck huifuMchCheck = tHuifuMchCheckService.getById(id);
+                return R.ok(huifuMchCheck);
             }
         }
         return R.ok();

+ 7 - 5
src/main/java/com/szwl/controller/TJoinpayMchController.java

@@ -98,7 +98,6 @@ public class TJoinpayMchController {
     @PostMapping("/save")
     public ResponseModel<?> save(@RequestBody TJoinpayMch tJoinpayMch) {
 
-//        TAdmin admin = adminService.getById(tJoinpayMch.getAdminId());
         LambdaQueryWrapper<TJoinpayMch> query = Wrappers.lambdaQuery();
         query.eq(TJoinpayMch::getAdminId,tJoinpayMch.getAdminId());
         List<TJoinpayMch> list = tJoinpayMchService.list(query);
@@ -235,14 +234,17 @@ public class TJoinpayMchController {
                 TJoinpayMch joinpayMch = tJoinpayMchService.getById(tJoinpayMch.getId());
                 return R.ok(joinpayMch);
             }
-
         }else {
             LambdaQueryWrapper<TJoinpayMch> query = Wrappers.lambdaQuery();
             query.eq(TJoinpayMch::getAdminId,Long.valueOf(id));
-            List<TJoinpayMch> list = tJoinpayMchService.list(query);
-            TJoinpayMch tJoinpayMch = list.get(0);
+//            List<TJoinpayMch> list = tJoinpayMchService.list(query);
+//            TJoinpayMch tJoinpayMch = list.get(0);
+            TJoinpayMch tJoinpayMch = tJoinpayMchService.getOne(query);
+            if(tJoinpayMch == null) {
+                return R.fail(ResponseCodesEnum.E0001, "未注册提现账号");
+            }
             tJoinpayMchService.refreshMch(tJoinpayMch);
-            String s = tJoinpayMchService.refreshMyAccount(tJoinpayMch);
+            tJoinpayMchService.refreshMyAccount(tJoinpayMch);
             TJoinpayMch joinpayMch = tJoinpayMchService.getById(tJoinpayMch.getId());
             return R.ok(joinpayMch);
         }

File diff suppressed because it is too large
+ 510 - 419
src/main/java/com/szwl/controller/TOrderController.java


+ 17 - 1
src/main/java/com/szwl/feign/bean/PayFeign.java

@@ -5,7 +5,9 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.szwl.model.bo.ResponseModel;
 import com.szwl.model.entity.TAirwallexWallet;
 import com.szwl.model.entity.TOrder;
+import com.szwl.model.entity.TOrderDetails;
 import com.szwl.model.query.TAdminParam;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -13,20 +15,34 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
+import java.util.List;
 
 // url 指定pay-server所在的地址
-@FeignClient(name = "pay-server", url = "http://127.0.0.1:49013")
+@FeignClient(name = "pay-server")
 public interface PayFeign {
 
     @GetMapping("/test/testPay")
     ResponseModel<?> testPay(@RequestParam String id);
+
     @PostMapping("/tOrder/addOrder")
     ResponseModel<?> addOrder(@RequestBody TOrder order);
+
     @GetMapping("/tOrder/getOrder")
     ResponseModel<TOrder> getOrder(@RequestParam String id);
+
+    @GetMapping("/tOrder/getOrderBySn")
+    ResponseModel<?> getOrderBySn(@RequestParam String sn);
+
+    @GetMapping("/tOrderDetails/getOrderDetailsBySn")
+    ResponseModel<List<TOrderDetails>> getOrderDetailsBySn(@RequestParam String sn);
+
+    @PostMapping("/tOrderDetails/updateOrderDetails")
+    ResponseModel<?> updateOrderDetails(@RequestBody TOrderDetails orderDetails);
+
     //直连微信退款
     @GetMapping("/tWeixinPay/refund")
     ResponseModel<String> refund(@RequestParam(value = "sn") String sn,@RequestParam(value = "refusePrice") BigDecimal refusePrice);
+
     @PostMapping("/tOrder/updateOrder")
     ResponseModel<?> updateOrder(@RequestBody TOrder order);
 //    @GetMapping("/tOrder/tradeServiceUniPay")

+ 16 - 0
src/main/java/com/szwl/mapper/THuifuMchCheckMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.THuifuMchCheck;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-13
+ */
+public interface THuifuMchCheckMapper extends BaseMapper<THuifuMchCheck> {
+
+}

+ 16 - 0
src/main/java/com/szwl/mapper/THuifuMchMapper.java

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.THuifuMch;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-12
+ */
+public interface THuifuMchMapper extends BaseMapper<THuifuMch> {
+
+}

File diff suppressed because it is too large
+ 61 - 0
src/main/java/com/szwl/mapper/xml/THuifuMchCheckMapper.xml


+ 32 - 0
src/main/java/com/szwl/mapper/xml/THuifuMchMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.szwl.mapper.THuifuMchMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.THuifuMch">
+        <id column="id" property="id" />
+        <result column="create_date" property="createDate" />
+        <result column="modify_date" property="modifyDate" />
+        <result column="admin_id" property="adminId" />
+        <result column="huifu_id" property="huifuId" />
+        <result column="reg_name" property="regName" />
+        <result column="short_name" property="shortName" />
+        <result column="type" property="type" />
+        <result column="name" property="name" />
+        <result column="phone" property="phone" />
+        <result column="email" property="email" />
+        <result column="cert_no" property="certNo" />
+        <result column="cert_date" property="certDate" />
+        <result column="cert_address" property="certAddress" />
+        <result column="card_type" property="cardType" />
+        <result column="card_no" property="cardNo" />
+        <result column="card_name" property="cardName" />
+        <result column="branch_code" property="branchCode" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, create_date, modify_date, admin_id, huifu_id, reg_name, short_name, type, name, phone, email, cert_no, cert_date, cert_address, card_type, card_no, card_name, branch_code
+    </sql>
+
+</mapper>

+ 6 - 1
src/main/java/com/szwl/mapper/xml/TOrderMapper.xml

@@ -35,11 +35,16 @@
         <result column="pay_platform" property="payPlatform" />
         <result column="is_settlement" property="isSettlement" />
         <result column="proportion_desc" property="proportionDesc" />
+        <result column="refund_quantity" property="refundQuantity" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        id, create_date, modify_date, admin_id, admin_proportion, agency_id, agency_proportion, alt_info, client_id, equipment_id, frp_code, merchant_id, merchant_proportion, pay_date, personage_id, personage_proportion, price, product_id, product_name, refund_date, sn, status, type, trx_no, refund_trx_no, es, refund_amount, note, pay_platform, is_settlement, proportion_desc
+        id, create_date, modify_date, admin_id, admin_proportion, agency_id, agency_proportion,
+        alt_info, client_id, equipment_id, frp_code, merchant_id, merchant_proportion, pay_date,
+        personage_id, personage_proportion, price, product_id, product_name, refund_date, sn,
+        status, type, trx_no, refund_trx_no, es, refund_amount, note, pay_platform, is_settlement,
+        proportion_desc, refund_quantity
     </sql>
     <!-- 统计 地区销售数据-->
     <select id="getAreaPrice" resultType="java.lang.Double">

+ 1 - 0
src/main/java/com/szwl/model/bo/JoinpayConstant.java

@@ -56,6 +56,7 @@ public class JoinpayConstant {
      *  退款成功回调
      */
     public final static String Notify_Refund_Url = "https://sz.sunzee.com.cn/PAY-SERVER/tOrder/notifyRefund";
+//    public final static String Notify_Refund_Url = "http://szwltest.sunzee.com.cn:49002/PAY-SERVER/tOrder/notifyRefund";
     public final static String Admin_Notify_Refund_Url = "http://app.sunzee.com.cn/api/order/adminNotifyRefund.htm";
 
 

+ 80 - 0
src/main/java/com/szwl/model/entity/THuifuMch.java

@@ -0,0 +1,80 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-12
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="THuifuMch对象", description="")
+public class THuifuMch implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "商户号")
+    private String huifuId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String regName;
+
+    @ApiModelProperty(value = "商户简称")
+    private String shortName;
+
+    @ApiModelProperty(value = "商户类型,“0”为个人,“1”为企业")
+    private String type;
+
+    @ApiModelProperty(value = "联系人姓名")
+    private String name;
+
+    @ApiModelProperty(value = "联系人手机号码")
+    private String phone;
+
+    @ApiModelProperty(value = "联系人邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "身份证号")
+    private String certNo;
+
+    @ApiModelProperty(value = "身份证有效期")
+    private String certDate;
+
+    @ApiModelProperty(value = "身份证地址")
+    private String certAddress;
+
+    @ApiModelProperty(value = "结算账户类型,“0”为个人,“1”为对公")
+    private String cardType;
+
+    @ApiModelProperty(value = "结算账号")
+    private String cardNo;
+
+    @ApiModelProperty(value = "卡户名")
+    private String cardName;
+
+    @ApiModelProperty(value = "联行号")
+    private String branchCode;
+
+
+}

+ 169 - 0
src/main/java/com/szwl/model/entity/THuifuMchCheck.java

@@ -0,0 +1,169 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import javax.validation.constraints.Email;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-13
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="THuifuMchCheck对象", description="")
+public class THuifuMchCheck implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    private Date createDate;
+
+    private Date modifyDate;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "商户号")
+    private String huifuId;
+
+    @ApiModelProperty(value = "商户名称")
+    private String regName;
+
+    @ApiModelProperty(value = "商户简称")
+    private String shortName;
+
+    @ApiModelProperty(value = "商户类型,“0”为个人,“1”为企业")
+    private String type;
+
+    @ApiModelProperty(value = "联系人姓名")
+    private String name;
+
+    @ApiModelProperty(value = "经营省")
+    private String provId;
+
+    @ApiModelProperty(value = "经营市")
+    private String areaId;
+
+    @ApiModelProperty(value = "经营区")
+    private String districtId;
+
+    @ApiModelProperty(value = "经营详细地址")
+    private String detailAddr;
+
+    @ApiModelProperty(value = "联系人手机号码")
+    private String phone;
+
+    @Email
+    @ApiModelProperty(value = "联系人邮箱")
+    private String email;
+
+    @ApiModelProperty(value = "客服电话")
+    private String servicePhone;
+
+    @ApiModelProperty(value = "身份证号")
+    private String certNo;
+
+    @ApiModelProperty(value = "持卡人证件有效期类型,1:长期有效,0:非长期有效;")
+    private String certValidityType;
+
+    @ApiModelProperty(value = "持卡人证件有效期开始日期,日期格式:yyyyMMdd")
+    private String certBeginDate;
+
+    @ApiModelProperty(value = "持卡人证件有效期截止日期,日期格式:yyyyMMdd")
+    private String certEndDate;
+
+    @ApiModelProperty(value = "身份证地址")
+    private String certAddress;
+
+    @ApiModelProperty(value = "结算账户类型,“0”为对公账户,“1”为个人账户")
+    private String cardType;
+
+    @ApiModelProperty(value = "结算账号")
+    private String cardNo;
+
+    @ApiModelProperty(value = "银行所在省")
+    private String cardProvId;
+
+    @ApiModelProperty(value = "银行所在市")
+    private String cardAreaId;
+
+    @ApiModelProperty(value = "结算手机号")
+    private String mp;
+
+    @ApiModelProperty(value = "卡户名")
+    private String cardName;
+
+    @ApiModelProperty(value = "联行号")
+    private String branchCode;
+
+    @ApiModelProperty(value = "结算卡正面")
+    private String cardFrontPic;
+
+    @ApiModelProperty(value = "结算卡反面")
+    private String cardBackPic;
+
+    @ApiModelProperty(value = "身份证人像面")
+    private String certBackPic;
+
+    @ApiModelProperty(value = "身份证国徽面")
+    private String certFrontPic;
+
+    @ApiModelProperty(value = "营业执照图片")
+    private String licensePic;
+
+    @ApiModelProperty(value = "营业执照编号")
+    private String licenseCode;
+
+    @ApiModelProperty(value = "成立时间")
+    private String foundDate;
+
+    @ApiModelProperty(value = "注册省")
+    private String regProvId;
+
+    @ApiModelProperty(value = "注册市")
+    private String regAreaId;
+
+    @ApiModelProperty(value = "注册区")
+    private String regDistrictId;
+
+    @ApiModelProperty(value = "注册详细地址")
+    private String regDetail;
+
+    @ApiModelProperty(value = "核准号")
+    private String openLicenceNo;
+
+    @ApiModelProperty(value = "营业执照有效期类型,0:非长期有效 ,1:长期有效 ")
+    private String licenseValidityType;
+
+    @ApiModelProperty(value = "营业执照有效期开始日期,日期格式:yyyyMMdd")
+    private String licenseBeginDate;
+
+    @ApiModelProperty(value = "营业执照有效期截止日期,日期格式:yyyyMMdd")
+    private String licenseEndDate;
+
+    @ApiModelProperty(value = "开户许可证")
+    private String regAcctPic;
+
+    @ApiModelProperty(value = "审核状态:“0”为待上传材料图片,“1”为审核中,“2”为审核通过,“3”为审核未通过,“4”为申请修改")
+    private String status;
+
+    @ApiModelProperty(value = "审核描述")
+    private String auditDesc;
+
+    @ApiModelProperty(value = "修改验证码")
+    private String sms;
+
+}

+ 9 - 0
src/main/java/com/szwl/model/entity/TOrder.java

@@ -128,4 +128,13 @@ public class TOrder implements Serializable {
 
     //'订单状态;0:排队中,1:正在制作,2:已制作',
     private String orderStatus;
+
+    @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
+    private String companyType;
+
+    @ApiModelProperty(value = "汇付分账明细")
+    private String acctSplitBunch;
+
+    @ApiModelProperty(value = "退款数量")
+    private Integer refundQuantity;
 }

+ 70 - 0
src/main/java/com/szwl/model/entity/TOrderDetails.java

@@ -0,0 +1,70 @@
+package com.szwl.model.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 订单明细表
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="TOrderDetails对象", description="订单明细表")
+public class TOrderDetails implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "订单明细表ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "订单编号")
+    private String orderSn;
+
+    @ApiModelProperty(value = "商品编号")
+    private String productNo;
+
+    @ApiModelProperty(value = "商品名称")
+    private String productName;
+
+    @ApiModelProperty(value = "商品数量")
+    private Integer productNumber;
+
+    @ApiModelProperty(value = "商品单价")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "小计金额")
+    private BigDecimal amount;
+
+    @ApiModelProperty(value = "退款数量")
+    private Integer refundQuantity;
+
+    @ApiModelProperty(value = "退款金额")
+    private BigDecimal refundAmout;
+
+    @ApiModelProperty(value = "退款状态,0:未支付,1:已支付,2:部分退款,3:已退款,4:退款中")
+    private String refundStatus;
+
+    @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
+    private String companyType;
+
+
+}

+ 16 - 0
src/main/java/com/szwl/service/THuifuMchCheckService.java

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.THuifuMchCheck;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-13
+ */
+public interface THuifuMchCheckService extends IService<THuifuMchCheck> {
+
+}

+ 70 - 0
src/main/java/com/szwl/service/THuifuMchService.java

@@ -0,0 +1,70 @@
+package com.szwl.service;
+
+import com.huifu.bspay.sdk.opps.core.exception.BasePayException;
+import com.szwl.constant.HuifuConstant;
+import com.szwl.model.entity.THuifuMch;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.entity.THuifuMchCheck;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-12
+ */
+public interface THuifuMchService extends IService<THuifuMch> {
+
+    /**
+     * 汇付个人商户入驻
+     * @param tHuifuMchCheck
+     * @return
+     * @throws Exception
+     */
+    String addPersonage(THuifuMchCheck tHuifuMchCheck) throws Exception;
+
+    /**
+     * 汇付企业商户入驻
+     * @param tHuifuMchCheck
+     * @return
+     * @throws Exception
+     */
+    String addEnterprise(THuifuMchCheck tHuifuMchCheck) throws Exception;
+
+    /**
+     * 汇付商户基本信息修改
+     * @param huifuMchCheck
+     * @return
+     */
+    String updateMerchant(THuifuMchCheck huifuMchCheck) throws Exception;
+
+    /**
+     * 汇付上传图片
+     * @param file
+     * @param fileType
+     * @return
+     */
+    String uploadPic(MultipartFile file, HuifuConstant.fileType fileType);
+
+    /**
+     * 发起退款
+     * @param sn
+     * @param price
+     * @param payDate
+     * @param remark
+     * @return
+     */
+    String refund(String sn, BigDecimal price, String payDate, String remark,String acctSplitBunch) throws Exception;
+
+    /**
+     * 发送验证码
+     * @param tHuifuMch
+     * @return
+     */
+    String sendSms(THuifuMch tHuifuMch) throws Exception;
+}

+ 20 - 0
src/main/java/com/szwl/service/impl/THuifuMchCheckServiceImpl.java

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.THuifuMchCheck;
+import com.szwl.mapper.THuifuMchCheckMapper;
+import com.szwl.service.THuifuMchCheckService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-13
+ */
+@Service
+public class THuifuMchCheckServiceImpl extends ServiceImpl<THuifuMchCheckMapper, THuifuMchCheck> implements THuifuMchCheckService {
+
+}

+ 636 - 0
src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java

@@ -0,0 +1,636 @@
+package com.szwl.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.huifu.bspay.sdk.opps.core.exception.BasePayException;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import com.huifu.bspay.sdk.opps.core.utils.OkHttpClientTools;
+import com.huifu.bspay.sdk.opps.core.utils.SequenceTools;
+import com.szwl.common.myAnnotation.HuifuBaseCommon;
+import com.szwl.config.OppsMerchantConfig;
+import com.szwl.constant.HuifuConstant;
+import com.szwl.model.bo.R;
+import com.szwl.model.entity.THuifuMch;
+import com.szwl.mapper.THuifuMchMapper;
+import com.szwl.model.entity.THuifuMchCheck;
+import com.szwl.service.THuifuMchCheckService;
+import com.szwl.service.THuifuMchService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.util.HuifuUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.util.EntityUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.nio.charset.Charset;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.*;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-12
+ */
+@Slf4j
+@Service
+public class THuifuMchServiceImpl extends ServiceImpl<THuifuMchMapper, THuifuMch> implements THuifuMchService {
+
+    @Autowired
+    private THuifuMchCheckService tHuifuMchCheckService;
+
+    @Autowired
+    private THuifuMchService tHuifuMchService;
+
+
+    /**
+     * 汇付个人商户入驻
+     * @param tHuifuMchCheck
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String addPersonage(THuifuMchCheck tHuifuMchCheck) throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/basicdata/indv";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        // 请求流水号
+        request.put("req_seq_id", HuifuUtils.initReqSeqId());
+        // 请求日期
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        // 上级主体ID
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        // 商户名称
+        request.put("reg_name", tHuifuMchCheck.getRegName());
+        // 商户简称
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getShortName())) {
+            request.put("short_name", tHuifuMchCheck.getShortName());
+        }
+        // 经营省
+        request.put("prov_id", tHuifuMchCheck.getProvId());
+        // 经营市
+        request.put("area_id", tHuifuMchCheck.getAreaId());
+        // 经营区
+        request.put("district_id", tHuifuMchCheck.getDistrictId());
+        // 经营详细地址
+        request.put("detail_addr", tHuifuMchCheck.getDetailAddr());
+        // 联系人姓名
+        request.put("contact_name", tHuifuMchCheck.getRegName());
+        // 联系人手机号
+        request.put("contact_mobile_no", tHuifuMchCheck.getPhone());
+        // 联系人电子邮箱
+        request.put("contact_email", tHuifuMchCheck.getEmail());
+        // 商户名
+        request.put("sms_send_flag", "M");
+        // 异步通知地址:审核结果消息接收地址
+//        request.put("async_return_url", "异步通知地址");
+        // 结算卡正面
+        request.put("settle_card_front_pic", tHuifuMchCheck.getCardFrontPic());
+        // 法人身份证人像面
+        request.put("legal_cert_back_pic", tHuifuMchCheck.getCertBackPic());
+        // 法人身份证国徽面
+        request.put("legal_cert_front_pic", tHuifuMchCheck.getCertFrontPic());
+        // 结算卡信息配置
+        JSONObject cardInfo = new JSONObject();
+        // 卡户名
+        cardInfo.put("card_name", tHuifuMchCheck.getCardName());
+        // 结算账号
+        cardInfo.put("card_no", tHuifuMchCheck.getCardNo());
+        // 银行所在省
+        cardInfo.put("prov_id", tHuifuMchCheck.getCardProvId());
+        // 银行所在市
+        cardInfo.put("area_id", tHuifuMchCheck.getCardAreaId());
+        // 持卡人证件类型
+        cardInfo.put("cert_type", "00");
+        // 持卡人证件号码
+        cardInfo.put("cert_no", tHuifuMchCheck.getCertNo());
+        // 持卡人证件有效期类型,1:长期有效,0:非长期有效;
+        cardInfo.put("cert_validity_type", tHuifuMchCheck.getCertValidityType());
+        // 持卡人证件有效期开始
+        cardInfo.put("cert_begin_date", tHuifuMchCheck.getCertBeginDate());
+        // 持卡人证件有效期截止日期
+        if (StrUtil.isNotEmpty(tHuifuMchCheck.getCertEndDate())) {
+            cardInfo.put("cert_end_date", tHuifuMchCheck.getCertEndDate());
+        }
+        // 结算人手机号
+        cardInfo.put("mp", tHuifuMchCheck.getMp());
+        request.put("card_info", cardInfo);
+        // 结算规则配置
+        JSONObject settleConfig = new JSONObject();
+        // 结算周期
+        settleConfig.put("settle_cycle", "T1");
+        request.put("settle_config", settleConfig);
+
+        // 签名:sign
+        String s = JSON.toJSONString(request);
+        String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
+        String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
+
+        // 公共参数
+        System.out.println("请求参数:"+ request);
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+
+        String result = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        JSONObject dataObject = jsonObject.getJSONObject("data");
+        String code = dataObject.getString("resp_code");
+        if(code.equals("90000000")) {
+            THuifuMch tHuifuMch = new THuifuMch();
+            BeanUtil.copyProperties(tHuifuMchCheck, tHuifuMch);
+            String huifuId = dataObject.getString("huifu_id");
+            // 判断持卡人证件有效期类型,1:长期有效,0:非长期有效
+            if(tHuifuMchCheck.getCertValidityType().equals("0")) {
+                LocalDate date = LocalDate.parse(tHuifuMchCheck.getCertEndDate(), DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String certEndDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                tHuifuMch.setCertDate(certEndDate);
+            } else {
+                tHuifuMch.setCertDate("长期");
+            }
+            tHuifuMch.setCreateDate(new Date());
+            tHuifuMch.setModifyDate(new Date());
+            tHuifuMch.setHuifuId(huifuId);
+            tHuifuMchCheck.setStatus("2");
+            tHuifuMchCheck.setHuifuId(huifuId);
+            tHuifuMchService.save(tHuifuMch);
+            tHuifuMchCheckService.updateById(tHuifuMchCheck);
+            return "success";
+        }else {
+            String respDesc = dataObject.getString("resp_desc");
+            tHuifuMchCheck.setStatus("3");
+            tHuifuMchCheck.setAuditDesc(respDesc);
+            tHuifuMchCheckService.updateById(tHuifuMchCheck);
+            return respDesc;
+        }
+    }
+
+    /**
+     * 汇付企业商户入驻
+     * @param tHuifuMchCheck
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public String addEnterprise(THuifuMchCheck tHuifuMchCheck) throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/basicdata/ent";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        // 请求流水号
+        request.put("req_seq_id", HuifuUtils.initReqSeqId());
+        // 请求日期
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        // 上级主体ID
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        // 商户名称
+        request.put("reg_name", tHuifuMchCheck.getRegName());
+        // 商户简称
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getShortName())) {
+            request.put("short_name", tHuifuMchCheck.getShortName());
+        }
+        // 公司类型
+        request.put("ent_type", "3");
+        // 营业执照编号
+        request.put("license_code", tHuifuMchCheck.getLicenseCode());
+        // 营业执照有效期类型,0:非长期有效 ,1:长期有效
+        request.put("license_validity_type", tHuifuMchCheck.getLicenseValidityType());
+        // 营业执照有效期开始日期
+        request.put("license_begin_date", "20151208");
+        // 营业执照有效期截止日期
+        if (StrUtil.isNotEmpty(tHuifuMchCheck.getLicenseEndDate())) {
+            request.put("license_end_date", tHuifuMchCheck.getLicenseEndDate());
+        }
+        // 注册省
+        request.put("reg_prov_id", tHuifuMchCheck.getRegProvId());
+        // 注册市
+        request.put("reg_area_id", tHuifuMchCheck.getRegAreaId());
+        // 注册区
+        request.put("reg_district_id", tHuifuMchCheck.getRegDistrictId());
+        // 注册详细地址
+        request.put("reg_detail", tHuifuMchCheck.getRegDetail());
+        // 法人姓名
+        request.put("legal_name", tHuifuMchCheck.getName());
+        // 法人证件类型
+        request.put("legal_cert_type", "00");
+        // 法人证件号码
+        request.put("legal_cert_no", tHuifuMchCheck.getCertNo());
+        // 法人证件有效期类型,1:长期有效;0:非长期有效 ;
+        request.put("legal_cert_validity_type", tHuifuMchCheck.getCertValidityType());
+        // 法人证件有效期开始日期
+        request.put("legal_cert_begin_date", tHuifuMchCheck.getCertBeginDate());
+        // 法人证件有效期截止日期
+        if (StrUtil.isNotEmpty(tHuifuMchCheck.getCertEndDate())) {
+            request.put("legal_cert_end_date", tHuifuMchCheck.getCertEndDate());
+        }
+        // 经营省
+        request.put("prov_id", tHuifuMchCheck.getProvId());
+        // 经营市
+        request.put("area_id", tHuifuMchCheck.getAreaId());
+        // 经营区
+        request.put("district_id", tHuifuMchCheck.getDistrictId());
+        // 经营详细地址
+        request.put("detail_addr", tHuifuMchCheck.getDetailAddr());
+        // 联系人姓名
+        request.put("contact_name", tHuifuMchCheck.getRegName());
+        // 联系人手机号
+        request.put("contact_mobile_no", tHuifuMchCheck.getPhone());
+        // 联系人电子邮箱
+        request.put("contact_email", tHuifuMchCheck.getEmail());
+        // 客服电话
+        request.put("service_phone", tHuifuMchCheck.getServicePhone());
+        // 经营类型,1:实体,2:虚拟 ;
+        request.put("busi_type", "1");
+        // 小票名称
+        request.put("receipt_name", tHuifuMchCheck.getRegName());
+        // 所属行业
+        request.put("mcc", "6071");
+        // 基本存款账户编号或核准号
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getOpenLicenceNo())){
+            request.put("open_licence_no", tHuifuMchCheck.getOpenLicenceNo());
+        }
+        // 开户许可证
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getRegAcctPic())){
+            request.put("reg_acct_pic", tHuifuMchCheck.getRegAcctPic());
+        }
+        if(tHuifuMchCheck.getCardType().equals("1")) {
+            // 结算卡正面
+            request.put("settle_card_front_pic", tHuifuMchCheck.getCardFrontPic());
+            // 法人身份证人像面
+            request.put("settle_cert_back_pic", tHuifuMchCheck.getCertBackPic());
+            // 法人身份证国徽面
+            request.put("settle_cert_front_pic", tHuifuMchCheck.getCertFrontPic());
+        } else {
+            // 法人身份证人像面
+            request.put("legal_cert_back_pic", tHuifuMchCheck.getCertBackPic());
+            // 法人身份证国徽面
+            request.put("legal_cert_front_pic", tHuifuMchCheck.getCertFrontPic());
+        }
+        // 营业执照图片
+        request.put("license_pic", tHuifuMchCheck.getLicensePic());
+        // 成立时间
+        request.put("found_date", tHuifuMchCheck.getFoundDate());
+        // 法人手机号
+        request.put("legal_mobile_no", tHuifuMchCheck.getPhone());
+        // 法人身份证地址
+        request.put("legal_addr", tHuifuMchCheck.getCertAddress());
+        // 结算卡信息配置
+        JSONObject cardInfo = new JSONObject();
+        // 结算账户类型
+        cardInfo.put("card_type", tHuifuMchCheck.getCardType());
+        // 卡户名
+        cardInfo.put("card_name", tHuifuMchCheck.getCardName());
+        // 结算账号
+        cardInfo.put("card_no", tHuifuMchCheck.getCardNo());
+        // 银行所在省
+        if (StrUtil.isNotEmpty(tHuifuMchCheck.getCardProvId())) {
+            cardInfo.put("prov_id", tHuifuMchCheck.getCardProvId());
+        }
+        // 银行所在市
+        if (StrUtil.isNotEmpty(tHuifuMchCheck.getCardAreaId())) {
+            cardInfo.put("area_id", tHuifuMchCheck.getCardAreaId());
+        }
+        // 联行号
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getBranchCode())){
+            cardInfo.put("branch_code", tHuifuMchCheck.getBranchCode());
+        }
+        if(StrUtil.isNotEmpty(tHuifuMchCheck.getMp())){
+            cardInfo.put("mp", tHuifuMchCheck.getMp());
+        }
+        request.put("card_info", cardInfo);
+        // 结算规则配置
+        JSONObject settleConfig = new JSONObject();
+        // 结算周期
+        settleConfig.put("settle_cycle", "T1");
+        request.put("settle_config", settleConfig);
+
+        // 签名:sign
+        String s = JSON.toJSONString(request);
+        String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
+        String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
+
+        // 公共参数
+        System.out.println("请求参数:"+ request);
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+        System.out.println("请求体:"+ requestData);
+
+        String result = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        JSONObject dataObject = jsonObject.getJSONObject("data");
+        String code = dataObject.getString("resp_code");
+        if(code.equals("90000000")) {
+            THuifuMch tHuifuMch = new THuifuMch();
+            BeanUtil.copyProperties(tHuifuMchCheck, tHuifuMch);
+            String huifuId = dataObject.getString("huifu_id");
+            // 判断持卡人证件有效期类型,1:长期有效,0:非长期有效
+            if(tHuifuMchCheck.getCertValidityType().equals("0")) {
+                LocalDate date = LocalDate.parse(tHuifuMchCheck.getCertEndDate(), DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String certEndDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                tHuifuMch.setCertDate(certEndDate);
+            } else {
+                tHuifuMch.setCertDate("长期");
+            }
+            tHuifuMch.setCreateDate(new Date());
+            tHuifuMch.setModifyDate(new Date());
+            tHuifuMch.setHuifuId(huifuId);
+            tHuifuMchCheck.setStatus("2");
+            tHuifuMchCheck.setHuifuId(huifuId);
+            tHuifuMchService.save(tHuifuMch);
+            tHuifuMchCheckService.updateById(tHuifuMchCheck);
+            return "success";
+        }else {
+            String respDesc = dataObject.getString("resp_desc");
+            tHuifuMchCheck.setStatus("3");
+            tHuifuMchCheck.setAuditDesc(respDesc);
+            tHuifuMchCheckService.updateById(tHuifuMchCheck);
+            return respDesc;
+        }
+    }
+
+    /**
+     * 汇付商户基本信息修改
+     * @param huifuMchCheck
+     * @return
+     */
+    @Override
+    public String updateMerchant(THuifuMchCheck huifuMchCheck) throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/basicdata/modify";
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        // 请求流水号
+        request.put("req_seq_id", HuifuUtils.initReqSeqId());
+        // 请求日期
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        // 上级主体ID
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        // 汇付客户Id
+        request.put("huifu_id", huifuMchCheck.getHuifuId());
+        // 商户名称
+        request.put("reg_name", huifuMchCheck.getRegName());
+        // 商户简称
+        if(StrUtil.isNotEmpty(huifuMchCheck.getShortName())) {
+            request.put("short_name", huifuMchCheck.getShortName());
+        }
+        // 经营省
+        request.put("prov_id", huifuMchCheck.getProvId());
+        // 经营市
+        request.put("area_id", huifuMchCheck.getAreaId());
+        // 经营区
+        request.put("district_id", huifuMchCheck.getDistrictId());
+        // 经营详细地址
+        request.put("detail_addr", huifuMchCheck.getDetailAddr());
+        // 联系人姓名
+        request.put("contact_name", huifuMchCheck.getRegName());
+        // 联系人手机号
+        request.put("contact_mobile_no", huifuMchCheck.getPhone());
+        // 联系人电子邮箱
+        request.put("contact_email", huifuMchCheck.getEmail());
+//        // 联系人电子邮箱
+//        request.put("async_return_url", "http://598ef306.r10.cpolar.top/tHuifuMch/auditNotify");
+        // 取现信息配置
+        JSONObject cardInfo = new JSONObject();
+        cardInfo.put("card_type", huifuMchCheck.getCardType());
+        cardInfo.put("card_name", huifuMchCheck.getCardName());
+        cardInfo.put("card_no", huifuMchCheck.getCardNo());
+        if(StrUtil.isNotEmpty(huifuMchCheck.getCardProvId())) {
+            cardInfo.put("prov_id", huifuMchCheck.getCardProvId());
+        }
+        if(StrUtil.isNotEmpty(huifuMchCheck.getCardAreaId())) {
+            cardInfo.put("area_id", huifuMchCheck.getCardAreaId());
+        }
+        cardInfo.put("cert_type", "00");
+        cardInfo.put("cert_no", huifuMchCheck.getCertNo());
+        cardInfo.put("cert_validity_type", huifuMchCheck.getCertValidityType());
+        cardInfo.put("cert_begin_date", huifuMchCheck.getCertBeginDate());
+        cardInfo.put("cert_end_date", huifuMchCheck.getCertEndDate());
+        if(StrUtil.isNotEmpty(huifuMchCheck.getMp())) {
+            cardInfo.put("mp", huifuMchCheck.getMp());
+        }
+        cardInfo.put("settle_card_front_pic", huifuMchCheck.getCardFrontPic());
+        cardInfo.put("settle_cert_front_pic", huifuMchCheck.getCertBackPic());
+        cardInfo.put("settle_cert_back_pic", huifuMchCheck.getCertFrontPic());
+        cardInfo.put("legal_cert_front_pic", huifuMchCheck.getCertBackPic());
+        cardInfo.put("legal_cert_back_pic", huifuMchCheck.getCertFrontPic());
+        if(StrUtil.isNotEmpty(huifuMchCheck.getSms())) {
+            cardInfo.put("verify_code", huifuMchCheck.getSms());
+        }
+        request.put("card_info", cardInfo);
+//        request.put("legal_cert_front_pic", huifuMchCheck.getCertBackPic());
+//        request.put("legal_cert_back_pic", huifuMchCheck.getCertFrontPic());
+        // 签名:sign
+        String s = JSON.toJSONString(request);
+        String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
+        String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
+
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+        System.out.println("请求体:"+ requestData);
+
+        String result = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ result);
+        JSONObject jsonObject = JSONObject.parseObject(result);
+        JSONObject dataObject = jsonObject.getJSONObject("data");
+        String code = dataObject.getString("resp_code");
+        if(code.equals("90000000")) {
+            LambdaQueryWrapper<THuifuMch> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.eq(THuifuMch::getAdminId,huifuMchCheck.getAdminId());
+            THuifuMch tHuifuMch = tHuifuMchService.getOne(queryWrapper);
+            // 排除掉不复制的属性
+            String[] ignoreProperties = {"id", "createDate","adminId","huifuId"};
+            BeanUtil.copyProperties(huifuMchCheck, tHuifuMch, ignoreProperties);
+            // 判断持卡人证件有效期类型,1:长期有效,0:非长期有效
+            if(huifuMchCheck.getCertValidityType().equals("0")) {
+                LocalDate date = LocalDate.parse(huifuMchCheck.getCertEndDate(), DateTimeFormatter.ofPattern("yyyyMMdd"));
+                String certEndDate = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+                tHuifuMch.setCertDate(certEndDate);
+            } else {
+                tHuifuMch.setCertDate("长期");
+            }
+            tHuifuMch.setModifyDate(new Date());
+            huifuMchCheck.setStatus("2");
+            huifuMchCheck.setSms(null);
+            tHuifuMchService.updateById(tHuifuMch);
+            tHuifuMchCheckService.updateById(huifuMchCheck);
+            return "success";
+        }else {
+            String respDesc = dataObject.getString("resp_desc");
+            huifuMchCheck.setStatus("3");
+            huifuMchCheck.setSms(null);
+            huifuMchCheck.setAuditDesc(respDesc);
+            tHuifuMchCheckService.updateById(huifuMchCheck);
+            return respDesc;
+        }
+    }
+
+    /**
+     * 汇付上传图片
+     * @param file
+     * @return
+     */
+    @Override
+    public String uploadPic(MultipartFile file, HuifuConstant.fileType fileType) {
+        String url = "https://api.huifu.com/v2/supplementary/picture";
+        // 请求参数
+        Map<String, Object> params = new HashMap<String, Object>();
+        // 请求流水号,需保证当天商户下唯一,推荐采用日期时间+几位流水号的形式
+        params.put("req_seq_id", SequenceTools.getReqSeqId32());
+        params.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        params.put("file_type", fileType);
+        params.put("picture", fileType.toValue());
+        String data = JSON.toJSONString(params);
+
+
+        CloseableHttpClient httpclient1 = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String result = null;
+
+        try {
+            // 获取原始文件名
+            String fileName = file.getOriginalFilename();
+            // 取得文件扩展名
+            String extension = fileName.substring(fileName.lastIndexOf("."));
+            // 创建临时文件
+            File tempFile = File.createTempFile("temp", extension);
+            file.transferTo(tempFile);
+
+            HttpPost httpPost = new HttpPost(url);
+            ContentType contentType = ContentType.create("text/plain", Charset.forName("UTF-8"));
+            MultipartEntityBuilder mEntityBuilder = MultipartEntityBuilder.create();
+            mEntityBuilder.addTextBody("sys_id", HuifuConstant.SYS_ID, contentType);
+            mEntityBuilder.addTextBody("product_id", HuifuConstant.PRODUCT_ID, contentType);
+            mEntityBuilder.addTextBody("data", data, contentType);
+            mEntityBuilder.addBinaryBody("file", tempFile);
+
+            httpPost.setEntity(mEntityBuilder.build());
+            response = httpclient1.execute(httpPost);
+            int statusCode = response.getStatusLine().getStatusCode();
+            if (statusCode == HttpStatus.SC_OK) {
+                HttpEntity resEntity = response.getEntity();
+                result = EntityUtils.toString(resEntity);
+                System.out.print(result);
+                JSONObject jsonObject = JSONObject.parseObject(result);
+                JSONObject dataObject = jsonObject.getJSONObject("data");
+                result = dataObject.getString("file_id");
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return result;
+
+    }
+
+    @Override
+    public String refund(String sn, BigDecimal price, String payDate, String remark, String acctSplitBunch) throws Exception {
+        String url = "https://api.huifu.com/v2/trade/payment/scanpay/refund";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", HuifuUtils.initReqSeqId());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", HuifuConstant.DIV_HUIFU_ID);
+        request.put("ord_amt", price);
+        request.put("org_req_date", payDate);
+        request.put("org_req_seq_id", sn);
+        // 分账明细
+        request.put("acct_split_bunch", acctSplitBunch);
+        request.put("notify_url", HuifuConstant.Notify_Refund_Url);
+
+
+        // 签名:sign
+        String s = JSON.toJSONString(request);
+        String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
+        String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
+
+        // 公共参数
+        System.out.println("请求参数:"+ request);
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+        log.info("退款请求参数:{}", requestData);
+        String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ success);
+        // 拿到返回参数
+        JSONObject result = JSONObject.parseObject(success);
+        log.info("汇付返回参数:{}", result);
+        JSONObject data = result.getJSONObject("data");
+        String transStat = data.getString("trans_stat");
+        String respCode = data.getString("resp_code");
+        String respDesc = data.getString("resp_desc");
+        if(respCode.equals("00000000") || respCode.equals("00000100")) {
+            return transStat;
+        } else {
+            return respDesc;
+        }
+    }
+
+    @Override
+    public String sendSms(THuifuMch tHuifuMch) throws Exception {
+        String url = "https://api.huifu.com/v2/merchant/basicdata/sms/send";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", HuifuUtils.initReqSeqId());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", tHuifuMch.getHuifuId());
+        request.put("phone", tHuifuMch.getPhone());
+        request.put("verify_type", "settleBankChange");
+
+
+        // 签名:sign
+        String s = JSON.toJSONString(request);
+        String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
+        String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
+
+        // 公共参数
+        System.out.println("请求参数:"+ request);
+        JSONObject requestData = new JSONObject();
+        requestData.put("sys_id", HuifuConstant.SYS_ID);
+        requestData.put("product_id", HuifuConstant.PRODUCT_ID);
+        requestData.put("sign", sign);
+        requestData.put("data", request);
+        System.out.println("请求体:"+ requestData);
+
+        String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ success);
+        // 拿到返回参数
+        JSONObject result = JSONObject.parseObject(success);
+        log.info("汇付返回参数:{}", result);
+        JSONObject data = result.getJSONObject("data");
+        String respCode = data.getString("resp_code");
+        return respCode;
+    }
+}

+ 3 - 0
src/main/java/com/szwl/service/impl/TOrderServiceImpl.java

@@ -8,6 +8,7 @@ import com.szwl.model.utils.Constant;
 import com.szwl.model.utils.HttpClientUtils;
 import com.szwl.service.TOrderService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.codec.digest.DigestUtils;
 import org.apache.http.message.BasicNameValuePair;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -29,6 +30,7 @@ import java.util.*;
  * @author wuhs
  * @since 2022-04-23
  */
+@Slf4j
 @Service
 public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> implements TOrderService {
     @Autowired
@@ -117,6 +119,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         String result = HttpClientUtils.postKeyValue(url, data);
 
         JSONObject resultJson = JSONObject.parseObject(result);
+        log.info("汇聚返回参数:{}", resultJson);
         System.out.println(result);
         return resultJson.getString("rc_CodeMsg");
     }

+ 80 - 0
src/main/java/com/szwl/util/HuifuUtils.java

@@ -0,0 +1,80 @@
+package com.szwl.util;
+
+import cn.hutool.core.util.RandomUtil;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import com.huifu.bspay.sdk.opps.core.utils.RandomTools;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+@Slf4j
+public class HuifuUtils {
+
+    /**
+     * RSA私钥签名:签名方式SHA256WithRSA
+     * @param data 待签名字符串
+     * @param privateKeyBase64 私钥(Base64编码)
+     * @return 签名byte[]
+     * @throws Exception
+     */
+    public static String sign(String data, String privateKeyBase64) {
+        // Base64 --> Key
+        try {
+            byte[] bytes = Base64.getDecoder().decode(privateKeyBase64);
+            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes);
+            KeyFactory keyFactory;
+            keyFactory = KeyFactory.getInstance("RSA");
+            PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
+            // Sign
+            Signature signature = Signature.getInstance("SHA256WithRSA");
+            signature.initSign(privateKey);
+            signature.update(data.getBytes("UTF-8"));
+            return Base64.getEncoder().encodeToString(signature.sign());
+        } catch (Exception e) {
+            return null;
+        }
+    }
+
+    /**
+     * 使用汇付RSA公钥验签
+     * @param data 待签名字符串
+     * @param publicKeyBase64 公钥(Base64编码)
+     * @return 验签结果
+     * @throws Exception
+     */
+    public static boolean verify(String data, String publicKeyBase64, String sign) {
+        // Base64 --> Key
+        try {
+            byte[] bytes = Base64.getDecoder().decode(publicKeyBase64);
+            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes);
+            KeyFactory keyFactory;
+            keyFactory = KeyFactory.getInstance("RSA");
+            PublicKey publicKey = keyFactory.generatePublic(keySpec);
+            // verify
+            Signature signature = Signature.getInstance("SHA256WithRSA");
+            signature.initVerify(publicKey);
+            signature.update(data.getBytes("UTF-8"));
+            return signature.verify(Base64.getDecoder().decode(sign));
+        } catch (Exception e) {
+            log.error("Exception", e);
+            return false;
+        }
+
+    }
+
+    /**
+     * 生成随机流水号
+     * @return
+     */
+    public static String initReqSeqId() {
+        String numbers = RandomUtil.randomNumbers(10);
+        return new StringBuilder(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers).toString();
+    }
+}