Browse Source

代码调整

baolei 7 months ago
parent
commit
f489145ccd
19 changed files with 294 additions and 95 deletions
  1. 6 0
      08.src/Xingxi/pom.xml
  2. 46 0
      08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/ETradeState.java
  3. 5 16
      08.src/Xingxi/xingxi-miniprogram-api/pom.xml
  4. 0 36
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/common/BaseApiController.java
  5. 0 1
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/configuration/WxMpProperties.java
  6. 12 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/configuration/security/JwtAuthenticationFilter.java
  7. 11 11
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/controller/HomepageApiController.java
  8. 94 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/controller/OrderApiController.java
  9. 15 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/data/mapper/WxApiOrderMapper.java
  10. 13 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/data/mapper/WxApiPaymentInfoMapper.java
  11. 7 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/OrderServiceI.java
  12. 2 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/ProdServiceI.java
  13. 0 3
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/MySqlDBCacheServiceImpl.java
  14. 21 6
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/OrderApiServiceImpl.java
  15. 25 1
      08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/ProdApiServiceImpl.java
  16. 10 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/META-INF/sqlmap/WxApiOrderMapper.xml
  17. 13 0
      08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/META-INF/sqlmap/WxApiPaymentInfoMapper.xml
  18. 12 19
      08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/application-local.yml
  19. 2 2
      08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/PaymentInfo/domain/PaymentInfo.java

+ 6 - 0
08.src/Xingxi/pom.xml

@@ -39,6 +39,7 @@
         <logback.version>1.2.13</logback.version>
         <spring-framework.version>5.3.39</spring-framework.version>
         <oss-client.version>3.10.2</oss-client.version>
+        <wechatpay.version>4.5.6.B</wechatpay.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -255,6 +256,11 @@
                 <artifactId>aliyun-sdk-oss</artifactId>
                 <version>${oss-client.version}</version>
             </dependency>
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>wx-java-pay-spring-boot-starter</artifactId>
+                <version>${wechatpay.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 

+ 46 - 0
08.src/Xingxi/xingxi-common/src/main/java/com/xingxi/common/enums/ETradeState.java

@@ -0,0 +1,46 @@
+package com.xingxi.common.enums;
+
+/**
+ * @program: fmp
+ * @description: 交易状态
+ * @author: fmp
+ * @create: 2023-10-28 22:10
+ */
+public enum ETradeState implements BaseEnum {
+
+    SUCCESS("SUCCESS", "支付成功"),
+    REFUND("REFUND", "转入退款"),
+    NOTPAY("NOTPAY", "未支付"),
+    CLOSED("CLOSED", "已关闭"),
+    REVOKED("REVOKED", "已撤销(付款码支付)"),
+    USERPAYING("USERPAYING", "用户支付中(付款码支付)"),
+    PAYERROR("PAYERROR", "支付失败(其他原因,如银行返回失败)");
+
+    private String val;
+    private String desc;
+
+    ETradeState(String val, String desc) {
+        this.val = val;
+        this.desc = desc;
+    }
+
+    @Override
+    public String getVal() {
+        return val;
+    }
+
+    @Override
+    public String getDesc() {
+        return desc;
+    }
+
+    /** 解析*/
+    public static ETradeState parse(String val) {
+        for(ETradeState type : ETradeState.values()) {
+            if(type.getVal().equalsIgnoreCase(val)) {
+                return type;
+            }
+        }
+        return null;
+    }
+}

+ 5 - 16
08.src/Xingxi/xingxi-miniprogram-api/pom.xml

@@ -105,6 +105,11 @@
             <version>4.6.0</version>
         </dependency>
         <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>wx-java-pay-spring-boot-starter</artifactId>
+            <version>4.5.6.B</version>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-configuration-processor</artifactId>
             <optional>true</optional>
@@ -124,22 +129,6 @@
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>com.jhlabs</groupId>
-            <artifactId>filters</artifactId>
-            <version>2.0.235-1</version>
-        </dependency>
-        <dependency>
-            <groupId>net.coobird</groupId>
-            <artifactId>thumbnailator</artifactId>
-            <version>0.4.16</version>
-        </dependency>
-        <dependency>
-            <groupId>com.github.binarywang</groupId>
-            <artifactId>weixin-java-pay</artifactId>
-            <version>4.5.6.B</version>
-            <scope>compile</scope>
-        </dependency>
     </dependencies>
 
     <build>

+ 0 - 36
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/common/BaseApiController.java

@@ -22,41 +22,5 @@ public abstract class BaseApiController {
     protected UserContext getUserContext() {
         Authentication authentication = getAuthentication();
         return (UserContext) authentication.getPrincipal();
-
-//        Object principal = authentication.getPrincipal();
-//        if (!(principal instanceof SysUser)) {
-//            log.debug("未登录[" + principal + "]");
-//            throw new RuntimeException("未登录");
-//        }
-//
-//        SysUser sysUser = (SysUser) principal;
-//        Long sellerId = sysUser.getSellerId();
-//
-//        MercDTO mercDTO = merchantRepository.selectMercByMercId(sellerId);
-//        if (mercDTO == null) {
-//            log.debug("商户[" + sellerId + "]不存在");
-//            throw new RuntimeException("商户不存在");
-//        }
-//
-//        SysDept sysDept = sysDeptMapper.selectDeptById(sellerId);
-//        mercDTO.setParentMercId(sysDept.getParentId());
-//        mercDTO.setAfterContacter(sysDept.getAfterContacter());
-//        mercDTO.setAfterMobile(sysDept.getAfterMobile());
-//        mercDTO.setAfterAddress(sysDept.getAfterAddress());
-//
-//        return new UserContext(
-//                sysUser.getUserId(),
-//                sysUser.getUserName(),
-//                sysUser.getSex(),
-//                sysUser.getAvatar(),
-//                sysUser.getUserType(),
-//                sysUser.getWxOpenId(),
-//                sysUser.getPhonenumber(),
-//                sysUser.getWxSessionKey(),
-//                mercDTO
-//        );
-
-
     }
-
 }

+ 0 - 1
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/configuration/WxMpProperties.java

@@ -4,7 +4,6 @@ import lombok.Data;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 
 @Data
-//@ConfigurationProperties(prefix = "spring.application.biandan.unifiedpay.wxpay")
 @ConfigurationProperties(prefix = "wx.mp")
 public class WxMpProperties {
 

+ 12 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/configuration/security/JwtAuthenticationFilter.java

@@ -12,16 +12,28 @@ import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
+import java.util.stream.Stream;
 
 @Slf4j
 @RequiredArgsConstructor
 class JwtAuthenticationFilter extends OncePerRequestFilter {
     private final JwtAuthenticationConverter authenticationConverter = new JwtAuthenticationConverter();
     private final JwtAuthenticationManager jwtAuthenticationManager;
+    final String[] ignoreUrls = { "/api/store/order/wxpay/callback" };
 
     @Override
     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
         log.debug("JwtAuthenticationFilter.doFilterInternal()...");
+
+        HttpServletRequest httpRequest = (HttpServletRequest) request;
+        String servletPath = request.getServletPath();
+
+        boolean exists = Stream.of(ignoreUrls).anyMatch(s -> servletPath.contains(s));
+        if (exists) {
+            filterChain.doFilter(httpRequest, response);
+            return;
+        }
+
         try {
             UsernamePasswordAuthenticationToken authRequest = this.authenticationConverter.convert(request);
             if (authRequest != null) {

+ 11 - 11
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/controller/HomepageApiController.java

@@ -2,6 +2,7 @@ package com.xingxi.api.controller;
 
 import com.xingxi.api.common.BaseApiController;
 import com.xingxi.api.model.*;
+import com.xingxi.api.service.ProdServiceI;
 import com.xingxi.business.Banner.domain.Banner;
 import com.xingxi.business.Banner.service.IBannerService;
 import com.xingxi.business.NewProd.domain.NewProd;
@@ -16,8 +17,7 @@ import com.xingxi.master.ipInfo.service.IIpInfoService;
 import com.xingxi.master.product.domain.ProdClass;
 import com.xingxi.master.product.domain.ProdPic;
 import com.xingxi.master.product.service.IProdClassService;
-import com.xingxi.master.product.service.impl.ProdPicServiceImpl;
-import com.xingxi.system.service.ISysConfigService;
+import com.xingxi.master.product.service.IProdPicService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -35,12 +35,12 @@ public class HomepageApiController extends BaseApiController {
 
     private final IBannerService bannerService;
     private final IIpInfoService ipInfoService;
-    private final ISysConfigService configService;
     private final IProdClassService prodClassService;
     private final IPopularProdService leftProdService;
     private final ISuggestProdService middleProdService;
     private final INewProdService rightProdService;
-    private final ProdPicServiceImpl prodPicServiceImpl;
+    private final IProdPicService prodPicService;
+    private final ProdServiceI prodService;
 
     @GetMapping("/banners")
     public BannerResponse getBanners(){
@@ -64,10 +64,10 @@ public class HomepageApiController extends BaseApiController {
 
         List<String> rtn = new ArrayList<>();
 
-        // TODO title的key待确认,数据库中未创建数据
-        rtn.add(configService.selectConfigByKey("title.left"));
-        rtn.add(configService.selectConfigByKey("title.middle"));
-        rtn.add(configService.selectConfigByKey("title.right"));
+//        // TODO title的key待确认,数据库中未创建数据
+        rtn.add(prodService.selectConfigByKey("title.left"));
+        rtn.add(prodService.selectConfigByKey("title.middle"));
+        rtn.add(prodService.selectConfigByKey("title.right"));
 
         return new SysConfigResponse(rtn);
     }
@@ -92,7 +92,7 @@ public class HomepageApiController extends BaseApiController {
             condPic.setProdId(leftProd.getProdId());
             condPic.setDelFlag(EDelFlag.NO.getVal());
 
-            List<ProdPic> picList = prodPicServiceImpl.selectProdPicList(condPic);
+            List<ProdPic> picList = prodPicService.selectProdPicList(condPic);
             prodResponse.setProdPicList(picList);
 
             prodList.add(prodResponse);
@@ -121,7 +121,7 @@ public class HomepageApiController extends BaseApiController {
             condPic.setProdId(leftProd.getProdId());
             condPic.setDelFlag(EDelFlag.NO.getVal());
 
-            List<ProdPic> picList = prodPicServiceImpl.selectProdPicList(condPic);
+            List<ProdPic> picList = prodPicService.selectProdPicList(condPic);
             prodResponse.setProdPicList(picList);
 
             prodList.add(prodResponse);
@@ -150,7 +150,7 @@ public class HomepageApiController extends BaseApiController {
             condPic.setProdId(leftProd.getProdId());
             condPic.setDelFlag(EDelFlag.NO.getVal());
 
-            List<ProdPic> picList = prodPicServiceImpl.selectProdPicList(condPic);
+            List<ProdPic> picList = prodPicService.selectProdPicList(condPic);
             prodResponse.setProdPicList(picList);
 
             prodList.add(prodResponse);

+ 94 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/controller/OrderApiController.java

@@ -1,19 +1,37 @@
 package com.xingxi.api.controller;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.xingxi.api.common.BaseApiController;
 import com.xingxi.api.model.OrderCreateRequest;
 import com.xingxi.api.model.OrderCreateResponse;
 import com.xingxi.api.model.OrderQueryRequest;
 import com.xingxi.api.model.OrderQueryResponse;
 import com.xingxi.api.service.OrderServiceI;
+import com.xingxi.business.Order.domain.Order;
+import com.xingxi.business.Order.service.IOrderService;
+import com.xingxi.business.PaymentInfo.domain.PaymentInfo;
+import com.xingxi.business.PaymentInfo.service.IPaymentInfoService;
+import com.xingxi.common.enums.EOrderStatus;
+import com.xingxi.common.enums.ETradeState;
+import com.xingxi.common.utils.DateUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StreamUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.HashMap;
 
 @Slf4j
 @RequiredArgsConstructor
@@ -22,6 +40,14 @@ import javax.validation.Valid;
 public class OrderApiController extends BaseApiController {
 
     private final OrderServiceI orderServiceI;
+    @Autowired
+    private IPaymentInfoService paymentInfoService;
+    @Autowired
+    private WxPayService wxPayService;
+    @Autowired
+    private IOrderService orderService;
+    @Autowired
+    private ObjectMapper objectMapper;
 
     @PostMapping("/orders")
     public OrderQueryResponse getOrderList(@Valid @RequestBody OrderQueryRequest request) {
@@ -34,4 +60,72 @@ public class OrderApiController extends BaseApiController {
         return orderServiceI.create(getUserContext(), request);
     }
 
+    // 微信支付支付通知接口
+    @PostMapping("/wxpay/callback")
+    public void callback(HttpServletRequest request, HttpServletResponse response) {
+        Date nowDate = DateUtils.getNowDate();
+
+        try {
+            String notifyData = StreamUtils.copyToString(request.getInputStream(), StandardCharsets.UTF_8);
+            WxPayNotifyV3Result rV3Result = wxPayService.parseOrderNotifyV3Result(notifyData, null);
+            WxPayNotifyV3Result.DecryptNotifyResult result = rV3Result.getResult();
+            String outTradeNo = result.getOutTradeNo();
+
+            // 通过outTradeNo查找paymentInfo
+            PaymentInfo paymentInfo = orderServiceI.selectPaymentInfoByOutTradeNo(outTradeNo);
+
+            // 通过outTradeNo更新订单状态
+            Order order = orderService.selectOrderByOrderId(paymentInfo.getOrderId());
+
+            if (EOrderStatus.PAYED.getVal().equals(order.getOrderStatus())) {
+                // 如果状态已修改,则返回
+                return;
+            }
+
+            paymentInfo.setSuccessTime(nowDate);
+            paymentInfo.setTransactionId(result.getTransactionId());
+            paymentInfo.setTradeType(result.getTradeType());
+            paymentInfo.setTradeState(result.getTradeState());
+            paymentInfo.setTradeStateDesc(result.getTradeStateDesc());
+            paymentInfo.setBankType(result.getBankType());
+            paymentInfo.setSuccessTime(DateUtils.parseDate(result.getSuccessTime()));
+
+            paymentInfo.setUpdateUser("WXPAY");
+            paymentInfo.setUpdateTime(nowDate);
+
+            paymentInfoService.updatePaymentInfo(paymentInfo);
+
+            if (ETradeState.SUCCESS.getVal().equals(result.getTradeState())) {
+                // 支付成功
+                //锁数据 for update
+                order = orderServiceI.lockOrderByPrescId(order.getOrderId());
+
+                order.setPayTime(nowDate);
+                order.setOrderStatus(EOrderStatus.PAYED.getVal());
+                order.setUpdateTime(nowDate);
+                order.setUpdateUser("WXPAY");
+                orderService.updateOrder(order);
+
+            }
+
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            try {
+                buildFailResult(response);
+            } catch (Exception e1) {
+                log.error(e1.getMessage());
+            }
+        }
+    }
+
+    private void buildFailResult(HttpServletResponse response) throws Exception {
+        response.setStatus(400);
+        response.getWriter().write(objectMapper.writeValueAsString(new HashMap<String, String>() {
+            {
+                put("code", "FAIL");
+                put("message", "失败");
+            }
+        }));
+    }
+
 }

+ 15 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/data/mapper/WxApiOrderMapper.java

@@ -0,0 +1,15 @@
+package com.xingxi.api.data.mapper;
+
+import com.xingxi.business.Order.domain.Order;
+import com.xingxi.business.Order.mapper.OrderMapper;
+import com.xingxi.business.PaymentInfo.domain.PaymentInfo;
+import com.xingxi.business.PaymentInfo.mapper.PaymentInfoMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface WxApiOrderMapper extends OrderMapper {
+
+    Order lockOrderByPrescId(@Param("orderId") Long orderId);
+
+}

+ 13 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/data/mapper/WxApiPaymentInfoMapper.java

@@ -0,0 +1,13 @@
+package com.xingxi.api.data.mapper;
+
+import com.xingxi.business.PaymentInfo.domain.PaymentInfo;
+import com.xingxi.business.PaymentInfo.mapper.PaymentInfoMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface WxApiPaymentInfoMapper extends PaymentInfoMapper {
+
+    PaymentInfo selectPaymentInfoByOutTradeNo(@Param("outTradeNo") String outTradeNo);
+
+}

+ 7 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/OrderServiceI.java

@@ -5,6 +5,9 @@ import com.xingxi.api.model.OrderCreateRequest;
 import com.xingxi.api.model.OrderCreateResponse;
 import com.xingxi.api.model.OrderQueryRequest;
 import com.xingxi.api.model.OrderQueryResponse;
+import com.xingxi.business.Order.domain.Order;
+import com.xingxi.business.PaymentInfo.domain.PaymentInfo;
+import org.apache.ibatis.annotations.Param;
 
 public interface OrderServiceI {
 
@@ -12,4 +15,8 @@ public interface OrderServiceI {
 
     OrderCreateResponse create(UserContext userContext, OrderCreateRequest request);
 
+    PaymentInfo selectPaymentInfoByOutTradeNo(String outTradeNo);
+
+    Order lockOrderByPrescId(Long orderId);
+
 }

+ 2 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/ProdServiceI.java

@@ -7,6 +7,8 @@ import java.util.List;
 
 public interface ProdServiceI {
 
+    String selectConfigByKey(String configKey);
+
     List<MercProdResponse> selectMercProdList(MercProdRequest request);
 
     MercProdResponse selectMercProdById(Long mercProdId);

+ 0 - 3
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/MySqlDBCacheServiceImpl.java

@@ -4,13 +4,10 @@ import com.xingxi.api.service.CacheService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
-
 @Slf4j
 @RequiredArgsConstructor
 class MySqlDBCacheServiceImpl implements CacheService {
 
-
-
     @Override
     public void setCache(String key, Object value) {
 

+ 21 - 6
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/OrderApiServiceImpl.java

@@ -12,6 +12,8 @@ import com.xingxi.api.common.ApiException;
 import com.xingxi.api.common.UserContext;
 import com.xingxi.api.data.domain.OrderDTO;
 import com.xingxi.api.data.domain.OrderDetailDTO;
+import com.xingxi.api.data.mapper.WxApiOrderMapper;
+import com.xingxi.api.data.mapper.WxApiPaymentInfoMapper;
 import com.xingxi.api.data.mapper.WxApiProdInventoryMapper;
 import com.xingxi.api.model.*;
 import com.xingxi.api.service.OrderServiceI;
@@ -86,19 +88,22 @@ class OrderApiServiceImpl implements OrderServiceI {
     private ProdInventoryBillMapper prodInventoryBillMapper;
     @Autowired
     private WxApiProdInventoryMapper wxApiProdInventoryMapper;
+    @Autowired
+    private WxApiPaymentInfoMapper wxApiPaymentInfoMapper;
+    @Autowired
+    private WxApiOrderMapper wxApiOrderMapper;
 
     private final OrderCreatedMqPublisher createdMqPublisher;
 
-    @Autowired
-    private WxPayService wxPayService;
-
-    @Value("${wx.pay.domain}")
-    private String domain;
-    @Value("${wx.pay.notifyUrl}")
+    @Value("${spring.application.biandan.unifiedpay.callbackUrl}")
     private String notifyUrl;
+
     private WxPayConfig config;
 
     @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
     private PaymentInfoMapper paymentInfoMapper;
 
     @Override
@@ -295,6 +300,16 @@ class OrderApiServiceImpl implements OrderServiceI {
         return null;
     }
 
+    @Override
+    public PaymentInfo selectPaymentInfoByOutTradeNo(String outTradeNo) {
+        return wxApiPaymentInfoMapper.selectPaymentInfoByOutTradeNo(outTradeNo);
+    }
+
+    @Override
+    public Order lockOrderByPrescId(Long orderId) {
+        return wxApiOrderMapper.lockOrderByPrescId(orderId);
+    }
+
     private void orderCreatedEvent(Order message){
         OrderBO sendOrder = new OrderBO();
         sendOrder.setOrderId(message.getOrderId());

+ 25 - 1
08.src/Xingxi/xingxi-miniprogram-api/src/main/java/com/xingxi/api/service/impl/ProdApiServiceImpl.java

@@ -7,17 +7,19 @@ import com.xingxi.api.model.ProdAttrResponse;
 import com.xingxi.api.service.ProdServiceI;
 import com.xingxi.common.enums.EDelFlag;
 import com.xingxi.common.enums.ERoleKey;
+import com.xingxi.common.utils.StringUtils;
 import com.xingxi.master.merchant.domain.MerchantProd;
 import com.xingxi.master.product.domain.*;
 import com.xingxi.master.product.service.IProdAttrJointService;
 import com.xingxi.master.product.service.IProdAttrPriceService;
 import com.xingxi.master.product.service.IProdAttrService;
 import com.xingxi.master.product.service.IProdPicService;
+import com.xingxi.system.domain.SysConfig;
+import com.xingxi.system.mapper.SysConfigMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.validation.annotation.Validated;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -42,6 +44,28 @@ class ProdApiServiceImpl implements ProdServiceI {
     @Autowired
     IProdAttrJointService prodAttrJointService;
 
+    @Autowired
+    private SysConfigMapper configMapper;
+
+    /**
+     * 根据键名查询参数配置信息
+     *
+     * @param configKey 参数key
+     * @return 参数键值
+     */
+    @Override
+    public String selectConfigByKey(String configKey)
+    {
+        SysConfig config = new SysConfig();
+        config.setConfigKey(configKey);
+        SysConfig retConfig = configMapper.selectConfig(config);
+        if (StringUtils.isNotNull(retConfig))
+        {
+            return retConfig.getConfigValue();
+        }
+        return StringUtils.EMPTY;
+    }
+
     @Override
     public List<MercProdResponse> selectMercProdList(MercProdRequest request) {
         return productMapper.selectProductList(request);

+ 10 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/META-INF/sqlmap/WxApiOrderMapper.xml

@@ -0,0 +1,10 @@
+<?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.xingxi.api.data.mapper.WxApiOrderMapper">
+
+    <select id="lockOrderByPrescId" parameterType="Long" resultType="Order">
+        select * from t_order where orderId = #{orderId} for update
+    </select>
+</mapper>

+ 13 - 0
08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/META-INF/sqlmap/WxApiPaymentInfoMapper.xml

@@ -0,0 +1,13 @@
+<?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.xingxi.api.data.mapper.WxApiPaymentInfoMapper">
+
+    <select id="selectPaymentInfoByOutTradeNo" parameterType="String" resultType="PaymentInfo">
+        <include refid="selectPaymentInfoVo"/>
+        where out_trade_no = #{outTradeNo} and del_flag = '0'
+        limit 1
+    </select>
+
+</mapper>

+ 12 - 19
08.src/Xingxi/xingxi-miniprogram-api/src/main/resources/application-local.yml

@@ -6,18 +6,17 @@ spring:
     biandan:
       unifiedpay:
         enabled: "true"
-        callbackUrl: "https://ministore.njnet.vip/unifiedpay/%s/callback"
+        callbackUrl: "https://managertest.gululuq.com/api/store/order/wxpay/callback"
         wxpay:
           enabled: "true"
           app-id: "wxe53a2bd91cc5b4c2"
-          # 15141660511
           mch-id: "1662657667"
           apiv3-key: "Xiangmai20231225Xiangmai20231225"
           cert-serial-no: 6BAA04DCBF80E735518219CC8BCD196BE039F713
           private-key-path: "classpath:META-INF/apiclient_key.pem"
           private-cert-path: "classpath:META-INF/apiclient_cert.pem"
     request:
-      referers: "https://mpapi.njnet.vip,http://127.0.0.1"
+      referers: "https://mpapitest.gululuq.com,http://127.0.0.1"
     cors:
       pathPattern: "/api/store/**"
       allowedMethods: "GET,POST"
@@ -83,24 +82,18 @@ logging:
     org.springframework: warn
     org.apache.http: info
 wx:
-  miniapp:
+  mp:
     appid: "wx12e34630814e5d30"
     secret: "fc06d584d8544a00f0ff9df65a30af02"
-  qrCode:
-    scene: "%s,%s"
-    page: "pages/logs/logs"
-    width: 420
-    checkPath: false
-    envVersion: develop
-    pay:
-      domain: http://fmp.njnet.vip
-      appId: aaaaa
-      mchId: 1658989336 #商户id
-      apiV3Key: bbbbb #V3密钥
-      certSerialNo: ccccc
-      privateKeyPath: classpath:wxcert/apiclient_key.pem #apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径
-      privateCertPath: classpath:wxcert/apiclient_cert.pem #apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径
-      notifyUrl: https://fmp.njnet.vip/api/xinbao/wxpay/callback
+#  pay:
+#    domain: http://managertest.gululuq.com
+#    appId: aaaaa
+#    mchId: 1658989336 #商户id
+#    apiV3Key: bbbbb #V3密钥
+#    certSerialNo: ccccc
+#    privateKeyPath: classpath:wxcert/apiclient_key.pem #apiclient_key.pem证书文件的绝对路径或者以classpath:开头的类路径
+#    privateCertPath: classpath:wxcert/apiclient_cert.pem #apiclient_cert.pem证书文件的绝对路径或者以classpath:开头的类路径
+#    notifyUrl: https://managertest.gululuq.com/api/store/order/wxpay/callback
 idworkcfg:
   workerId: "1"
   dataCenterId: "9"

+ 2 - 2
08.src/Xingxi/xingxi-system/src/main/java/com/xingxi/business/PaymentInfo/domain/PaymentInfo.java

@@ -71,7 +71,7 @@ public class PaymentInfo extends BaseEntity {
     private String notifyId;
 
     // 通知创建时间
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "通知创建时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date notifyTime;
 
@@ -100,7 +100,7 @@ public class PaymentInfo extends BaseEntity {
     private String bankType;
 
     // 支付完成时间
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @Excel(name = "支付完成时间", width = 30, dateFormat = "yyyy-MM-dd")
     private Date successTime;