Jelajahi Sumber

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

soobin 2 tahun lalu
induk
melakukan
1b6931b2ad
31 mengubah file dengan 3199 tambahan dan 1275 penghapusan
  1. 5 0
      pom.xml
  2. 57 0
      src/main/java/com/szwl/common/HuifuBaseCommon.java
  3. 33 0
      src/main/java/com/szwl/config/OppsMerchantConfig.java
  4. 321 0
      src/main/java/com/szwl/constant/HuifuConstant.java
  5. 21 0
      src/main/java/com/szwl/controller/THuifuMchController.java
  6. 21 0
      src/main/java/com/szwl/controller/THuifuTempOrderController.java
  7. 1043 1266
      src/main/java/com/szwl/controller/TOrderController.java
  8. 47 0
      src/main/java/com/szwl/controller/TOrderDetailsController.java
  9. 8 0
      src/main/java/com/szwl/feign/bean/SzwlFeign.java
  10. 16 0
      src/main/java/com/szwl/mapper/THuifuMchMapper.java
  11. 16 0
      src/main/java/com/szwl/mapper/THuifuTempOrderMapper.java
  12. 16 0
      src/main/java/com/szwl/mapper/TOrderDetailsMapper.java
  13. 32 0
      src/main/java/com/szwl/mapper/xml/THuifuMchMapper.xml
  14. 41 0
      src/main/java/com/szwl/mapper/xml/THuifuTempOrderMapper.xml
  15. 28 0
      src/main/java/com/szwl/mapper/xml/TOrderDetailsMapper.xml
  16. 4 1
      src/main/java/com/szwl/mapper/xml/TOrderMapper.xml
  17. 15 0
      src/main/java/com/szwl/model/dto/OrderDetailsDTO.java
  18. 1 1
      src/main/java/com/szwl/model/entity/TAdmin.java
  19. 80 0
      src/main/java/com/szwl/model/entity/THuifuMch.java
  20. 111 0
      src/main/java/com/szwl/model/entity/THuifuTempOrder.java
  21. 6 0
      src/main/java/com/szwl/model/entity/TOrder.java
  22. 72 0
      src/main/java/com/szwl/model/entity/TOrderDetails.java
  23. 53 0
      src/main/java/com/szwl/service/THuifuMchService.java
  24. 16 0
      src/main/java/com/szwl/service/THuifuTempOrderService.java
  25. 16 0
      src/main/java/com/szwl/service/TOrderDetailsService.java
  26. 259 0
      src/main/java/com/szwl/service/impl/THuifuMchServiceImpl.java
  27. 20 0
      src/main/java/com/szwl/service/impl/THuifuTempOrderServiceImpl.java
  28. 20 0
      src/main/java/com/szwl/service/impl/TOrderDetailsServiceImpl.java
  29. 97 0
      src/main/java/com/szwl/utils/HuifuUtils.java
  30. 9 0
      src/main/resources/bootstrap.yml
  31. 715 7
      src/test/java/com/szwl/ApplicationTests.java

+ 5 - 0
pom.xml

@@ -151,6 +151,11 @@
 			<artifactId>hutool-core</artifactId>
 			<version>5.7.16</version>
 		</dependency>
+		<dependency>
+			<groupId>cn.hutool</groupId>
+			<artifactId>hutool-http</artifactId>
+			<version>5.7.16</version>
+		</dependency>
 		<!--生成二维码-->
 		<dependency>
 			<groupId>com.google.zxing</groupId>

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

@@ -0,0 +1,57 @@
+package com.szwl.common;
+
+import com.huifu.bspay.sdk.opps.client.BasePayClient;
+import com.huifu.bspay.sdk.opps.core.BasePay;
+import com.huifu.bspay.sdk.opps.core.config.MerConfig;
+import com.huifu.bspay.sdk.opps.core.request.BaseRequest;
+
+import java.io.File;
+import java.util.Map;
+
+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);
+    }
+
+    /***
+     * @Description: 执行API调用
+     * @param request
+     * @throws Exception  Map<String,Object>
+     * @date: 2021年7月5日17:59:37
+     */
+    public static Map<String, Object> doExecute(BaseRequest request) throws Exception {
+        return BasePayClient.request(request, false);
+    }
+
+    /***
+     * @Description: 执行API调用
+     * @param request 请求参数
+     * @param isPage 是否是页面版本
+     * @throws Exception  Map<String,Object>
+     * @date: 2021年11月12日15:13:56
+     */
+    public static Map<String, Object> doExecute(BaseRequest request, boolean isPage) throws Exception {
+        return BasePayClient.request(request, isPage);
+    }
+
+    /**
+     * 执行API调用
+     *
+     * @param request 请求参数
+     * @param file    待上传文件
+     * @return
+     * @throws Exception
+     */
+    public static Map<String, Object> doExecute(BaseRequest request, File file) throws Exception {
+        return BasePayClient.upload(request, file);
+    }
+
+//    public static final String REQUEST_SUCC_CODE = "00000000";
+}

+ 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 ditekan karena terlalu besar
+ 321 - 0
src/main/java/com/szwl/constant/HuifuConstant.java


+ 21 - 0
src/main/java/com/szwl/controller/THuifuMchController.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-17
+ */
+@RestController
+@RequestMapping("/tHuifuMch")
+public class THuifuMchController {
+
+}
+

+ 21 - 0
src/main/java/com/szwl/controller/THuifuTempOrderController.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-27
+ */
+@RestController
+@RequestMapping("/tHuifuTempOrder")
+public class THuifuTempOrderController {
+
+}
+

File diff ditekan karena terlalu besar
+ 1043 - 1266
src/main/java/com/szwl/controller/TOrderController.java


+ 47 - 0
src/main/java/com/szwl/controller/TOrderDetailsController.java

@@ -0,0 +1,47 @@
+package com.szwl.controller;
+
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.TOrderDetails;
+import com.szwl.service.TOrderDetailsService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 订单明细表 前端控制器
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-31
+ */
+@RestController
+@RequestMapping("/tOrderDetails")
+public class TOrderDetailsController {
+
+    @Autowired
+    private TOrderDetailsService orderDetailsService;
+
+    @ApiOperation(value = "获取订单明细")
+    @GetMapping("/getOrderDetailsBySn")
+    public ResponseModel<List<TOrderDetails>> getOrderDetailsBySn(@RequestParam String sn){
+        LambdaQueryWrapper<TOrderDetails> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(TOrderDetails::getOrderSn,sn);
+        List<TOrderDetails> orderDetails = orderDetailsService.list(queryWrapper);
+        return R.ok(orderDetails);
+    }
+
+    @ApiOperation(value = "修改订单明细")
+    @PostMapping("/updateOrderDetails")
+    public ResponseModel<?> updateOrderDetails(@RequestBody TOrderDetails orderDetails) {
+        orderDetailsService.updateById(orderDetails);
+        return R.ok();
+    }
+
+}
+

+ 8 - 0
src/main/java/com/szwl/feign/bean/SzwlFeign.java

@@ -53,5 +53,13 @@ public interface SzwlFeign {
     @GetMapping("/tPromoCode/addPromoCode")
     void addPromoCode(@RequestParam(value = "adminId")String adminId, @RequestParam(value = "lastUseDate")Date lastUseDate, @RequestParam(value = "number")int number);
     //同步订单到es中
+
+    /**
+     * 获取汇付商户号
+     * @param adminId
+     * @return
+     */
+    @GetMapping("/tHuifuMch/getHuifuId")
+    ResponseModel<THuifuMch> getHuifuId(@RequestParam Long adminId);
     
 }

+ 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-17
+ */
+public interface THuifuMchMapper extends BaseMapper<THuifuMch> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.THuifuTempOrder;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 汇付订单临时表 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-27
+ */
+public interface THuifuTempOrderMapper extends BaseMapper<THuifuTempOrder> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.szwl.mapper;
+
+import com.szwl.model.entity.TOrderDetails;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 订单明细表 Mapper 接口
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-31
+ */
+public interface TOrderDetailsMapper extends BaseMapper<TOrderDetails> {
+
+}

+ 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>

+ 41 - 0
src/main/java/com/szwl/mapper/xml/THuifuTempOrderMapper.xml

@@ -0,0 +1,41 @@
+<?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.THuifuTempOrderMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.THuifuTempOrder">
+        <id column="id" property="id" />
+        <result column="sn" property="sn" />
+        <result column="create_date" property="createDate" />
+        <result column="price" property="price" />
+        <result column="acct_split_bunch" property="acctSplitBunch" />
+        <result column="product_name" property="productName" />
+        <result column="product_no" property="productNo" />
+        <result column="product_number" property="productNumber" />
+        <result column="admin_id" property="adminId" />
+        <result column="admin_proportion" property="adminProportion" />
+        <result column="agency_id" property="agencyId" />
+        <result column="agency_proportion" property="agencyProportion" />
+        <result column="alt_info" property="altInfo" />
+        <result column="client_id" property="clientId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="frp_code" property="frpCode" />
+        <result column="merchant_id" property="merchantId" />
+        <result column="merchant_proportion" property="merchantProportion" />
+        <result column="personage_id" property="personageId" />
+        <result column="personage_proportion" property="personageProportion" />
+        <result column="status" property="status" />
+        <result column="type" property="type" />
+        <result column="note" property="note" />
+        <result column="pay_platform" property="payPlatform" />
+        <result column="proportion_desc" property="proportionDesc" />
+        <result column="order_status" property="orderStatus" />
+        <result column="company_type" property="companyType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        sn, id, create_date, price, acct_split_bunch, product_name, product_no, product_number, admin_id, admin_proportion, agency_id, agency_proportion, alt_info, client_id, equipment_id, frp_code, merchant_id, merchant_proportion, personage_id, personage_proportion, status, type, note, pay_platform, proportion_desc, order_status, company_type
+    </sql>
+
+</mapper>

+ 28 - 0
src/main/java/com/szwl/mapper/xml/TOrderDetailsMapper.xml

@@ -0,0 +1,28 @@
+<?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.TOrderDetailsMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.szwl.model.entity.TOrderDetails">
+        <id column="id" property="id" />
+        <result column="admin_id" property="adminId" />
+        <result column="equipment_id" property="equipmentId" />
+        <result column="create_date" property="createDate" />
+        <result column="order_sn" property="orderSn" />
+        <result column="product_no" property="productNo" />
+        <result column="product_name" property="productName" />
+        <result column="product_number" property="productNumber" />
+        <result column="price" property="price" />
+        <result column="amount" property="amount" />
+        <result column="refund_quantity" property="refundQuantity" />
+        <result column="refund_amout" property="refundAmout" />
+        <result column="refund_status" property="refundStatus" />
+        <result column="company_type" property="companyType" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, admin_id, equipment_id, create_date, order_sn, product_no, product_name, product_number, price, amount, refund_quantity, refund_amout, refund_status, company_type
+    </sql>
+
+</mapper>

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

@@ -44,6 +44,8 @@
         <result column="product_number" property="productNumber" />
         <result column="refund_order_no" property="refundOrderNo" />
         <result column="company_type" property="companyType" />
+        <result column="acct_split_bunch" property="acctSplitBunch" />
+        <result column="refund_quantity" property="refundQuantity" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
@@ -54,7 +56,8 @@
         product_id, product_desc, product_name, product_no, refund_date, sn, status,
         type, trx_no, refund_trx_no, es, refund_amount, note, pay_platform, is_settlement,
         wx_id, proportion_desc, marketing_amount, coupons, refund_marketing_amount,
-        order_status, product_number, refund_order_no, company_type
+        order_status, product_number, refund_order_no, company_type, acct_split_bunch,
+        refund_quantity
     </sql>
 
 </mapper>

+ 15 - 0
src/main/java/com/szwl/model/dto/OrderDetailsDTO.java

@@ -0,0 +1,15 @@
+package com.szwl.model.dto;
+
+import com.szwl.model.entity.TOrder;
+import com.szwl.model.entity.TOrderDetails;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class OrderDetailsDTO extends TOrder {
+
+    @ApiModelProperty(value = "汇付分账明细")
+    private List<TOrderDetails> orderDetails;
+}

+ 1 - 1
src/main/java/com/szwl/model/entity/TAdmin.java

@@ -102,7 +102,7 @@ public class TAdmin implements Serializable {
     @ApiModelProperty(value = "短信验证码;")
     private String code;
 
-    @ApiModelProperty(value = "支付平台; 0或null为汇聚,1为杉德支付")
+    @ApiModelProperty(value = "支付平台; 0或null为汇聚,1为汇付支付")
     private String payPlatform;
 
     @ApiModelProperty(value = "关联商家,相当于以前的parent_id")

+ 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-17
+ */
+@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;
+
+
+}

+ 111 - 0
src/main/java/com/szwl/model/entity/THuifuTempOrder.java

@@ -0,0 +1,111 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+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-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="THuifuTempOrder对象", description="汇付订单临时表")
+public class THuifuTempOrder implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "订单编号")
+    private String sn;
+
+    @ApiModelProperty(value = "订单唯一ID")
+    @TableId(value = "id", type = IdType.ASSIGN_ID)
+    private String id;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createDate;
+
+    @ApiModelProperty(value = "订单金额")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "汇付分账明细")
+    private String acctSplitBunch;
+
+    @ApiModelProperty(value = "商品名称")
+    private String productName;
+
+    @ApiModelProperty(value = "商品编号")
+    private String productNo;
+
+    @ApiModelProperty(value = "商品数量")
+    private Integer productNumber;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long adminId;
+
+    @ApiModelProperty(value = "平台分账")
+    private BigDecimal adminProportion;
+
+    @ApiModelProperty(value = "一级分销商户ID")
+    private Long agencyId;
+
+    @ApiModelProperty(value = "一级分账比例")
+    private BigDecimal agencyProportion;
+
+    @ApiModelProperty(value = "分销逻辑")
+    private String altInfo;
+
+    @ApiModelProperty(value = "设备编号")
+    private String clientId;
+
+    @ApiModelProperty(value = "设备ID")
+    private Long equipmentId;
+
+    @ApiModelProperty(value = "支付方式")
+    private String frpCode;
+
+    @ApiModelProperty(value = "二级分销商户ID")
+    private Long merchantId;
+
+    @ApiModelProperty(value = "二级分账比例")
+    private BigDecimal merchantProportion;
+
+    @ApiModelProperty(value = "三级分销商户ID")
+    private Long personageId;
+
+    @ApiModelProperty(value = "三级分账比例")
+    private BigDecimal personageProportion;
+
+    @ApiModelProperty(value = "支付状态")
+    private Integer status;
+
+    @ApiModelProperty(value = "0:分账方2个,1:分账方3个,3:分账方4个,3:分账方超4个")
+    private Integer type;
+
+    @ApiModelProperty(value = "标记")
+    private String note;
+
+    @ApiModelProperty(value = "支付平台  0或null为汇聚,1为杉德支付")
+    private String payPlatform;
+
+    @ApiModelProperty(value = "分账详情,当分账超过4方时,这个字段才启用")
+    private String proportionDesc;
+
+    @ApiModelProperty(value = "订单状态;0:排队中,1:正在制作,2:已制作")
+    private String orderStatus;
+
+    @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
+    private String companyType;
+
+
+}

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

@@ -114,4 +114,10 @@ public class TOrder implements Serializable {
     @ApiModelProperty(value = "公司平台,0或空为申泽,1为七云")
     private String companyType;
 
+    @ApiModelProperty(value = "汇付分账明细")
+    private String acctSplitBunch;
+
+    @ApiModelProperty(value = "退款数量")
+    private Integer refundQuantity;
+
 }

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

@@ -0,0 +1,72 @@
+package com.szwl.model.entity;
+
+import java.math.BigDecimal;
+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-31
+ */
+@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 = "设备ID")
+    private Long equipmentId;
+
+    @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;
+
+
+}

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

@@ -0,0 +1,53 @@
+package com.szwl.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.szwl.model.entity.THuifuMch;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.szwl.model.entity.THuifuTempOrder;
+
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-17
+ */
+public interface THuifuMchService extends IService<THuifuMch> {
+
+    /**
+     * 汇付聚合正扫
+     * @param orderNo 订单编号
+     * @param amount 订单金额
+     * @param productName 商品名称
+     * @param productDesc 商品描述
+     * @param notifyUrl 回调地址
+     * @param frpCode 支付方式
+     * @param openId 微信openId
+     * @param appid 微信appId
+     * @param acctSplitBunch 分账明细
+     * @return
+     */
+    String uniPay(String orderNo, BigDecimal amount, String productName, String productDesc, String notifyUrl, String frpCode, String openId, String appid, JSONObject acctSplitBunch) throws Exception;
+
+    /**
+     * 汇付微信聚合正扫
+     * @param openid
+     * @return
+     */
+    String wetchatPay(THuifuTempOrder huifuTempOrder, String openid) throws Exception;
+
+    /**
+     * 汇付聚合反扫
+     * @param orderNo
+     * @param amount
+     * @param productName
+     * @param notifyUrl
+     * @param authCode
+     * @param acctSplitBunch
+     * @return
+     */
+    String cardPay(String orderNo, BigDecimal amount, String productName, String notifyUrl, String authCode, JSONObject acctSplitBunch) throws Exception;
+}

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

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.THuifuTempOrder;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 汇付订单临时表 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-27
+ */
+public interface THuifuTempOrderService extends IService<THuifuTempOrder> {
+
+}

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

@@ -0,0 +1,16 @@
+package com.szwl.service;
+
+import com.szwl.model.entity.TOrderDetails;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 订单明细表 服务类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-31
+ */
+public interface TOrderDetailsService extends IService<TOrderDetails> {
+
+}

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

@@ -0,0 +1,259 @@
+package com.szwl.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import com.huifu.bspay.sdk.opps.core.utils.OkHttpClientTools;
+import com.szwl.common.HuifuBaseCommon;
+import com.szwl.config.OppsMerchantConfig;
+import com.szwl.constant.HuifuConstant;
+import com.szwl.feign.bean.SzwlFeign;
+import com.szwl.model.bo.R;
+import com.szwl.model.bo.ResponseModel;
+import com.szwl.model.entity.*;
+import com.szwl.mapper.THuifuMchMapper;
+import com.szwl.service.THuifuMchService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.service.THuifuTempOrderService;
+import com.szwl.service.TOrderDetailsService;
+import com.szwl.service.TOrderService;
+import com.szwl.utils.HuifuUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-17
+ */
+@Slf4j
+@Service
+public class THuifuMchServiceImpl extends ServiceImpl<THuifuMchMapper, THuifuMch> implements THuifuMchService {
+
+    @Autowired
+    private THuifuTempOrderService huifuTempOrderService;
+
+    @Autowired
+    TOrderService orderService;
+
+    @Autowired
+    private TOrderDetailsService orderDetailsService;
+
+    @Autowired
+    SzwlFeign szwlFeign;
+
+    @Override
+    public String uniPay(String orderNo, BigDecimal amount, String productName, String productDesc, String notifyUrl, String frpCode, String openId, String appid, JSONObject acctSplitBunch) throws Exception {
+        String url = "https://api.huifu.com/v2/trade/payment/jspay";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", orderNo);
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", HuifuConstant.DIV_HUIFU_ID);
+        if(frpCode.equals("ALIPAY_NATIVE")) {
+            request.put("trade_type", "A_NATIVE");
+        }
+        if(frpCode.equals("WEIXIN_XCX")) {
+            request.put("trade_type", "T_MINIAPP");
+            JSONObject wxData = new JSONObject();
+            wxData.put("sub_appid",HuifuConstant.WX_SUB_APP_ID);
+            wxData.put("open_id",openId);
+            request.put("wx_data", wxData);
+        }
+        request.put("trans_amt", amount);
+        request.put("goods_desc", productName);
+        request.put("notify_url", HuifuConstant.Notify_Url);
+        // 分账明细
+        request.put("acct_split_bunch", acctSplitBunch.toJSONString());
+        // 签名: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 success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        JSONObject result = JSONObject.parseObject(success);
+        JSONObject data = result.getJSONObject("data");
+        String qrCode = data.getString("qr_code");
+        String payInfo = data.getString("pay_info");
+        if(frpCode.equals("ALIPAY_NATIVE")){
+            return qrCode;
+        }
+        if(frpCode.equals("WEIXIN_XCX")) {
+            return payInfo;
+        }
+        return null;
+    }
+
+    @Override
+    public String wetchatPay(THuifuTempOrder huifuTempOrder, String openid) throws Exception {
+        String url = "https://api.huifu.com/v2/trade/payment/jspay";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        String sn = HuifuUtils.initReqSeqId();
+        request.put("req_seq_id", sn);
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", HuifuConstant.DIV_HUIFU_ID);
+        request.put("trade_type", "T_JSAPI");
+        request.put("trans_amt", huifuTempOrder.getPrice());
+        request.put("goods_desc", huifuTempOrder.getProductName());
+        request.put("notify_url", HuifuConstant.Notify_Url);
+        request.put("remark", huifuTempOrder.getId());
+        // 分账明细
+        request.put("acct_split_bunch", huifuTempOrder.getAcctSplitBunch());
+        // 微信支付配置
+        JSONObject wxData = new JSONObject();
+        wxData.put("sub_appid",HuifuConstant.WX_SUB_APP_ID);
+        wxData.put("open_id",openid);
+        request.put("wx_data", wxData);
+        // 签名: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 success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        // 拿到返回参数
+        JSONObject result = JSONObject.parseObject(success);
+        log.info("汇付返回参数:{}", result);
+        JSONObject data = result.getJSONObject("data");
+        String payInfo = data.getString("pay_info");
+        JSONObject payInfoJson = JSONObject.parseObject(payInfo);
+        // 获取timeStamp的值
+        String timeStamp = payInfoJson.getString("timeStamp");
+        // 获取nonceStr的值
+        String nonceStr = payInfoJson.getString("nonceStr");
+        // 获取package的值
+        String packageValue = payInfoJson.getString("package");
+        // 获取paySign的值
+        String paySign = payInfoJson.getString("paySign");
+        // 测试链接:http://szwltest.sunzee.com.cn/shenze
+        String resultUrl = HuifuConstant.JUMP_URL+"/#/popPayment?" +
+                "sn=" + sn +
+                "&timeStamp=" + timeStamp +
+                "&nonceStr=" + nonceStr +
+                "&package=" + packageValue +
+                "&paySign=" + paySign;
+        log.info("微信支付链接:{}", resultUrl);
+        // 保存订单到数据库
+        TOrder tOrder = new TOrder();
+        String[] ignoreProperties = {"id", "createDate","sn"};
+        BeanUtil.copyProperties(huifuTempOrder, tOrder, ignoreProperties);
+        tOrder.setSn(sn);
+        tOrder.setCreateDate(new Date());
+        tOrder.setModifyDate(new Date());
+        // 保存订单明细
+        TOrderDetails orderDetails = new TOrderDetails();
+        orderDetails.setAdminId(huifuTempOrder.getAdminId());
+        orderDetails.setCreateDate(new Date());
+        orderDetails.setOrderSn(sn);
+        orderDetails.setCompanyType(huifuTempOrder.getCompanyType());
+        orderDetails.setRefundStatus("0");
+        orderDetails.setEquipmentId(huifuTempOrder.getEquipmentId());
+        if(huifuTempOrder.getProductNumber() != null && huifuTempOrder.getProductNumber() > 1) {
+            Map<String, String> map = new HashMap<>();
+
+            String[] products = huifuTempOrder.getNote().split(",");
+            for (String product : products) {
+                String[] parts = product.split(":");
+                // 商品名称-商品编号
+                String key = parts[0];
+                // 商品单价-商品数量
+                String value = parts[1];
+                map.put(key, value);
+            }
+
+            for (String key : map.keySet()) {
+                // key:"玫瑰精灵-A01",value:"0.50-1"
+                String value = map.get(key);
+                String[] GoodsInfo = key.split("-");
+                String[] GoodsValue = value.split("-");
+                orderDetails.setId(HuifuUtils.initDetailsId());
+                orderDetails.setProductName(GoodsInfo[0]);
+                orderDetails.setProductNo(GoodsInfo[1]);
+                orderDetails.setPrice(new BigDecimal(GoodsValue[0]).divide(new BigDecimal(GoodsValue[1])).setScale(2));
+                orderDetails.setProductNumber(Integer.valueOf(GoodsValue[1]));
+                orderDetails.setAmount(new BigDecimal(GoodsValue[0]).setScale(2));
+                orderDetailsService.save(orderDetails);
+            }
+            log.info("插入成功");
+        } else {
+            // 订单明细表
+            orderDetails.setId(HuifuUtils.initDetailsId());
+            orderDetails.setPrice(huifuTempOrder.getPrice());
+            orderDetails.setProductName(huifuTempOrder.getProductName());
+            orderDetails.setProductNo(huifuTempOrder.getProductNo());
+            orderDetails.setProductNumber(huifuTempOrder.getProductNumber());
+            orderDetails.setAmount(huifuTempOrder.getPrice());
+            orderDetailsService.save(orderDetails);
+        }
+        orderService.save(tOrder);
+        return resultUrl;
+    }
+
+    @Override
+    public String cardPay(String orderNo, BigDecimal amount, String productName, String notifyUrl, String authCode, JSONObject acctSplitBunch) throws Exception {
+        String url = "https://api.huifu.com/v2/trade/payment/micropay";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        String sn = HuifuUtils.initReqSeqId();
+        request.put("req_seq_id", sn);
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", HuifuConstant.DIV_HUIFU_ID);
+        request.put("auth_code", authCode);
+        request.put("trans_amt", amount);
+        request.put("goods_desc", productName);
+        request.put("notify_url", HuifuConstant.Notify_Url);
+        // 分账明细
+        request.put("acct_split_bunch", acctSplitBunch.toJSONString());
+        // 安全信息
+        JSONObject riskCheckData = new JSONObject();
+        riskCheckData.put("ip_addr","47.112.127.131");
+        request.put("risk_check_data", riskCheckData);
+        // 签名: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 success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        JSONObject result = JSONObject.parseObject(success);
+        JSONObject data = result.getJSONObject("data");
+        String transStat = data.getString("trans_stat");
+        String respDesc = data.getString("resp_desc");
+        if(transStat.equals(HuifuConstant.TRANS_STAT_S) || transStat.equals(HuifuConstant.TRANS_STAT_P)) {
+            return HuifuConstant.RESP_CODE_0;
+        } else {
+            return respDesc;
+        }
+    }
+}

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

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.THuifuTempOrder;
+import com.szwl.mapper.THuifuTempOrderMapper;
+import com.szwl.service.THuifuTempOrderService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 汇付订单临时表 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-27
+ */
+@Service
+public class THuifuTempOrderServiceImpl extends ServiceImpl<THuifuTempOrderMapper, THuifuTempOrder> implements THuifuTempOrderService {
+
+}

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

@@ -0,0 +1,20 @@
+package com.szwl.service.impl;
+
+import com.szwl.model.entity.TOrderDetails;
+import com.szwl.mapper.TOrderDetailsMapper;
+import com.szwl.service.TOrderDetailsService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 订单明细表 服务实现类
+ * </p>
+ *
+ * @author wuhs
+ * @since 2023-07-31
+ */
+@Service
+public class TOrderDetailsServiceImpl extends ServiceImpl<TOrderDetailsMapper, TOrderDetails> implements TOrderDetailsService {
+
+}

+ 97 - 0
src/main/java/com/szwl/utils/HuifuUtils.java

@@ -0,0 +1,97 @@
+package com.szwl.utils;
+
+import cn.hutool.core.util.RandomUtil;
+import com.huifu.bspay.sdk.opps.core.utils.DateTools;
+import lombok.extern.slf4j.Slf4j;
+
+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();
+    }
+
+    /**
+     * 生成随机订单明细号
+     * @return
+     */
+    public static String initDetailsId() {
+        String numbers = RandomUtil.randomNumbers(10);
+        return new StringBuilder(numbers).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).toString();
+    }
+
+    /**
+     * 生成随机临时订单明细号
+     * @return
+     */
+    public static String inithuifuTempId() {
+        String numbers1 = RandomUtil.randomNumbers(5);
+        String numbers2 = RandomUtil.randomNumbers(5);
+        return new StringBuilder(numbers1).append(DateTools.getCurrentDateTimeYYYYMMDDHHMMSSSSS()).append(numbers2).toString();
+    }
+}

+ 9 - 0
src/main/resources/bootstrap.yml

@@ -28,6 +28,15 @@ logging:
   level:
     com.szwl: debug
 
+oauth:
+  wx:
+    #    测试帐号
+    #    appID: wx6959f112e9ffbfa3
+    #    appSecret: 32f6fdf12bc25361110e1786f386eaab
+    #    正式账户
+    appID: wxcd5b1b2636c9f611
+    appSecret: e2854aa99f8279f33b4f065b2ffb75b1
+
 ##上面是基础配置,不用上配置中心那种
 ##下面是环境区分,主要不同环境不同文件获取
 ---

+ 715 - 7
src/test/java/com/szwl/ApplicationTests.java

@@ -1,18 +1,726 @@
 package com.szwl;
 
+import cn.hutool.core.util.RandomUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+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.HuifuBaseCommon;
+import com.szwl.config.OppsMerchantConfig;
+import com.szwl.constant.HuifuConstant;
+import com.szwl.utils.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.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.boot.test.context.SpringBootTest;
 
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 @Slf4j
 @SpringBootTest
 class ApplicationTests {
 
-//    @Autowired
-//    private EsTOrderAbroadService esTOrderAbroadService;
-//
-//    @Test
-//    void testInitTableFun() {
-//        esTOrderAbroadService.initTableFun();
-//    }
+    @Value("${oauth.wx.appID}")
+    private String appID;
+
+    @Value("${oauth.wx.appSecret}")
+    private String appSecret;
+
+
+
+
+    /**
+     * 汇付测试聚合正扫
+     * @throws Exception
+     */
+    @Test
+    void HuifuPay() throws Exception {
+        String url = "https://api.huifu.com/v2/trade/payment/jspay";
+        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id",SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000136120737");
+        request.put("trade_type", "T_JSAPI");
+        request.put("trans_amt", "1.00");
+        request.put("goods_desc", "测试商品");
+        // 分账明细
+        JSONObject acctSplitBunch = new JSONObject();
+        JSONArray acctInfos = new JSONArray();
+        JSONObject acctInfo1 = new JSONObject();
+        acctInfo1.put("div_amt", "0.01");
+        acctInfo1.put("huifu_id","6666000136120737");
+        JSONObject acctInfo2 = new JSONObject();
+        acctInfo2.put("div_amt", "0.59");
+        acctInfo2.put("huifu_id","6666000135495540");
+        JSONObject acctInfo3 = new JSONObject();
+        acctInfo3.put("div_amt", "0.40");
+        acctInfo3.put("huifu_id","6666000136424957");
+        acctInfos.add(acctInfo1);
+        acctInfos.add(acctInfo2);
+        acctInfos.add(acctInfo3);
+
+
+        acctSplitBunch.put("acct_infos", acctInfos);
+        request.put("acct_split_bunch", acctSplitBunch.toJSONString());
+
+        // 取现信息配置
+        JSONObject wxData = new JSONObject();
+        wxData.put("sub_appid",appID);
+//        wxData.put("open_id","ooT-O5z6HL1yhPWC1enDdy-_-cd8");
+        request.put("wx_data", wxData);
+
+        // 签名: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);
+
+    }
+
+    /**
+     * 汇付测试扫码交易退款
+     * @throws Exception
+     */
+    @Test
+    void refund() 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", "20230711100826951i2zi4k2qwdhsju");
+        request.put("req_date", "20230711");
+        request.put("huifu_id", "6666000136120737");
+        request.put("ord_amt", "1.00");
+        request.put("org_req_date", "20230711");
+        request.put("org_hf_seq_id","002900TOP3B230711100828P001ac139c1300000");
+        // 分账明细
+//        JSONObject acctInfos = new JSONObject();
+//        acctInfos.put("div_amt", "1.00");
+//        acctInfos.put("huifu_id","6666000135495540");
+////        acctInfos.put("acct_id","6666000135495540");
+//        request.put("acct_infos", acctInfos);
+
+
+        // 签名: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);
+
+    }
+
+    /**
+     * 汇付测试个人商户信息入驻
+     * @throws Exception
+     */
+    @Test
+    void addPersonage() 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", SequenceTools.getReqSeqId32()); // 请求流水号
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD()); // 请求日期
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID); // 上级主体ID
+        request.put("reg_name", "广州申泽智能科技有限公司"); // 商户名称
+        request.put("short_name", "申泽智能"); // 商户简称
+        request.put("prov_id", "440000"); // 经营省
+        request.put("area_id", "441900"); // 经营市
+        request.put("district_id", "440113"); // 经营区
+        request.put("detail_addr", "经营详细地址"); // 经营详细地址
+        request.put("contact_name", "联系人姓名"); // 联系人姓名
+        request.put("contact_mobile_no", "联系人手机号"); // 联系人手机号
+        request.put("contact_email", "联系人电子邮箱"); // 联系人电子邮箱
+        request.put("sms_send_flag", "M"); // 商户名
+        request.put("async_return_url", "异步通知地址"); // 异步通知地址:审核结果消息接收地址
+        request.put("settle_card_front_pic", "结算卡正面"); // 结算卡正面
+        request.put("settle_card_back_pic", "结算卡反面"); // 结算卡反面
+        // 结算卡信息配置
+        JSONObject cardInfo = new JSONObject();
+        cardInfo.put("card_name", "洪序滨"); // 卡户名
+        cardInfo.put("card_no", "6222032010021731588"); // 结算账号
+        cardInfo.put("prov_id", "440000"); // 银行所在省
+        cardInfo.put("area_id", "441900"); // 银行所在市
+        cardInfo.put("cert_type", "00"); // 持卡人证件类型
+        cardInfo.put("cert_no", "440510199712190811"); // 持卡人证件号码
+        cardInfo.put("cert_validity_type", "0"); // 持卡人证件有效期类型,1:长期有效,0:非长期有效;
+        cardInfo.put("cert_begin_date", "20170428"); // 持卡人证件有效期开始
+        cardInfo.put("cert_end_date", "20270428"); // 持卡人证件有效期截止日期
+        cardInfo.put("mp", "15815278034"); // 结算人手机号
+        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 success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ success);
+    }
+
+    /**
+     * 汇付测试企业商户信息入驻
+     * @throws Exception
+     */
+    @Test
+    void addFirm() 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", SequenceTools.getReqSeqId32()); // 请求流水号
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD()); // 请求日期
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID); // 上级主体ID
+        request.put("reg_name", "广州申泽智能科技有限公司"); // 商户名称
+        request.put("short_name", "申泽智能"); // 商户简称
+        request.put("ent_type", "3"); // 公司类型
+        request.put("license_code", "91440113MA59B2PW0B"); // 营业执照编号
+        request.put("license_validity_type", "1"); // 营业执照有效期类型,0:非长期有效 ,1:长期有效
+        request.put("license_begin_date", "20151208"); // 营业执照有效期开始日期
+//        request.put("license_end_date", "20220125"); // 营业执照有效期截止日期
+        request.put("reg_prov_id", "440000"); // 注册省
+        request.put("reg_area_id", "440100"); // 注册市
+        request.put("reg_district_id", "440113"); // 注册区
+        request.put("reg_detail", "广州市番禺区桥南街蚬涌村联兴路11号501部位01"); // 注册详细地址
+        request.put("legal_name", "朱方频"); // 法人姓名
+        request.put("legal_cert_type", "00"); // 法人证件类型
+        request.put("legal_cert_no", "440225197912020437"); // 法人证件号码
+        request.put("legal_cert_validity_type", "0"); // 法人证件有效期类型,1:长期有效;0:非长期有效 ;
+        request.put("legal_cert_begin_date", "20110311"); // 法人证件有效期开始日期
+        request.put("legal_cert_end_date", "20310311"); // 法人证件有效期截止日期
+        request.put("prov_id", "440000"); // 经营省
+        request.put("area_id", "440100"); // 经营市
+        request.put("district_id", "440113"); // 经营区
+        request.put("detail_addr", "广州市番禺区桥南街蚬涌村联兴路11号501部位01"); // 经营详细地址
+        request.put("contact_name", "朱方频"); // 联系人姓名
+        request.put("contact_mobile_no", "13826453788"); // 联系人手机号
+        request.put("contact_email", "ben@sunzee.com"); // 联系人电子邮箱
+        request.put("service_phone", "02031062206"); // 客服电话
+//        request.put("sms_send_flag", "M"); // 商户通知标识
+        request.put("busi_type", "1"); // 经营类型,1:实体,2:虚拟 ;
+        request.put("receipt_name", "广州申泽智能科技有限公司"); // 小票名称
+        request.put("mcc", "6071"); // 所属行业
+        request.put("open_licence_no", "J5810091371903"); // 基本存款账户编号或核准号
+        request.put("reg_acct_pic", "e2e2c13c-8111-3c17-9f9a-f2b4ae17c74a"); // 开户许可证
+        request.put("legal_cert_back_pic", "83a881cf-06f6-3bf4-9dc1-b1edae6d1c8b"); // 法人身份证人像面
+        request.put("legal_cert_front_pic", "02084b83-eb62-3e46-81e1-3c6315e71099"); // 法人身份证国徽面
+        request.put("license_pic", "de325cde-65e7-3bfc-b824-1ab164de742c"); // 营业执照图片
+        request.put("found_date", "20151208"); // 成立时间
+        request.put("legal_mobile_no", "13826453788"); // 法人手机号
+        request.put("legal_addr", "广州市番禺区南华路168号一座一梯1103房"); // 法人身份证地址
+        // 结算卡信息配置
+        JSONObject cardInfo = new JSONObject();
+        cardInfo.put("card_type", "0"); // 结算账户类型
+        cardInfo.put("card_name", "广州申泽智能科技有限公司"); // 卡户名
+        cardInfo.put("card_no", "3602024309200919603"); // 结算账号
+        cardInfo.put("prov_id", "440000"); // 银行所在省
+        cardInfo.put("area_id", "440100"); // 银行所在市
+        cardInfo.put("branch_code", "102581000281"); // 联行号
+        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 success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
+        System.out.println("返回的数据:"+ success);
+    }
+
+    /**
+     * 汇付测试商户基本信息修改
+     * @throws Exception
+     */
+    @Test
+    void modifyMerchant() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/basicdata/modify";
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        request.put("huifu_id", "6666000135495540");
+
+        // 取现信息配置
+        JSONObject cardInfo = new JSONObject();
+        cardInfo.put("card_type", "1");
+        cardInfo.put("card_name", "洪序滨");
+        cardInfo.put("card_no", "6222032010021731588");
+        cardInfo.put("prov_id", "440000");
+        cardInfo.put("area_id", "441900");
+        cardInfo.put("cert_type", "00");
+        cardInfo.put("cert_no", "440510199712190811");
+        cardInfo.put("cert_validity_type", "0");
+        cardInfo.put("cert_begin_date", "20170428");
+        cardInfo.put("cert_end_date", "20270428");
+        cardInfo.put("mp", "15815278034");
+        cardInfo.put("settle_card_front_pic", "a2823ff4-63d6-3bf8-a678-56c41a1bad66");
+        cardInfo.put("settle_cert_front_pic", "5eedb03d-2d21-3e0a-b0f5-1777d6b8c416");
+        cardInfo.put("settle_cert_back_pic", "7c3f6ffe-4da8-3493-9b68-f693785eff23");
+        request.put("card_info", cardInfo);
+
+        // 结算规则配置
+        JSONObject settleConfig = new JSONObject();
+        settleConfig.put("settle_status", "1");
+        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);
+
+        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);
+    }
+
+
+    /**
+     * 汇付测试商户业务开通
+     * @throws Exception
+     */
+    @Test
+    void open() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/busi/open";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000136120737");
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        request.put("short_name", "申泽智能");  // 微信支付宝商户简称
+        // 支付宝配置
+        ArrayList<Object> aliConfList = new ArrayList<>();
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("pay_scene","1");
+        jsonObject.put("fee_rate","1.00");
+        jsonObject.put("mcc","6071");
+        aliConfList.add(jsonObject);
+        System.out.println(aliConfList);
+        // 微信配置
+        ArrayList<Object> wxConfList = new ArrayList<>();
+        JSONObject jsonObject1 = new JSONObject();
+        jsonObject1.put("pay_scene","1");
+        jsonObject1.put("fee_rate","1.00");
+        jsonObject1.put("mcc","6071");
+        jsonObject1.put("service_codes", "");
+        wxConfList.add(jsonObject1);
+
+        request.put("ali_conf_list",aliConfList.toString());
+        request.put("wx_conf_list",wxConfList.toString());
+
+        // 签名: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);
+    }
+
+    /**
+     * 汇付测试商户业务修改
+     * @throws Exception
+     */
+    @Test
+    void modify() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/busi/modify";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000135495540");
+        request.put("upper_huifu_id", HuifuConstant.HUIFU_ID);
+        request.put("out_fee_flag", "1");
+        request.put("out_fee_huifuid", HuifuConstant.HUIFU_ID);
+        // 支付宝配置
+//        JSONObject jsonObject = new JSONObject();
+//        jsonObject.put("pay_scene","1");
+//        jsonObject.put("fee_rate","1.00");
+//        jsonObject.put("mcc","6071");
+//        String aliConfList = JSON.toJSONString(jsonObject);
+//        System.out.println(aliConfList);
+        // 微信配置
+        ArrayList<Object> wxConfList = new ArrayList<>();
+        JSONObject jsonObject1 = new JSONObject();
+        jsonObject1.put("pay_scene","1");
+        jsonObject1.put("fee_rate","1.00");
+        jsonObject1.put("mcc","6071");
+        jsonObject1.put("service_codes", "[\"JSAPI\",\"APPLET\",\"MICROPAY\"]");
+        wxConfList.add(jsonObject1);
+        request.put("wx_conf_list",wxConfList.toString());
+
+        // 签名: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);
+    }
+
+    /**
+     * 汇付测试微信实名认证
+     * @throws Exception
+     */
+    @Test
+    void realname() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/busi/realname";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000136120737");
+        request.put("owner", "Y");
+        request.put("identification_address", "广州市番禺区南华路168号一座一梯1103房");
+        ArrayList<Object> uboInfoList = new ArrayList<>();
+        JSONObject jsonObject1 = new JSONObject();
+        jsonObject1.put("ubo_id_doc_type","00");
+        jsonObject1.put("ubo_id_doc_copy","83a881cf-06f6-3bf4-9dc1-b1edae6d1c8b");
+        jsonObject1.put("ubo_id_doc_copy_back","02084b83-eb62-3e46-81e1-3c6315e71099");
+        jsonObject1.put("ubo_id_doc_name","朱方频");
+        jsonObject1.put("ubo_id_doc_number","440225197912020437");
+        jsonObject1.put("ubo_id_doc_address","广州市番禺区南华路168号一座一梯1103房");
+        jsonObject1.put("ubo_period_begin","20110311");
+        jsonObject1.put("ubo_period_end","20310311");
+        uboInfoList.add(jsonObject1);
+        request.put("ubo_info_list",uboInfoList.toString());
+        request.put("name", "朱方频");
+        request.put("mobile", "13926468029");
+        request.put("id_card_number", "440225197912020437");
+        request.put("contact_type", "LEGAL");
+//        request.put("micro_biz_type", "MICRO_TYPE_MOBILE");
+//        request.put("store_header_copy", "79bf1e91-108c-3499-b3bb-621ea283be98");
+//        request.put("store_indoor_copy", "79bf1e91-108c-3499-b3bb-621ea283be98");
+//        request.put("store_name", "申泽棉花糖机器人");
+//        request.put("store_address_code", "440000");
+//        request.put("store_address", "广州市番禺区桥南街道联兴路11号华深科技园第五层");
+//        request.put("identification_front_copy", "7c3f6ffe-4da8-3493-9b68-f693785eff23");
+//        request.put("identification_back_copy", "5eedb03d-2d21-3e0a-b0f5-1777d6b8c416");
+
+        // 签名: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);
+    }
+
+    /**
+     * 汇付测试微信商户配置
+     * @throws Exception
+     */
+    @Test
+    void config() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/busi/config";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000135495540");
+        request.put("fee_type", "02");
+        request.put("wx_woa_app_id", appID);
+        request.put("wx_woa_secret", appSecret);
+
+        // 签名: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);
+    }
+
+    /**
+     * 汇付测试商户分账配置
+     * @throws Exception
+     */
+    @Test
+    void separateAccount() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/split/config";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000135495540");
+        request.put("rule_origin", "01");
+        request.put("div_flag", "Y");
+        request.put("apply_ratio", "50.00");
+        request.put("start_type", "0");
+
+        // 签名: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);
+    }
+
+    /**
+     * 汇付测试支付宝实名认证
+     * @throws Exception
+     */
+    @Test
+    void apply() throws Exception {
+        // 请求接口
+        String url = "https://api.huifu.com/v2/merchant/busi/ali/realname/apply";
+        // 设置商户参数(全局只需设置一次)
+//        HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
+        // 请求参数:Data
+        JSONObject request = new JSONObject();
+        request.put("req_seq_id", SequenceTools.getReqSeqId32());
+        request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
+        request.put("huifu_id", "6666000135495540");
+        JSONObject contactPersonInfo = new JSONObject();
+        contactPersonInfo.put("id_card_number", "440510199712190811");
+        JSONObject legalPersonInfo = new JSONObject();
+        legalPersonInfo.put("card_front_img", "7c3f6ffe-4da8-3493-9b68-f693785eff23");
+        legalPersonInfo.put("card_back_img", "5eedb03d-2d21-3e0a-b0f5-1777d6b8c416");
+        JSONObject authIdentityInfo = new JSONObject();
+        authIdentityInfo.put("business_type", "0");
+        authIdentityInfo.put("finance_institution_flag", "N");
+        JSONObject supportCredentials = new JSONObject();
+        supportCredentials.put("micro_biz_type","MICRO_TYPE_MOBILE");
+        supportCredentials.put("store_name", "申泽棉花糖机器人");
+        supportCredentials.put("province_code", "440000");
+        supportCredentials.put("province", "广东省");
+        supportCredentials.put("city_code", "440100");
+        supportCredentials.put("city", "广州市");
+        supportCredentials.put("district_code", "440113");
+        supportCredentials.put("district", "番禺区");
+        supportCredentials.put("store_address", "广州市番禺区桥南街道联兴路11号华深科技园第五层");
+        authIdentityInfo.put("support_credentials", supportCredentials.toString());
+
+        request.put("legal_person_info", legalPersonInfo.toString());
+        request.put("auth_identity_info", authIdentityInfo.toString());
+        request.put("contact_person_info", contactPersonInfo.toString());
+
+
+        // 签名: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);
+    }
+
+    /**
+     * 图片上传
+     * @throws Exception
+     */
+    @Test
+    void picture() throws Exception {
+
+        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", HuifuConstant.fileType.F13);
+        params.put("picture", HuifuConstant.fileType.F13.toValue());
+//        params.put("huifu_id", "6666000135495540");
+        String data = JSON.toJSONString(params);
+        String localFile = "D:\\Users\\Desktop\\微信图片_20230714173427.jpg";
+        File file = new File(localFile);
+
+
+
+        CloseableHttpClient httpclient1 = HttpClients.createDefault();
+        CloseableHttpResponse response = null;
+        String result = null;
+
+        try {
+            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", file);
+
+            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);
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+
+    @Test
+    void testNum() throws Exception {
+        String str = "玫瑰精灵x1,童心未泯x1,五彩缤纷x1,天雪恋舞x1,水中芙蓉x1";
+        Map<String, Integer> map = new HashMap<>();
+
+        String[] products = str.split(",");
+        for (String product : products) {
+            String[] parts = product.split("x");
+            String name = parts[0].trim();
+            int quantity = Integer.parseInt(parts[1].trim().replaceAll("[^0-9]", ""));
+            map.put(name, quantity);
+        }
+
+        // 输出Map的键值对
+        for (String key : map.keySet()) {
+            System.out.println(key + ": " + map.get(key));
+        }
+
+        System.out.println(HuifuConstant.fileType.F03);
+    }
 
 }