fix 退款修复时完成时间为空, 通道退款订单可退余额不正确问题修复

This commit is contained in:
bootx
2024-02-08 00:55:25 +08:00
parent 28b96cf822
commit 5ea91081eb
53 changed files with 924 additions and 129 deletions

View File

@@ -9,9 +9,40 @@
<version>2.0.0</version>
<packaging>jar</packaging>
<!-- 项目信息 -->
<name>bootx-platform</name>
<description>bootx-platform 基于Spring Boot框架打造针对单体式应用进行专门设计提供整套服务模块努力为打造全方位企业级开发解决方案</description>
<url>https://gitee.com/bootx/bootx-platform</url>
<!-- 许可证 -->
<licenses>
<license>
<name>The Apache Software License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
<distribution>repo</distribution>
</license>
</licenses>
<!-- 开发者信息 -->
<developers>
<developer>
<name>bootx</name>
<email>xxm1995@outlook.com</email>
<organization>bootx</organization>
<url>https://gitee.com/bootx/bootx-platform</url>
</developer>
</developers>
<scm>
<connection>scm:git:git@gitee.com:bootx/bootx-platform.git</connection>
<developerConnection>scm:git:git@gitee.com:bootx/bootx-platform.git</developerConnection>
<url>https://gitee.com/bootx/bootx-platform</url>
</scm>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<logback-classic.version>1.2.7</logback-classic.version>
<hutool.version>5.8.25</hutool.version>
@@ -29,6 +60,7 @@
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>${logback-classic.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
@@ -44,4 +76,111 @@
</dependency>
</dependencies>
<build>
<plugins>
<!-- 编译插件设置源码以及编译的jdk版本 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
<!--打包源码的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<!-- Javadoc 文档生成插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<failOnError>false</failOnError>
<doclint>none</doclint>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
<!--公钥私钥插件,也就是上传需要进行验证用户名和密码过程中需要用到的插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<!--部署插件-->
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<!-- setting.xml中配置仓库平台id -->
<serverId>sonatype</serverId>
<!-- 仓库平台地址 -->
<nexusUrl>https://s01.oss.sonatype.org/</nexusUrl>
<!-- 自动完成在平台上close后的release的操作 -->
<!-- <autoReleaseAfterClose>false</autoReleaseAfterClose>-->
</configuration>
</plugin>
</plugins>
<resources>
<!-- 指定打包资源路径 -->
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*</include>
</includes>
<filtering>true</filtering>
</resource>
<!-- java类路径中会被打包的软件 -->
<resource>
<directory>src/main/java</directory>
</resource>
</resources>
</build>
<distributionManagement>
<snapshotRepository>
<id>sonatype</id>
<name>OSS Snapshots Repository</name>
<url>https://s01.oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype</id>
<name>OSS Staging Repository</name>
<url>https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
</project>

View File

@@ -0,0 +1,22 @@
package cn.bootx.platform.daxpay.sdk.code;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 退款同步状态枚举
* @author xxm
* @since 2024/1/29
*/
@Getter
@AllArgsConstructor
public enum RefundSyncStatusEnum {
SUCCESS("refund_success","退款成功"),
FAIL("refund_fail","退款失败"),
PROGRESS("refund_progress","退款中");
/** 编码 */
private final String code;
/** 名称 */
private final String name;
}

View File

@@ -0,0 +1,20 @@
package cn.bootx.platform.daxpay.sdk.model.divide;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 分账结果(目前未支持)
* @author xxm
* @since 2024/2/7
*/
@Getter
@Setter
@ToString
public class DivideOrderModel extends DaxPayResponseModel {
/** 分账状态 */
private String status;
}

View File

@@ -0,0 +1,43 @@
package cn.bootx.platform.daxpay.sdk.model.pay;
import cn.bootx.platform.daxpay.sdk.code.PayStatusEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 支付订单通道响应参数
* @author xxm
* @since 2024/1/16
*/
@Getter
@Setter
@ToString
public class QueryPayChannelOrder {
/** 是否为异步支付通道 */
private boolean async;
/** 支付通道 */
private String channel;
/** 支付方式 */
private String payWay;
/**
* 网关订单号, 用与将记录关联起来
*/
private String gatewayOrderNo;
/**
* 支付状态
* @see PayStatusEnum
*/
private String status;
/** 金额 */
private Integer amount;
/** 可退款金额 */
private Integer refundableBalance;
}

View File

@@ -0,0 +1,66 @@
package cn.bootx.platform.daxpay.sdk.model.pay;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayStatusEnum;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.List;
/**
* 支付订单查询响应参数
* @author xxm
* @since 2024/1/16
*/
@Getter
@Setter
@ToString
public class QueryPayOrderModel extends DaxPayResponseModel {
/** 支付ID */
private Long paymentId;
/** 业务号 */
private String businessNo;
/** 标题 */
private String title;
/** 描述 */
private String description;
/** 是否是异步支付 */
private boolean asyncPay;
/** 是否是组合支付 */
private boolean combinationPay;
/**
* 异步支付通道
* @see PayChannelEnum
*/
private String asyncChannel;
/** 金额 */
private Integer amount;
/** 可退款余额 */
private Integer refundableBalance;
/**
* 支付状态
* @see PayStatusEnum
*/
private String status;
/** 支付时间(秒级时间戳) */
private Integer payTime;
/** 过期时间(秒级时间戳) */
private Integer expiredTime;
/** 支付通道列表 */
private List<QueryPayChannelOrder> channels;
}

View File

@@ -1,6 +1,6 @@
package cn.bootx.platform.daxpay.sdk.model.refund;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import cn.bootx.platform.daxpay.sdk.code.RefundStatusEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@@ -13,7 +13,7 @@ import lombok.ToString;
@Getter
@Setter
@ToString
public class RefundChannelOrderModel extends DaxPayResponseModel {
public class QueryRefundChannelOrderModel {
/** 通道 */
private String channel;
@@ -24,9 +24,21 @@ public class RefundChannelOrderModel extends DaxPayResponseModel {
/** 异步支付方式 */
private boolean async;
/** 订单金额" */
/** 订单金额 */
private Integer orderAmount;
/** 退款金额 */
private Integer amount;
/** 剩余可退余额 */
private Integer refundableAmount;
/**
* 退款状态
* @see RefundStatusEnum
*/
private String status;
/** 退款完成时间(秒级时间戳) */
private Long refundTime;
}

View File

@@ -18,17 +18,20 @@ import java.util.List;
@Getter
@Setter
@ToString
public class RefundOrderResult extends DaxPayResponseModel {
public class QueryRefundOrderModel extends DaxPayResponseModel {
/** 支付号 */
private Long paymentId;
/** 关联的业务id */
private String businessNo;
/** 退款id */
private Long refundId;
/** 退款号 */
private String refundNo;
/** 关联支付号 */
private Long paymentId;
/** 关联业务号 */
private String businessNo;
/** 标题 */
private String title;
@@ -43,12 +46,6 @@ public class RefundOrderResult extends DaxPayResponseModel {
*/
private String gatewayOrderNo;
/** 通道退款订单 */
private List<RefundChannelOrderModel> channels;
/** 退款终端ip */
private String clientIp;
/** 退款时间 */
private LocalDateTime refundTime;
@@ -57,4 +54,7 @@ public class RefundOrderResult extends DaxPayResponseModel {
* @see RefundStatusEnum
*/
private String status;
/** 通道退款订单 */
private List<QueryRefundChannelOrderModel> channels;
}

View File

@@ -1,5 +1,6 @@
package cn.bootx.platform.daxpay.sdk.model.sync;
import cn.bootx.platform.daxpay.sdk.code.PaySyncStatusEnum;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
@@ -16,21 +17,15 @@ import lombok.ToString;
public class PaySyncModel extends DaxPayResponseModel {
/**
* 支付网关同步状态
* 支付网关同步结果
* @see PaySyncStatusEnum
*/
private String gatewayStatus;
/** 是否同步成功 */
private boolean success;
/** 是否进行了修复 */
private boolean repair;
/** 修复号 */
private String repairOrderNo;
/** 失败原因 */
private String errorMsg;
}

View File

@@ -0,0 +1,31 @@
package cn.bootx.platform.daxpay.sdk.model.sync;
import cn.bootx.platform.daxpay.sdk.code.RefundSyncStatusEnum;
import cn.bootx.platform.daxpay.sdk.net.DaxPayResponseModel;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* 退款信息同步结果
* @author xxm
* @since 2024/2/7
*/
@Getter
@Setter
@ToString
public class RefundSyncModel extends DaxPayResponseModel {
/**
* 支付网关同步结果
* @see RefundSyncStatusEnum
*/
private String gatewayStatus;
/** 是否进行了修复 */
private boolean repair;
/** 修复号 */
private String repairOrderNo;
}

View File

@@ -1,6 +1,7 @@
package cn.bootx.platform.daxpay.sdk.net;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.date.DateUtil;
import lombok.Getter;
import lombok.Setter;
@@ -47,6 +48,6 @@ public abstract class DaxPayRequest<T extends DaxPayResponseModel> {
private String version = "1.0";
/** 请求时间,传输时间戳 */
private Long reqTime;
private Long reqTime = DateUtil.currentSeconds();
}

View File

@@ -0,0 +1,41 @@
package cn.bootx.platform.daxpay.sdk.param.divide;
import cn.bootx.platform.daxpay.sdk.model.divide.DivideOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import lombok.Getter;
import lombok.Setter;
/**
* 分账请求接口(目前未支持)
* @author xxm
* @since 2024/2/7
*/
@Getter
@Setter
public class DivideOrderParam extends DaxPayRequest<DivideOrderModel> {
/** 支付ID */
private Long paymentId;
/** 业务号 */
private String businessNo;
/**
* 方法请求路径
*/
@Override
public String path() {
return "/unipay/divide";
}
/**
* 将请求返回结果反序列化为实体类
*/
@Override
public DaxPayResult<DivideOrderModel> toModel(String json) {
return JSONUtil.toBean(json, new TypeReference<DaxPayResult<DivideOrderModel>>() {}, false);
}
}

View File

@@ -0,0 +1,41 @@
package cn.bootx.platform.daxpay.sdk.param.pay;
import cn.bootx.platform.daxpay.sdk.model.pay.QueryPayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 支付单查询参数
* @author xxm
* @since 2024/1/16
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class QueryPayParam extends DaxPayRequest<QueryPayOrderModel> {
/** 支付ID */
private Long paymentId;
/** 业务号 */
private String businessNo;
/**
* 方法请求路径
*/
@Override
public String path() {
return "/uni/query/payOrder";
}
/**
* 将请求返回结果反序列化为实体类
*/
@Override
public DaxPayResult<QueryPayOrderModel> toModel(String json) {
return JSONUtil.toBean(json, new TypeReference<DaxPayResult<QueryPayOrderModel>>() {}, false);
}
}

View File

@@ -0,0 +1,41 @@
package cn.bootx.platform.daxpay.sdk.param.refund;
import cn.bootx.platform.daxpay.sdk.model.refund.QueryRefundOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 查询退款订单参数类
* @author xxm
* @since 2024/1/16
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class QueryRefundParam extends DaxPayRequest<QueryRefundOrderModel> {
/** 退款ID */
private Long refundId;
/** 退款号 */
private String refundNo;
/**
* 方法请求路径
*/
@Override
public String path() {
return "/uni/query/refundOrder";
}
/**
* 将请求返回结果反序列化为实体类
*/
@Override
public DaxPayResult<QueryRefundOrderModel> toModel(String json) {
return JSONUtil.toBean(json, new TypeReference<DaxPayResult<QueryRefundOrderModel>>() {}, false);
}
}

View File

@@ -0,0 +1,44 @@
package cn.bootx.platform.daxpay.sdk.param.sync;
import cn.bootx.platform.daxpay.sdk.model.sync.RefundSyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayRequest;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import cn.hutool.core.lang.TypeReference;
import cn.hutool.json.JSONUtil;
import lombok.Getter;
import lombok.Setter;
/**
* 退款同步参数
* @author xxm
* @since 2024/2/7
*/
@Getter
@Setter
public class RefundSyncParam extends DaxPayRequest<RefundSyncModel> {
/**
* 退款IDrefundId和refundNo 必传一个, 同时传输时,以 refundId 为准
*/
private Long refundId;
/**
* 退款号refundId和refundNo 必传一个,同时传输时,以 refundId 为准
*/
private String refundNo;
/**
* 方法请求路径
*/
@Override
public String path() {
return "/unipay/syncRefund";
}
/**
* 将请求返回结果反序列化为实体类
*/
@Override
public DaxPayResult<RefundSyncModel> toModel(String json) {
return JSONUtil.toBean(json, new TypeReference<DaxPayResult<RefundSyncModel>>() {}, false);
}
}

View File

@@ -15,10 +15,10 @@ import java.util.stream.Collectors;
/**
* 如果需要进行签名,
* 1. 参数名ASCII码从小到大排序字典序
* 2. 如果参数的值为空不参与签名
* 3. 参数名不区分大小写
* 4. 嵌套对象转换成先转换成MAP再序列化为字符串
* 5. 支持两层嵌套, 更多层级嵌套未测试, 可能会导致不可预知的问题
* * 2. 如果参数的值为空不参与签名
* * 3. 参数名不区分大小写
* * 4. 嵌套对象转换成先转换成MAP再序列化为字符串
* * 5. 支持两层嵌套, 更多层级嵌套未测试, 可能会导致不可预知的问题
*/
@UtilityClass
public class PaySignUtil {

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk;
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.model.pay.PayCloseModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk;
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.model.sync.PaySyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk;
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;

View File

@@ -0,0 +1,40 @@
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.model.sync.RefundSyncModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.sync.RefundSyncParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 退款同步接口
* @author xxm
* @since 2024/2/5
*/
public class RefundOrderSyncTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void testPay() {
RefundSyncParam param = new RefundSyncParam();
param.setRefundNo("R0001");
DaxPayResult<RefundSyncModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
}

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk;
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.model.refund.RefundModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;

View File

@@ -1,4 +1,4 @@
package cn.bootx.platform.daxpay.sdk;
package cn.bootx.platform.daxpay.sdk.payment;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
@@ -17,8 +17,6 @@ import org.junit.Test;
*/
public class SimplePayOrderTest {
@Before
public void init() {
// 初始化支付配置

View File

@@ -0,0 +1,38 @@
package cn.bootx.platform.daxpay.sdk.query;
import cn.bootx.platform.daxpay.sdk.model.pay.QueryPayOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.pay.QueryPayParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 查询支付订单测试类
* @author xxm
* @since 2024/2/7
*/
public class QueryPayOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void testPay() {
QueryPayParam param = new QueryPayParam();
param.setBusinessNo("2");
DaxPayResult<QueryPayOrderModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
}

View File

@@ -0,0 +1,38 @@
package cn.bootx.platform.daxpay.sdk.query;
import cn.bootx.platform.daxpay.sdk.model.refund.QueryRefundOrderModel;
import cn.bootx.platform.daxpay.sdk.net.DaxPayConfig;
import cn.bootx.platform.daxpay.sdk.net.DaxPayKit;
import cn.bootx.platform.daxpay.sdk.param.refund.QueryRefundParam;
import cn.bootx.platform.daxpay.sdk.response.DaxPayResult;
import org.junit.Before;
import org.junit.Test;
/**
* 退款订单查询接口
* @author xxm
* @since 2024/2/7
*/
public class QueryRefundOrderTest {
@Before
public void init() {
// 初始化支付配置
DaxPayConfig config = DaxPayConfig.builder()
.serviceUrl("http://127.0.0.1:9000")
.signSecret("123456")
.build();
DaxPayKit.initConfig(config);
}
@Test
public void testPay() {
QueryRefundParam param = new QueryRefundParam();
param.setRefundId(1755263825769361408L);
DaxPayResult<QueryRefundOrderModel> execute = DaxPayKit.execute(param);
System.out.println(execute);
System.out.println(execute.getData());
}
}

View File

@@ -0,0 +1,55 @@
package cn.bootx.platform.daxpay.sdk.util;
import cn.bootx.platform.daxpay.sdk.code.PayChannelEnum;
import cn.bootx.platform.daxpay.sdk.code.PayWayEnum;
import cn.bootx.platform.daxpay.sdk.param.pay.PayChannelParam;
import cn.bootx.platform.daxpay.sdk.param.pay.PayParam;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* 参数签名测试类
* @author xxm
* @since 2024/2/7
*/
@Slf4j
public class PayParamSignTest {
/**
* 签名测试
*/
@Test
public void sign(){
PayParam param = new PayParam();
param.setClientIp("127.0.0.1");
param.setNotNotify(true);
param.setNotReturn(true);
param.setBusinessNo("P0001");
param.setTitle("测试接口支付");
PayChannelParam payChannelParam = new PayChannelParam();
payChannelParam.setChannel(PayChannelEnum.WECHAT.getCode());
payChannelParam.setWay(PayWayEnum.QRCODE.getCode());
payChannelParam.setAmount(1);
List<PayChannelParam> payChannels = Collections.singletonList(payChannelParam);
param.setPayChannels(payChannels);
Map<String, String> map = PaySignUtil.toMap(param);
log.info("转换为有序MAP后的内容: {}",map);
String data = PaySignUtil.createLinkString(map);
log.info("将MAP拼接字符串: {}",data);
String sign = "123456";
data += "&sign="+sign;
data = data.toUpperCase();
log.info("添加秘钥并转换为大写的字符串: {}",data);
log.info("MD5: {}",PaySignUtil.md5(data));
log.info("HmacSHA256: {}",PaySignUtil.hmacSha256(data,sign));
}
}