Browse Source

1、日志文件配置修改
2、异常栈帧打印
3、微信支付证书路径修改

zuy 2 years ago
parent
commit
115a1ed671

+ 4 - 2
common/src/main/java/com/kym/common/handler/GlobalExceptionHandler.java

@@ -42,6 +42,7 @@ public class GlobalExceptionHandler {
     @ExceptionHandler(value = BusinessException.class)
     @ResponseBody
     public R handleBusinessException(BaseException e) {
+        LOGGER.error(e.getMessage(),e);
         return R.failed(e.getCode(), e.getMessage());
     }
 
@@ -55,7 +56,7 @@ public class GlobalExceptionHandler {
     @ResponseBody
     public R<Null> handleBaseException(BaseException e) {
 
-
+        LOGGER.error(e.getMessage(),e);
         return R.failed();
     }
 
@@ -88,7 +89,7 @@ public class GlobalExceptionHandler {
         } else {
             message = NotLoginException.DEFAULT_MESSAGE;
         }
-        LOGGER.error("登录异常:{}", message);
+        LOGGER.error("登录异常:"+ message,e);
         return R.failed(LOGIN_FAILED.getCode(), message);
     }
 
@@ -127,6 +128,7 @@ public class GlobalExceptionHandler {
             message = ((BindException) e).getAllErrors().stream().map(ObjectError::getDefaultMessage)
                     .collect(Collectors.joining("; "));
         }
+        LOGGER.error(e.getMessage(),e);
         return R.failed(HttpStatus.BAD_REQUEST.value(), message);
     }
 

+ 2 - 2
miniapp/src/main/resources/application.yml

@@ -96,8 +96,8 @@ wechat:
     notifyUrl: https://www.kuaiyuman.cn/api/payment/notify
 #    certPath: /data/wwwroot/charge/config/cert/apiclient_cert.pem
 #    keyPath: /data/wwwroot/charge/config/cert/apiclient_key.pem
-    certPath: classpath:apiclient_cert.pem
-    keyPath: classpath:apiclient_key.pem
+    certPath: cert/apiclient_cert.pem
+    keyPath: cert/apiclient_key.pem
 
   miniapp:
     appid: wx369fcff95d387bde

+ 26 - 197
miniapp/src/main/resources/logback-spring.xml

@@ -1,207 +1,36 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE configuration>
-<configuration>
-    <!--引用默认日志配置-->
-    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
-    <!--使用默认的控制台日志输出实现-->
-<!--    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>-->
-    <!--应用名称-->
-    <springProperty scope="context" name="APP_NAME" source="spring.application.name" defaultValue="springBoot"/>
-    <!--日志文件保存路径-->
-    <property name="LOG_FILE_PATH" value="/data/logs/miniapp"/>
-<!--    <property name="LOG_FILE_PATH" value="opt/logs/miniapp"/>   -->
-    <!--LogStash访问host-->
-    <!--    <springProperty name="LOG_STASH_HOST" scope="context" source="logstash.host" defaultValue="localhost"/>-->
-    <!--是否开启LogStash插件内部日志-->
-    <!--    <springProperty name="ENABLE_INNER_LOG" scope="context" source="logstash.enableInnerLog" defaultValue="false"/>-->
-
-    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <contextName>logback</contextName>
+    <property name="log.path" value="logs/miniapp/miniapp.log"/>
+    <property name="CONSOLE_LOG_PATTERN"
+              value="%date{yyyy-MM-dd HH:mm:ss} | %highlight(%-5level) | %boldYellow(%thread) | %boldGreen(%logger) | %msg%n"/>
+    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
         <encoder>
             <pattern>%d{HH:mm:ss.SSS}|%thread|%-5level|%logger{36}|%X{ip}|%X{seq}|%msg%n</pattern>
         </encoder>
     </appender>
-
-    <!--DEBUG日志输出到文件-->
-    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!--输出DEBUG以上级别日志-->
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>DEBUG</level>
-        </filter>
-        <encoder>
-            <!--设置为默认的文件日志格式-->
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
-        </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <!--设置文件命名格式-->
-            <fileNamePattern>${LOG_FILE_PATH}/debug/${APP_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
-            <!--设置日志文件大小,超过就重新生成文件,默认10M-->
-            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
-            <!--日志文件保留天数,默认30天-->
-            <maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory>
+    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>./logs/miniapp/miniapp-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
-    </appender>
-
-    <!--ERROR日志输出到文件-->
-    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!--只输出ERROR级别的日志-->
-        <filter class="ch.qos.logback.classic.filter.LevelFilter">
-            <level>ERROR</level>
-            <onMatch>ACCEPT</onMatch>
-            <onMismatch>DENY</onMismatch>
-        </filter>
         <encoder>
-            <!--设置为默认的文件日志格式-->
-            <pattern>${FILE_LOG_PATTERN}</pattern>
-            <charset>UTF-8</charset>
+            <pattern>%d{HH:mm:ss.SSS}|%thread|%-5level|%logger{36}|%X{ip}|%X{seq}|%msg%n</pattern>
         </encoder>
-        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-            <!--设置文件命名格式-->
-            <fileNamePattern>${LOG_FILE_PATH}/error/${APP_NAME}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
-            <!--设置日志文件大小,超过就重新生成文件,默认10M-->
-            <maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
-            <!--日志文件保留天数,默认30天-->
-            <maxHistory>${LOG_FILE_MAX_HISTORY:-30}</maxHistory>
-        </rollingPolicy>
     </appender>
-
-    <!--DEBUG日志输出到LogStash-->
-<!--   <appender name="LOG_STASH_DEBUG" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
-<!--        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
-<!--            <level>DEBUG</level>-->
-<!--        </filter>-->
-<!--        <destination>${LOG_STASH_HOST}:4560</destination>-->
-<!--        <addDefaultStatusListener>${ENABLE_INNER_LOG}</addDefaultStatusListener>-->
-<!--        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">-->
-<!--            <providers>-->
-<!--                <timestamp>-->
-<!--                    <timeZone>Asia/Shanghai</timeZone>-->
-<!--                </timestamp>-->
-<!--                &lt;!&ndash;自定义日志输出格式&ndash;&gt;-->
-<!--                <pattern>-->
-<!--                    <pattern>-->
-<!--                        {-->
-<!--                        "project": "mall",-->
-<!--                        "level": "%level",-->
-<!--                        "service": "${APP_NAME:-}",-->
-<!--                        "pid": "${PID:-}",-->
-<!--                        "thread": "%thread",-->
-<!--                        "class": "%logger",-->
-<!--                        "message": "%message",-->
-<!--                        "stack_trace": "%exception{20}"-->
-<!--                        }-->
-<!--                    </pattern>-->
-<!--                </pattern>-->
-<!--            </providers>-->
-<!--        </encoder>-->
-<!--    </appender>-->
-
-    <!--ERROR日志输出到LogStash-->
-<!--    <appender name="LOG_STASH_ERROR" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
-<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
-<!--            <level>ERROR</level>-->
-<!--            <onMatch>ACCEPT</onMatch>-->
-<!--            <onMismatch>DENY</onMismatch>-->
-<!--        </filter>-->
-<!--        <destination>${LOG_STASH_HOST}:4561</destination>-->
-<!--        <addDefaultStatusListener>${ENABLE_INNER_LOG}</addDefaultStatusListener>-->
-<!--        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">-->
-<!--            <providers>-->
-<!--                <timestamp>-->
-<!--                    <timeZone>Asia/Shanghai</timeZone>-->
-<!--                </timestamp>-->
-<!--                &lt;!&ndash;自定义日志输出格式&ndash;&gt;-->
-<!--                <pattern>-->
-<!--                    <pattern>-->
-<!--                        {-->
-<!--                        "project": "mall",-->
-<!--                        "level": "%level",-->
-<!--                        "service": "${APP_NAME:-}",-->
-<!--                        "pid": "${PID:-}",-->
-<!--                        "thread": "%thread",-->
-<!--                        "class": "%logger",-->
-<!--                        "message": "%message",-->
-<!--                        "stack_trace": "%exception{20}"-->
-<!--                        }-->
-<!--                    </pattern>-->
-<!--                </pattern>-->
-<!--            </providers>-->
-<!--        </encoder>-->
-<!--    </appender>-->
-
-    <!--业务日志输出到LogStash-->
-<!--    <appender name="LOG_STASH_BUSINESS" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
-<!--        <destination>${LOG_STASH_HOST}:4562</destination>-->
-<!--        <addDefaultStatusListener>${ENABLE_INNER_LOG}</addDefaultStatusListener>-->
-<!--        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">-->
-<!--            <providers>-->
-<!--                <timestamp>-->
-<!--                    <timeZone>Asia/Shanghai</timeZone>-->
-<!--                </timestamp>-->
-<!--                &lt;!&ndash;自定义日志输出格式&ndash;&gt;-->
-<!--                <pattern>-->
-<!--                    <pattern>-->
-<!--                        {-->
-<!--                        "project": "mall",-->
-<!--                        "level": "%level",-->
-<!--                        "service": "${APP_NAME:-}",-->
-<!--                        "pid": "${PID:-}",-->
-<!--                        "thread": "%thread",-->
-<!--                        "class": "%logger",-->
-<!--                        "message": "%message",-->
-<!--                        "stack_trace": "%exception{20}"-->
-<!--                        }-->
-<!--                    </pattern>-->
-<!--                </pattern>-->
-<!--            </providers>-->
-<!--        </encoder>-->
-<!--    </appender>-->
-
-    <!--接口访问记录日志输出到LogStash-->
-<!--    <appender name="LOG_STASH_RECORD" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
-<!--        <destination>${LOG_STASH_HOST}:4563</destination>-->
-<!--        <addDefaultStatusListener>${ENABLE_INNER_LOG}</addDefaultStatusListener>-->
-<!--        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">-->
-<!--            <providers>-->
-<!--                <timestamp>-->
-<!--                    <timeZone>Asia/Shanghai</timeZone>-->
-<!--                </timestamp>-->
-<!--                &lt;!&ndash;自定义日志输出格式&ndash;&gt;-->
-<!--                <pattern>-->
-<!--                    <pattern>-->
-<!--                        {-->
-<!--                        "project": "mall",-->
-<!--                        "level": "%level",-->
-<!--                        "service": "${APP_NAME:-}",-->
-<!--                        "class": "%logger",-->
-<!--                        "message": "%message"-->
-<!--                        }-->
-<!--                    </pattern>-->
-<!--                </pattern>-->
-<!--            </providers>-->
-<!--        </encoder>-->
-<!--    </appender>-->
-
-    <!--控制框架输出日志-->
-<!--    <logger name="org.slf4j" level="INFO"/>-->
-    <logger name="springfox" level="INFO"/>
-    <logger name="io.swagger" level="INFO"/>
-    <logger name="org.springframework" level="INFO"/>
-    <logger name="org.hibernate.validator" level="INFO"/>
-
-    <root level="DEBUG">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE_DEBUG"/>
-        <appender-ref ref="FILE_ERROR"/>
-<!--        <appender-ref ref="LOG_STASH_DEBUG"/>-->
-<!--        <appender-ref ref="LOG_STASH_ERROR"/>-->
+    <!-- <logger name="org.springframework.web" level="DEBUG"/> -->
+    <logger name="org.springframework" level="info"/>
+    <logger name="org.hibernate" level="info"/>
+    <logger name="druid.sql" level="info"/>
+    <!--        <logger name="druid.sql.ResultSet" level="info"/>-->
+    <!--        <logger name="com.png.central.mapper.ExtMapper" level="info"/>-->
+    <logger name="org.mybatis" level="info"/>
+    <logger name="org.apache.ibatis" level="info"/>
+    <logger name="io.netty" level="info"/>
+    <logger name="springfox.documentation" level="warn"/>
+    <logger name="org.apache.http" level="info"/>
+    <root level="debug">
+        <appender-ref ref="console"/>
+        <appender-ref ref="file"/>
     </root>
-
-<!--    <logger name="com.kym.charge.aspect.com.kym.common.SysLogAspect" level="DEBUG">-->
-<!--        <appender-ref ref="LOG_STASH_RECORD"/>-->
-<!--    </logger>-->
-
-<!--    <logger name="com.kym.charge" level="DEBUG">-->
-<!--        <appender-ref ref="LOG_STASH_BUSINESS"/>-->
-<!--    </logger>-->
-</configuration>
+</configuration>

+ 23 - 3
service/src/main/java/com/kym/service/wechat/impl/WxPayServiceImpl.java

@@ -1,6 +1,7 @@
 package com.kym.service.wechat.impl;
 
 import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.io.IoUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.kym.common.config.WxPayConfig;
 import com.kym.common.constant.ResponseEnum;
@@ -17,19 +18,30 @@ import com.wechat.pay.java.core.notification.NotificationConfig;
 import com.wechat.pay.java.core.notification.NotificationParser;
 import com.wechat.pay.java.core.notification.RequestParam;
 import com.wechat.pay.java.service.payments.jsapi.JsapiService;
-import com.wechat.pay.java.service.payments.jsapi.model.*;
+import com.wechat.pay.java.service.payments.jsapi.model.Amount;
+import com.wechat.pay.java.service.payments.jsapi.model.CloseOrderRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.Payer;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.PrepayResponse;
+import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByIdRequest;
+import com.wechat.pay.java.service.payments.jsapi.model.QueryOrderByOutTradeNoRequest;
 import com.wechat.pay.java.service.payments.model.Transaction;
 import jakarta.annotation.PostConstruct;
 import jakarta.servlet.http.HttpServletRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.io.ClassPathResource;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Service;
 
 import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
 
 /**
  * @author skyline
@@ -67,10 +79,18 @@ public class WxPayServiceImpl implements WxPayService {
 
 
     @PostConstruct
-    void init() {
+    void init() throws IOException {
+        String privateKey;
+        File file = new File(conf.getKeyPath());
+        if (file.exists()) {
+            privateKey = IoUtil.read(new FileInputStream(file), StandardCharsets.UTF_8);
+        } else {
+            ClassPathResource resource = new ClassPathResource(conf.getKeyPath());
+            privateKey = IoUtil.read(resource.getInputStream(), StandardCharsets.UTF_8);
+        }
         config = new RSAAutoCertificateConfig.Builder()
                 .merchantId(conf.getMchid()) // 商户号
-                .privateKeyFromPath(conf.getKeyPath()) // 商户API私钥路径
+                .privateKey(privateKey)//商户API私钥路径
                 .merchantSerialNumber(conf.getMchsn()) // 商户证书序列号
                 .apiV3Key(conf.getV3key()) // 商户APIV3密钥
                 .build();