Преглед на файлове

【项目开发】

1.增加代码示例
ChenYL преди 11 месеца
родител
ревизия
3a7a1b8dc1

+ 9 - 4
data-easy/pom.xml

@@ -99,13 +99,18 @@
             <version>${jasypt.version}</version>
         </dependency>
         <dependency>
-            <groupId>com.github.wechatpay-apiv3</groupId>
-            <artifactId>wechatpay-java</artifactId>
-            <version>${wechatpay.version}</version>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>wx-java-mp-spring-boot-starter</artifactId>
+            <version>4.7.0</version>
         </dependency>
         <dependency>
             <groupId>com.github.binarywang</groupId>
-            <artifactId>wx-java-mp-spring-boot-starter</artifactId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>4.7.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>wx-java-miniapp-spring-boot-starter</artifactId>
             <version>4.7.0</version>
         </dependency>
     </dependencies>

+ 58 - 0
data-easy/src/main/java/com/dataeasy/server/TestController.java

@@ -0,0 +1,58 @@
+package com.dataeasy.server;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import com.dataeasy.server.msg.WeChatMsgPushUtil;
+import com.dataeasy.server.pay.PayService;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/3 14:35
+ */
+@Slf4j
+@RestController
+public class TestController {
+
+    @Autowired
+    private WeChatMsgPushUtil weChatMsgPushUtil;
+
+    @GetMapping("/test/t1")
+    public void t1() {
+        weChatMsgPushUtil.sendOrderMsg("oaeVR7FhHMDu3iqUOhcTgJJVdOM0", "www.baidu.com");
+    }
+
+    @Autowired
+    private PayService payService;
+
+    @GetMapping("/test/t2")
+    public void t2() throws WxPayException {
+        payService.createDdzqOrder();
+    }
+
+    @PostMapping("/pay/ddzqOrder")
+    public String ddzqOrder(HttpServletRequest request) {
+        return payService.ddzqOrder(request);
+    }
+
+    @Autowired
+    private WxMaService wxMaService;
+
+    @GetMapping("/test/login")
+    public String login(@RequestParam String code) throws WxErrorException {
+        WxMaJscode2SessionResult wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(code);
+        return wxMaJscode2SessionResult.getOpenid();
+    }
+}

+ 30 - 0
data-easy/src/main/java/com/dataeasy/server/msg/LogHandler.java

@@ -0,0 +1,30 @@
+package com.dataeasy.server.msg;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.session.WxSessionManager;
+import me.chanjar.weixin.mp.api.WxMpMessageHandler;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/3 14:31
+ */
+@Slf4j
+@Component
+public class LogHandler implements WxMpMessageHandler {
+    @Override
+    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
+                                    Map<String, Object> context, WxMpService wxMpService,
+                                    WxSessionManager sessionManager) {
+        log.info("\n接收到请求消息,内容:{}", wxMessage);
+        return null;
+    }
+
+}

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/MpEntryController.java → data-easy/src/main/java/com/dataeasy/server/msg/MpEntryController.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server;
+package com.dataeasy.server.msg;
 
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;

+ 76 - 0
data-easy/src/main/java/com/dataeasy/server/msg/SubscribeHandler.java

@@ -0,0 +1,76 @@
+package com.dataeasy.server.msg;
+
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.session.WxSessionManager;
+import me.chanjar.weixin.mp.api.WxMpMessageHandler;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
+import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
+import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/3 14:11
+ */
+@Component
+@Slf4j
+public class SubscribeHandler implements WxMpMessageHandler {
+
+    @Override
+    public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage,
+                                    Map<String, Object> context, WxMpService weixinService,
+                                    WxSessionManager sessionManager) throws WxErrorException {
+
+        log.info("新关注用户 OPENID: " + wxMessage.getFromUser());
+//        用户关注之后会触发这个类,其他类也都可以例如:对话,取关什么的,看你业务需求
+        log.info("这就是你想要的openId{}",wxMessage.getOpenId());
+
+        // 获取微信用户基本信息
+        try {
+            WxMpUser userWxInfo = weixinService.getUserService()
+                    .userInfo(wxMessage.getFromUser(), null);
+            if (userWxInfo != null) {
+                // TODO 可以添加关注用户到本地数据库
+//                这里逻辑代码不展示
+            }
+        } catch (WxErrorException e) {
+            if (e.getError().getErrorCode() == 48001) {
+                log.info("该公众号没有获取用户信息权限!");
+            }
+        }
+
+
+        WxMpXmlOutMessage responseResult = null;
+        try {
+            responseResult = this.handleSpecial(wxMessage);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+
+        if (responseResult != null) {
+            return responseResult;
+        }
+        try {
+//            return new TextBuilder().build(WxMsgSendUserUtil.USER_SUBSCRIBE, wxMessage, weixinService);
+            return null;
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    /**
+     * 处理特殊请求,比如如果是扫码进来的,可以做相应处理
+     */
+    private WxMpXmlOutMessage handleSpecial(WxMpXmlMessage wxMessage)
+            throws Exception {
+        //TODO
+        return null;
+    }
+}

+ 1 - 1
data-easy/src/main/java/com/dataeasy/server/WeChatMsgPushConfig.java → data-easy/src/main/java/com/dataeasy/server/msg/WeChatMsgPushConfig.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server;
+package com.dataeasy.server.msg;
 
 import lombok.Data;
 import org.springframework.beans.factory.annotation.Value;

+ 8 - 12
data-easy/src/main/java/com/dataeasy/server/WeChatMsgPushUtil.java → data-easy/src/main/java/com/dataeasy/server/msg/WeChatMsgPushUtil.java

@@ -1,4 +1,4 @@
-package com.dataeasy.server;
+package com.dataeasy.server.msg;
 
 import lombok.extern.slf4j.Slf4j;
 import me.chanjar.weixin.common.error.WxErrorException;
@@ -28,11 +28,7 @@ public class WeChatMsgPushUtil {
      * @param Kind 预约种类
      * @return boolean
      */
-    public Boolean sendOrderMsg(String tradeName,
-                                String subscribeTime,
-                                String subscribeNum,
-                                String Kind,
-                                String openId,
+    public Boolean sendOrderMsg(String openId,
                                 String urlRel) {
 
 
@@ -42,12 +38,12 @@ public class WeChatMsgPushUtil {
                 .url(urlRel)//这里是你的配置的url 例如:www.baidu.com,
                 .build();
         templateMessage
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.FIRST,WxMsgSendUserUtil.FIRST_CONTENT,这里你要是刚才配置了文字的颜色导入这个color,下面同理))
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.KEYWORD_ONE,tradeName))
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.KEYWORD_TWO,subscribeTime))
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.KEYWORD_THREE,subscribeNum))
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.KEYWORD_FOUR,Kind))
-                .addData(new WxMpTemplateData(WxMsgSendUserUtil.REMARK,WxMsgSendUserUtil.REMARK_CONTENT));
+                .addData(new WxMpTemplateData("first", "预约成功"))
+                .addData(new WxMpTemplateData("keyword1", "测试111"))
+                .addData(new WxMpTemplateData("keyword2","测试2222"))
+                .addData(new WxMpTemplateData("keyword3","测试333"))
+                .addData(new WxMpTemplateData("keyword4","测试4444"))
+                .addData(new WxMpTemplateData("remark","测试备注"));
 
         String msgPush=null;
         try {

+ 16 - 18
data-easy/src/main/java/com/dataeasy/server/WxMpConfiguration.java → data-easy/src/main/java/com/dataeasy/server/msg/WxMpConfiguration.java

@@ -1,18 +1,16 @@
-package com.dataeasy.server;
+package com.dataeasy.server.msg;
 
 import lombok.AllArgsConstructor;
 import me.chanjar.weixin.mp.api.WxMpMessageRouter;
 import me.chanjar.weixin.mp.api.WxMpService;
-import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
-import me.chanjar.weixin.mp.config.WxMpConfigStorage;
-import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 
-import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_CLOSE_SESSION;
-import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_CREATE_SESSION;
-import static me.chanjar.weixin.mp.constant.WxMpEventConstants.CustomerService.KF_SWITCH_SESSION; /**
+import static me.chanjar.weixin.common.api.WxConsts.EventType.SUBSCRIBE;
+import static me.chanjar.weixin.common.api.WxConsts.XmlMsgType.EVENT;
+
+/**
  * @author myou
  * @version 1.0.0
  * @date 2025/3/1 21:36
@@ -33,12 +31,12 @@ public class WxMpConfiguration {
 //    private ScanHandler scanHandler;
 //    @Autowired
 //    private MsgHandler msgHandler;
-//    @Autowired
-//    private LogHandler logHandler;
+    @Autowired
+    private LogHandler logHandler;
 //    @Autowired
 //    private WxMpProperties wxMpProperties;
-//    @Autowired
-//    private SubscribeHandler subscribeHandler;
+    @Autowired
+    private SubscribeHandler subscribeHandler;
 //    @Autowired
 //    private UnsubscribeHandler unsubscribeHandler;
 
@@ -69,8 +67,8 @@ public class WxMpConfiguration {
     public WxMpMessageRouter messageRouter(WxMpService wxMpService) {
         final WxMpMessageRouter newRouter = new WxMpMessageRouter(wxMpService);
 
-//        // 记录所有事件的日志 (异步执行)
-//        newRouter.rule().handler(this.logHandler).next();
+        // 记录所有事件的日志 (异步执行)
+        newRouter.rule().handler(this.logHandler).next();
 //
 //        // 接收客服会话管理事件
 //        newRouter.rule().async(false).msgType(EVENT).event(KF_CREATE_SESSION)
@@ -84,10 +82,10 @@ public class WxMpConfiguration {
 //        // 自定义菜单事件
 //        newRouter.rule().async(false).msgType(EVENT).event(EventType.CLICK).handler(this.menuHandler).end();
 //
-//        // 关注事件
-//        newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();
-//
-//        // 取消关注事件
+        // 关注事件
+        newRouter.rule().async(false).msgType(EVENT).event(SUBSCRIBE).handler(this.subscribeHandler).end();
+
+        // 取消关注事件
 //        newRouter.rule().async(false).msgType(EVENT).event(UNSUBSCRIBE).handler(this.unsubscribeHandler).end();
 //
 //        // 扫码事件
@@ -99,7 +97,7 @@ public class WxMpConfiguration {
 //        // 图片消息处理
 //        newRouter.rule().async(false).msgType(XmlMsgType.IMAGE).handler(this.imgHandler).end();
 //
-//        // 默认
+        // 默认
 //        newRouter.rule().async(false).handler(this.msgHandler).end();
 
         return newRouter;

+ 24 - 0
data-easy/src/main/java/com/dataeasy/server/pay/DateTimeUtils.java

@@ -0,0 +1,24 @@
+package com.dataeasy.server.pay;
+
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/4 14:52
+ */
+public class DateTimeUtils {
+
+    public static final String DATE_FORMAT_yyyyMMddHHmmss = "yyyyMMddHHmmss";
+    public static final DateTimeFormatter sdf = DateTimeFormatter.ofPattern(DATE_FORMAT_yyyyMMddHHmmss);
+
+    public static String yyyyMMddHHmmssDateTime(int minute) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime localDateTime = now.plusMinutes(minute);
+        return sdf.format(localDateTime);
+
+    }
+}

+ 110 - 0
data-easy/src/main/java/com/dataeasy/server/pay/PayService.java

@@ -0,0 +1,110 @@
+package com.dataeasy.server.pay;
+
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
+import com.github.binarywang.wxpay.bean.result.BaseWxPayResult;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.io.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/4 14:46
+ */
+@Slf4j
+@Service
+public class PayService {
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    public WxPayUnifiedOrderV3Result.JsapiResult createDdzqOrder()throws WxPayException {
+//        String endPayMoney = new BigDecimal("0.01").multiply(BigDecimal.valueOf(100)).stripTrailingZeros().toPlainString();	//将金额转换为分
+        WxPayUnifiedOrderRequest.WxPayUnifiedOrderRequestBuilder builder = WxPayUnifiedOrderRequest.newBuilder();
+        WxPayUnifiedOrderRequest wxOrder = builder
+                .body("测试测试商品描述") //商品描述
+                .openid("oaeVR7FhHMDu3iqUOhcTgJJVdOM0") //用户openid
+                .outTradeNo("20250304000001")  //商户订单号
+//                .spbillCreateIp("0.0.0.0")  //终端IP
+//                .totalFee(endPayMoney) // 支付收款金额 100分  注意:单位(分)
+                .totalFee(1)  //测试时可以设置一分钱
+                .timeStart(DateTimeUtils.yyyyMMddHHmmssDateTime(0))	//交易起始时间
+                .timeExpire(DateTimeUtils.yyyyMMddHHmmssDateTime(10))  //交易结束时间
+                .tradeType(WxPayConstants.TradeType.JSAPI).build();
+        wxOrder.setSignType("MD5");
+//        wxOrder.setNotifyUrl("http://ra36qh.natappfree.cc/pay/ddzqOrder"); //不测试时需要放开注释
+        WxPayUnifiedOrderV3Request wxOrderV3 = new WxPayUnifiedOrderV3Request();
+        wxOrderV3.setDescription("测试商品得描述书");
+        wxOrderV3.setOutTradeNo("20250305000001");
+        wxOrderV3.setTimeExpire("2025-03-05T10:34:56+08:00");
+        wxOrderV3.setNotifyUrl("http://ra36qh.natappfree.cc/pay/ddzqOrder");
+        WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
+        WxPayUnifiedOrderV3Request.Payer payer = new WxPayUnifiedOrderV3Request.Payer();
+        payer.setOpenid("oSoRX7Ll01EB7XfsYt5aVrF_KfLU");
+        wxOrderV3.setPayer(payer);
+        amount.setTotal(1);
+        wxOrderV3.setAmount(amount);
+        return wxPayService.createOrderV3(TradeTypeEnum.JSAPI, wxOrderV3);
+//        return wxPayService.createOrder(wxOrder);
+    }
+
+    public String ddzqOrder(HttpServletRequest request) {
+
+        try {
+            String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
+            WxPayOrderNotifyResult payResult = wxPayService.parseOrderNotifyResult(xmlResult);
+            String masterOrderId = payResult.getOutTradeNo();//内部订单记录ID
+            String wxTransactionId = payResult.getTransactionId();//商户号订单ID
+            BigDecimal wxRealPayAmount = new BigDecimal(BaseWxPayResult.fenToYuan(payResult.getTotalFee()));//微信真实支付金额
+//            StOrder stOrder = stOrderMapper.selectByEOrderId(masterOrderId);
+//            Date nowTime = new Date();
+//            if(stOrder.getPayStatus() == 1){
+//                //下一个进程进来的时候,上一个进程已经修改了订单支付状态
+//
+//                return WxPayNotifyResponse.success("处理成功!");
+//            }
+//            StOrder orderRequest = new StOrder();
+//            orderRequest.setPayStatus(1);//标记已支付
+//            orderRequest.setMasterOrderId(masterOrderId);
+//            orderRequest.setPaymentTime(nowTime);
+//            orderRequest.setStoreReceiveTime(nowTime);
+//            orderRequest.setOrderStatus(10);  //等待顾客取货
+//            stOrderMapper.updateByMasterOrderIdSelective(orderRequest);
+//            StOrderPay stOrderPay = new StOrderPay();
+//            stOrderPay.setMasterOrderId(masterOrderId);
+//            stOrderPay.setWxRealPayAmount(wxRealPayAmount);
+//            stOrderPay.setWxTransactionId(wxTransactionId);
+//            stOrderPay.setPayWay(1); //支付方式    微信支付:1    支付宝支付:2
+//            stOrderPayMapper.insert(stOrderPay);
+//
+//            /**
+//             * 打印订单
+//             */
+//            List<StPrinter> stPrinterList = stPrinterMapper.selectPrintersByStoreId(stOrder.getStoreId());
+//            for (StPrinter stPrinter:stPrinterList) {
+//                stPrinterService.printOrder(stOrder.getEOrderId(),stOrder.getStoreId(),stPrinter.getOkPrinterSn());
+//            }
+
+            log.info("微信支付,回调处理成功");
+            return WxPayNotifyResponse.success("处理成功!");
+        } catch (Exception e) {
+            e.printStackTrace();
+            return WxPayNotifyResponse.fail(e.getMessage());
+        }
+
+    }
+}

+ 41 - 0
data-easy/src/main/java/com/dataeasy/server/pay/WxPayConfiguration.java

@@ -0,0 +1,41 @@
+package com.dataeasy.server.pay;
+
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description TODO
+ * @date 2025/3/5 8:50
+ */
+@Configuration
+@EnableConfigurationProperties(WxPayProperties.class)
+public class WxPayConfiguration {
+
+    @Autowired
+    private WxPayProperties properties;
+
+    @Bean
+    public WxPayService wxPayService() {
+        final WxPayServiceImpl wxPayService = new WxPayServiceImpl();
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppId()));
+        payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
+        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getMchKey()));
+        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getKeyPath()));
+        //以下是apiv3以及支付分相关
+        payConfig.setApiV3Key(StringUtils.trimToNull(this.properties.getApiv3Key()));
+        payConfig.setPublicKeyId(StringUtils.trimToNull(this.properties.getPublicKeyId()));
+        payConfig.setPublicKeyPath(StringUtils.trimToNull(this.properties.getPublicKeyPath()));
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+}

+ 52 - 0
data-easy/src/main/java/com/dataeasy/server/pay/WxPayProperties.java

@@ -0,0 +1,52 @@
+package com.dataeasy.server.pay;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author tyuio
+ * @version 1.0.0
+ * @description 微信支付属性配置类
+ * @date 2025/3/5 8:42
+ */
+@Data
+@ConfigurationProperties(prefix = "wx.pay")
+public class WxPayProperties {
+
+    /**
+     * 设置微信公众号或者小程序等的appid.
+     */
+    private String appId;
+
+    /**
+     * 微信支付商户号.
+     */
+    private String mchId;
+
+    /**
+     * 微信支付商户密钥.
+     */
+    private String mchKey;
+
+    /**
+     * apiclient_cert.p12文件的绝对路径,或者如果放在项目中,请以classpath:开头指定.
+     */
+    private String keyPath;
+
+    /**
+     * apiV3秘钥
+     */
+    private String apiv3Key;
+
+    /**
+     * 公钥ID
+     */
+    private String publicKeyId;
+
+    /**
+     * pub_key.pem证书文件的绝对路径或者以classpath:开头的类路径.
+     */
+    private String publicKeyPath;
+
+}