diff --git a/src/main/java/com/ycwl/basic/annotation/RequestToFile.java b/src/main/java/com/ycwl/basic/annotation/RequestToFile.java new file mode 100644 index 0000000..1344687 --- /dev/null +++ b/src/main/java/com/ycwl/basic/annotation/RequestToFile.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(value = {ElementType.METHOD}) +public @interface RequestToFile { +} \ No newline at end of file diff --git a/src/main/java/com/ycwl/basic/aspectj/HttpSaver.java b/src/main/java/com/ycwl/basic/aspectj/HttpSaver.java new file mode 100644 index 0000000..159bde2 --- /dev/null +++ b/src/main/java/com/ycwl/basic/aspectj/HttpSaver.java @@ -0,0 +1,63 @@ +package com.ycwl.basic.aspectj; + +import com.ycwl.basic.annotation.RequestToFile; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.util.Enumeration; +import java.util.stream.Collectors; + +@Aspect +@Component +@Slf4j +public class HttpSaver { + + @Pointcut("@annotation(com.ycwl.basic.annotation.RequestToFile)") + public void requestToFilePointCut() { + } + + @After("requestToFilePointCut()") + public void requestToFile() throws Throwable { + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attributes == null) { + return; + } + HttpServletRequest request = attributes.getRequest(); + StringBuilder rawReq = new StringBuilder(); + rawReq.append(request.getMethod()).append(" ").append(request.getRequestURL()); + String queryString = request.getQueryString(); + if (queryString != null) { + rawReq.append("?").append(queryString); + } + rawReq.append("\r\n"); + Enumeration headerNames = request.getHeaderNames(); + while (headerNames.hasMoreElements()) { + String headerName = headerNames.nextElement(); + rawReq.append(headerName).append(": ").append(request.getHeader(headerName)).append("\r\n"); + } + rawReq.append("\r\n"); + // 获取body + rawReq.append(request.getReader().lines().collect(Collectors.joining("\r\n"))); + rawReq.append("\r\n"); + // 写入文件 + File file = new File("./request/"+System.currentTimeMillis()+".http"); + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + if (!file.exists()) { + file.createNewFile(); + } + try (java.io.FileWriter writer = new java.io.FileWriter(file, true)) { + writer.write(rawReq.toString()); + } + } +} diff --git a/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java b/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java index 050803e..d82274c 100644 --- a/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java +++ b/src/main/java/com/ycwl/basic/controller/mobile/AppWxPayController.java @@ -2,6 +2,8 @@ package com.ycwl.basic.controller.mobile; import com.ycwl.basic.annotation.IgnoreToken; +import com.ycwl.basic.annotation.RequestToFile; +import com.ycwl.basic.aspectj.HttpSaver; import com.ycwl.basic.enums.BizCodeEnum; import com.ycwl.basic.model.wx.WXPayOrderReqVO; import com.ycwl.basic.model.wx.WxPayRespVO; @@ -42,6 +44,7 @@ public class AppWxPayController { @ApiOperation(value = "微信支付回调", notes = "微信支付回调") @PostMapping("/payNotify") @IgnoreToken + @RequestToFile public ApiResponse payNotify(HttpServletRequest request) { wxPayService.payNotify(request); return ApiResponse.success(BizCodeEnum.REQUEST_OK); @@ -58,6 +61,7 @@ public class AppWxPayController { @ApiOperation(value = "微信支付退款回调", notes = "微信支付退款回调") @PostMapping("/refundNotify") @IgnoreToken + @RequestToFile public ApiResponse refundNotify(@RequestBody String refundResult) throws GeneralSecurityException, IOException { return ApiResponse.buildResult(wxPayService.refundNotify(refundResult) ? BizCodeEnum.SUCCESS : diff --git a/src/main/java/com/ycwl/basic/model/wx/WXPayOrderReqVO.java b/src/main/java/com/ycwl/basic/model/wx/WXPayOrderReqVO.java index 10ccebc..a45262a 100644 --- a/src/main/java/com/ycwl/basic/model/wx/WXPayOrderReqVO.java +++ b/src/main/java/com/ycwl/basic/model/wx/WXPayOrderReqVO.java @@ -26,4 +26,6 @@ public class WXPayOrderReqVO { @ApiModelProperty(value = "商品订单号",required = true) private Long orderSn; + + private String description; } diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java index b91f604..48f2643 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/GoodsServiceImpl.java @@ -1,5 +1,6 @@ package com.ycwl.basic.service.impl.mobile; +import com.ycwl.basic.constant.BaseContextHandler; import com.ycwl.basic.mapper.*; import com.ycwl.basic.model.jwt.JwtInfo; import com.ycwl.basic.model.mobile.goods.*; @@ -43,14 +44,13 @@ public class GoodsServiceImpl implements GoodsService { private FaceMapper faceMapper; public ApiResponse> goodsList(GoodsReqQuery query) { - JwtInfo worker = JwtTokenUtil.getWorker(); //查询原素材 List goodsList = new ArrayList<>(); VideoReqQuery videoReqQuery = new VideoReqQuery(); videoReqQuery.setScenicId(query.getScenicId()); videoReqQuery.setIsBuy(query.getIsBuy()); - videoReqQuery.setMemberId(worker.getUserId()); + videoReqQuery.setMemberId(Long.valueOf(BaseContextHandler.getUserId())); //查询成片vlog List videoList = videoMapper.list(videoReqQuery); videoList.forEach(videoRespVO -> { diff --git a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java index 928035f..2eac1e2 100644 --- a/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/mobile/WxPayServiceImpl.java @@ -90,13 +90,14 @@ public class WxPayServiceImpl implements WxPayService { // request.setXxx(val)设置所需参数,具体参数可见Request定义 PrepayRequest request = new PrepayRequest(); Amount amount = new Amount(); - amount.setTotal(req.getTotalPrice()); + amount.setTotal(1); request.setAmount(amount); - request.setAppid(wechatConfig.getAppId()); + request.setAppid(wechatConfig.getMiniProgramAppId()); request.setMchid(wechatConfig.getMchId()); request.setDescription(req.getGoodsName()); request.setNotifyUrl(wechatConfig.getPayNotifyUrl()); request.setOutTradeNo(req.getOrderSn().toString()); + request.setDescription(req.getDescription()); Payer payer = new Payer(); payer.setOpenid(req.getOpenId()); @@ -109,7 +110,7 @@ public class WxPayServiceImpl implements WxPayService { vo.setTimeStamp(timeStamp); String substring = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32); vo.setNonceStr(substring); - String signatureStr = Stream.of(wechatConfig.getAppId(), String.valueOf(timeStamp), substring, "prepay_id=" + response.getPrepayId()) + String signatureStr = Stream.of(wechatConfig.getMiniProgramAppId(), String.valueOf(timeStamp), substring, "prepay_id=" + response.getPrepayId()) .collect(Collectors.joining("\n", "", "\n")); String sign = WXPayUtil.getSign(signatureStr, wechatConfig.getKeyPath()); vo.setPaySign(sign); @@ -137,6 +138,7 @@ public class WxPayServiceImpl implements WxPayService { stringBuffer.append(s); } String s1 = stringBuffer.toString(); + log.warn("微信支付回调:{}", s1); String timestamp = request.getHeader(WECHAT_PAY_TIMESTAMP); String nonce = request.getHeader(WECHAT_PAY_NONCE); String signType = request.getHeader(WeiXinConstant.WECHATPAY_SIGNATURE_TYPE); @@ -145,7 +147,7 @@ public class WxPayServiceImpl implements WxPayService { NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(wechatConfig.getMchId()) - .privateKeyFromPath(wechatConfig.getKeyPath()) + .privateKey(wechatConfig.getKeyPath()) .merchantSerialNumber(wechatConfig.getMchSerialNo()) .apiV3Key(wechatConfig.getApiV3()) .build(); @@ -401,7 +403,7 @@ public class WxPayServiceImpl implements WxPayService { // 对参数进行加密 byte[] bytes = parameter.getBytes(String.valueOf(StandardCharsets.UTF_8)); Signature sign = Signature.getInstance("SHA256withRSA"); - PrivateKey privateKey = PemUtil.loadPrivateKeyFromPath(wechatConfig.getKeyPath()); // privateKeyPath是商户证书密钥的位置apiclient_key.pem + PrivateKey privateKey = PemUtil.loadPrivateKeyFromString(wechatConfig.getKeyPath()); // privateKeyPath是商户证书密钥的位置apiclient_key.pem sign.initSign(privateKey); // 商户密钥文件路径 sign.update(bytes); String signature = Base64.getEncoder().encodeToString(sign.sign()); @@ -425,7 +427,7 @@ public class WxPayServiceImpl implements WxPayService { static void init(WechatConfig wechatConfig) { instance = new RSAAutoCertificateConfig.Builder() .merchantId(wechatConfig.getMchId()) - .privateKeyFromPath(wechatConfig.getKeyPath()) + .privateKey(wechatConfig.getKeyPath()) .merchantSerialNumber(wechatConfig.getMchSerialNo()) .apiV3Key(wechatConfig.getApiV3()) .build(); diff --git a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java index 19271ad..0b5d2e8 100644 --- a/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/impl/pc/OrderServiceImpl.java @@ -130,17 +130,17 @@ public class OrderServiceImpl implements OrderService { orderItems.add(orderItemEntity); //修改商品状态 - if (Objects.equals(goodsType, GoodsTypeEnum.VIDEO.code)) { - VideoEntity videoEntity = new VideoEntity(); - videoEntity.setId(goodsId); - videoEntity.setIsBuy(1); - videoMapper.update(videoEntity); - }else if (Objects.equals(goodsType, GoodsTypeEnum.SOURCE.code)) { - SourceEntity sourceEntity = new SourceEntity(); - sourceEntity.setId(goodsId); - sourceEntity.setIsBuy(1); - sourceMapper.update(sourceEntity); - } +// if (Objects.equals(goodsType, GoodsTypeEnum.VIDEO.code)) { +// VideoEntity videoEntity = new VideoEntity(); +// videoEntity.setId(goodsId); +// videoEntity.setIsBuy(1); +// videoMapper.update(videoEntity); +// }else if (Objects.equals(goodsType, GoodsTypeEnum.SOURCE.code)) { +// SourceEntity sourceEntity = new SourceEntity(); +// sourceEntity.setId(goodsId); +// sourceEntity.setIsBuy(1); +// sourceMapper.update(sourceEntity); +// } }); int addOrderItems = orderMapper.addOrderItems(orderItems); if (addOrderItems == NumberConstant.ZERO) { @@ -157,12 +157,10 @@ public class OrderServiceImpl implements OrderService { statisticsMapper.addStatisticsRecord(statisticsRecordAddReq); - //TODO 封装微信支付请求 -// WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO); -// return ApiResponse.success(wxPayRespVO); + WxPayRespVO wxPayRespVO = initiatePayment(order, goodsDetailVO); + return ApiResponse.success(wxPayRespVO); - return ApiResponse.success(null); } } @@ -187,7 +185,8 @@ public class OrderServiceImpl implements OrderService { wxPayOrderReqVO.setOpenId(order.getOpenid()) .setOrderSn(order.getId()) .setTotalPrice(BigDecimalUtil.convertToCents(order.getPrice())) - .setGoodsName(goodsName); + .setGoodsName(goodsName) + .setDescription("VLOG视频支付"); return wxPayService.createOrder(wxPayOrderReqVO); } diff --git a/src/main/java/com/ycwl/basic/service/mobile/WxPayService.java b/src/main/java/com/ycwl/basic/service/mobile/WxPayService.java index 8c137fa..a6cf16e 100644 --- a/src/main/java/com/ycwl/basic/service/mobile/WxPayService.java +++ b/src/main/java/com/ycwl/basic/service/mobile/WxPayService.java @@ -18,7 +18,7 @@ public interface WxPayService { /** * 微信支付回调 */ - void payNotify(HttpServletRequest request); + void payNotify(HttpServletRequest xml); /** * 微信支付结果查询 diff --git a/src/main/java/com/ycwl/basic/utils/WXPayUtil.java b/src/main/java/com/ycwl/basic/utils/WXPayUtil.java index 081dd1f..56bdfe2 100644 --- a/src/main/java/com/ycwl/basic/utils/WXPayUtil.java +++ b/src/main/java/com/ycwl/basic/utils/WXPayUtil.java @@ -1,6 +1,7 @@ package com.ycwl.basic.utils; +import cn.hutool.core.util.XmlUtil; import com.wechat.pay.java.core.util.PemUtil; import org.springframework.util.Base64Utils; @@ -8,6 +9,7 @@ import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.StandardCharsets; import java.security.*; +import java.util.Map; import java.util.Random; /** @@ -26,7 +28,7 @@ public class WXPayUtil { public static String getSign(String signatureStr,String privateKey) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException, IOException, URISyntaxException { //replace 根据实际情况,不一定都需要 String replace = privateKey.replace("\\n", "\n"); - PrivateKey merchantPrivateKey = PemUtil.loadPrivateKeyFromPath(replace); + PrivateKey merchantPrivateKey = PemUtil.loadPrivateKeyFromString(replace); Signature sign = Signature.getInstance("SHA256withRSA"); sign.initSign(merchantPrivateKey); sign.update(signatureStr.getBytes(StandardCharsets.UTF_8)); @@ -46,4 +48,7 @@ public class WXPayUtil { return new String(nonceChars); } + public static Map xmlToMap(String xmlData) { + return XmlUtil.xmlToMap(xmlData); + } } diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 443716d..b47c98d 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -84,7 +84,34 @@ wx: # 退款回调接口地址 refundNotifyUrl: https://zhentuai.com/api/mobile/wx/pay/v1/refundNotify # 商户API私钥路径 - keyPath: module-app/src/main/resources/cert/apiclient_key.pem + keyPath: "-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHwDoab8iRX4vn +Ta3a+gh5Z3wcyTM3VkWhkAPJGNJhaNgzOBI9b4v1x+uSZ4To2uXhQE5hvcxWSfNZ +F7H6yp+6estADeZLpdXLBDBvPDOjEGhG7YUHJjWnFh5eY2Rtnx4/7x+xCsRS+Mtq +Mx6KMrb4UZYNIq14peTQgfICkDBdqnUIkFjDmChUy0LlsSFW8AyJIqrBec5VZWf/ +QqsIBf9vsTVxrqlX+5owYZuPYoFOIQJFUW8dfU20qk//BxiDjPFZBLNa02aIEbNF +SXZE2TlKD7zD0Qv/w95Hf1V+a/cxP2B6LNtqwioIdHbU6Axu7uHkr0RSPXPsvOWY +eUIpGP4bAgMBAAECggEBALm34w3TYtKu2D/tfDh9gkWGTuHgu6q2nrTxVmOxnWEN +/v3YIzVVsfaJs2ACuZNaeqNsi7PaqNKNnSD3o/X+UHYsVy8t/THWdSl1sqapfYUd +6yYPDkEwaG/6Y6/0j1pQt+pPpNKRpSlTwqTx9HIfZvkHuhBqbokfDNhECUQS1bUu +8pmyALIkuXu38B/xCs/EH+Lp1N69IA0mwalT/2zi9ZJhGNg5OWBzNbkMKf2Tck+9 +SnS6s+pAT6YxB9qYhg645H3dRKXdeSYbjI+uiIe/7cJvTxfQDLD/oDap2TJQH3iM +SVbSfNFbR1tH6PiYx9eXeElEg2QXEPztbf8NcUlGOGkCgYEA8PewLVzUdHD20KkX +tZP+JCvSTy2f0kPHTc3+BU+MOlG8uZzsK06efo+X5BGkMRj8P+MPp9rJQr5IJqJl +GpeA1XpF54v2DIcNcjrQHIJ9XWoWirZjMWRVn4D5laQTI+FEV8pyFfJJOLIgBe9b +c6hBHNnAB4Y6JZ/s+US4ymK4wQ0CgYEA1DZMcuyiUgjnprUsOIokpg8RxGLIvB5+ +2FyCffa/CikMRU8bRtHdpJLguArrR9rEILU6fICPARdlCg8r0XMrvniiAaS3YlDj +tSxbfrrS6xySvVFdNusv/j3i5/76IedsSArJLeQpIZMZ3n6q/dmq4kbWh+bT/5z+ +MVpjWixpYccCgYBtaEh5kDh2VgP6YYv+SZ+OVMc8Y/64vUV0sh6v0ppcsFf7/p/M +WfnkhNX2G3xtPmbpqvKkx9WxlCu2Pu2g0UERrF6o7wdcUMVuI/3xs92v2Ec72+vV +tTSbIzgvFTwLgnBBXA3IoSVVtKqNh0wCi1Zk/wkNYYhtJNu3odg1K/Wu0QKBgBOv +IbI7TucrGkm1Xm+0KKgal7xOqW4BqiRpmFUU0S2hFxlKuC3+g3+jfCK2KJLWsQCT +ruQjjKA+Skn/lEHuW+1kBSr/217MQALrJWWA8NWMJfRXmrzgXehIV0bLuOnyLHIW +Rgjys/oAShMATt4TFa29gmLCv4FjT5TGXJbdrby7AoGBAOqER71Vi90UV84sYLWx +DSW/3q5/QrndmeeaQALslA6sidnTZWqlhMsNPl8dfBKl6xnrCdcaeY5xk/xmVOqP +0KedJgT+IjLwY1yJ9QOBd02ejAY3qNlKt2NiSWv2GBY1cZxqhkHNaI/UWI9CAyH5 +YfkdFNxtYLdVAwuylMoV3fKI +-----END PRIVATE KEY-----" # 商户APIV3密钥 apiV3: ZHENTUAIzhentuaiZHENTUAIzhentuai diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index ce38b7b..80ab562 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -55,11 +55,9 @@ mybatis-plus: # 开启驼峰命名法 map-underscore-to-camel-case: true use-generated-keys: true - # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 指定使用的日志配置文件 logging: - config: classpath:logback-spring.xml + config: classpath:logback-spring-prod.xml # 微信小程序相关配置 wx: # 公众号的appId @@ -84,7 +82,34 @@ wx: # 退款回调接口地址 refundNotifyUrl: https://zhentuai.com/api/mobile/wx/pay/v1/refundNotify # 商户API私钥路径 - keyPath: module-app/src/main/resources/cert/apiclient_key.pem + keyPath: "-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDHwDoab8iRX4vn +Ta3a+gh5Z3wcyTM3VkWhkAPJGNJhaNgzOBI9b4v1x+uSZ4To2uXhQE5hvcxWSfNZ +F7H6yp+6estADeZLpdXLBDBvPDOjEGhG7YUHJjWnFh5eY2Rtnx4/7x+xCsRS+Mtq +Mx6KMrb4UZYNIq14peTQgfICkDBdqnUIkFjDmChUy0LlsSFW8AyJIqrBec5VZWf/ +QqsIBf9vsTVxrqlX+5owYZuPYoFOIQJFUW8dfU20qk//BxiDjPFZBLNa02aIEbNF +SXZE2TlKD7zD0Qv/w95Hf1V+a/cxP2B6LNtqwioIdHbU6Axu7uHkr0RSPXPsvOWY +eUIpGP4bAgMBAAECggEBALm34w3TYtKu2D/tfDh9gkWGTuHgu6q2nrTxVmOxnWEN +/v3YIzVVsfaJs2ACuZNaeqNsi7PaqNKNnSD3o/X+UHYsVy8t/THWdSl1sqapfYUd +6yYPDkEwaG/6Y6/0j1pQt+pPpNKRpSlTwqTx9HIfZvkHuhBqbokfDNhECUQS1bUu +8pmyALIkuXu38B/xCs/EH+Lp1N69IA0mwalT/2zi9ZJhGNg5OWBzNbkMKf2Tck+9 +SnS6s+pAT6YxB9qYhg645H3dRKXdeSYbjI+uiIe/7cJvTxfQDLD/oDap2TJQH3iM +SVbSfNFbR1tH6PiYx9eXeElEg2QXEPztbf8NcUlGOGkCgYEA8PewLVzUdHD20KkX +tZP+JCvSTy2f0kPHTc3+BU+MOlG8uZzsK06efo+X5BGkMRj8P+MPp9rJQr5IJqJl +GpeA1XpF54v2DIcNcjrQHIJ9XWoWirZjMWRVn4D5laQTI+FEV8pyFfJJOLIgBe9b +c6hBHNnAB4Y6JZ/s+US4ymK4wQ0CgYEA1DZMcuyiUgjnprUsOIokpg8RxGLIvB5+ +2FyCffa/CikMRU8bRtHdpJLguArrR9rEILU6fICPARdlCg8r0XMrvniiAaS3YlDj +tSxbfrrS6xySvVFdNusv/j3i5/76IedsSArJLeQpIZMZ3n6q/dmq4kbWh+bT/5z+ +MVpjWixpYccCgYBtaEh5kDh2VgP6YYv+SZ+OVMc8Y/64vUV0sh6v0ppcsFf7/p/M +WfnkhNX2G3xtPmbpqvKkx9WxlCu2Pu2g0UERrF6o7wdcUMVuI/3xs92v2Ec72+vV +tTSbIzgvFTwLgnBBXA3IoSVVtKqNh0wCi1Zk/wkNYYhtJNu3odg1K/Wu0QKBgBOv +IbI7TucrGkm1Xm+0KKgal7xOqW4BqiRpmFUU0S2hFxlKuC3+g3+jfCK2KJLWsQCT +ruQjjKA+Skn/lEHuW+1kBSr/217MQALrJWWA8NWMJfRXmrzgXehIV0bLuOnyLHIW +Rgjys/oAShMATt4TFa29gmLCv4FjT5TGXJbdrby7AoGBAOqER71Vi90UV84sYLWx +DSW/3q5/QrndmeeaQALslA6sidnTZWqlhMsNPl8dfBKl6xnrCdcaeY5xk/xmVOqP +0KedJgT+IjLwY1yJ9QOBd02ejAY3qNlKt2NiSWv2GBY1cZxqhkHNaI/UWI9CAyH5 +YfkdFNxtYLdVAwuylMoV3fKI +-----END PRIVATE KEY-----" # 商户APIV3密钥 apiV3: ZHENTUAIzhentuaiZHENTUAIzhentuai diff --git a/src/main/resources/logback-spring-prod.xml b/src/main/resources/logback-spring-prod.xml new file mode 100644 index 0000000..5566fda --- /dev/null +++ b/src/main/resources/logback-spring-prod.xml @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) --- [%15.15(%thread)] %cyan(%-40.40(%logger{40})) : %msg%n + + UTF-8 + + + + + + + + + + logs/project_info.log + + true + + ERROR + DENY + ACCEPT + + + + + + + logs/project_info.%d.%i.log + + 30 + + 20GB + + 10MB + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n + + UTF-8 + + + + + + + + + + logs/project_error.log + + true + + + ERROR + + + + + + + logs/project_error.%d.%i.log + + 30 + + 20GB + + 10MB + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n + + UTF-8 + + + + + logs/project_sql.log + true + + DEBUG + + + logs/project_sql.%d.%i.log + 30 + 20GB + 10MB + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level --- [%15.15(%thread)] %-40.40(%logger{40}) : %msg%n + UTF-8 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file