From 1e51f33490015a769197c448e02c11f95e721c9f Mon Sep 17 00:00:00 2001
From: KKSU <15274802129@163.com>
Date: Thu, 21 Dec 2023 16:43:28 +0800
Subject: [PATCH] 富文本框输入版本变化

---
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java |   21 ++++
 src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java         |   25 ++++
 src/main/java/cc/mrbird/febs/pay/service/impl/xcxCodePayServiceImpl.java  |   88 +++++++++++++++++
 src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java    |    8 +
 src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java        |   59 +++++++++++
 src/main/java/cc/mrbird/febs/pay/service/IXcxCodePayService.java          |   11 ++
 pom.xml                                                                   |    7 +
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java    |    6 +
 src/main/java/cc/mrbird/febs/mall/dto/ApiWxCodePayDto.java                |   16 +++
 src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java         |    2 
 10 files changed, 240 insertions(+), 3 deletions(-)

diff --git a/pom.xml b/pom.xml
index c731e94..38b963d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,13 @@
     </properties>
 
     <dependencies>
+        <!-- 微信支付 -->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>4.4.0</version>
+        </dependency>
+
         <dependency>
             <groupId>com.aliyun</groupId>
             <artifactId>dysmsapi20170525</artifactId>
diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
index 928a949..2c5b255 100644
--- a/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
+++ b/src/main/java/cc/mrbird/febs/common/enumerates/DataDictionaryEnum.java
@@ -5,6 +5,14 @@
 
 @Getter
 public enum DataDictionaryEnum {
+    /**
+     * 微信设置
+     */
+    XCX_APP_ID("XCX_APP_ID", "XCX_APP_ID"),
+    XCX_MCH_ID("XCX_MCH_ID", "XCX_MCH_ID"),
+    XCX_MCH_KEY("XCX_MCH_KEY", "XCX_MCH_KEY"),
+    XCX_MCH_KEY_PATH_P12("XCX_MCH_KEY_PATH_P12", "XCX_MCH_KEY_PATH_P12"),
+    XCX_NOTICE_URL("XCX_NOTICE_URL", "XCX_NOTICE_URL"),
     //微信订阅模板ID,
     // 微信订单通知
 //    WX_TEMPLATE_ID_ONE("WX_TEMPLATE", "WX_TEMPLATE_ID_ONE"),
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java
index fa3233c..ebaaa80 100644
--- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallAppController.java
@@ -92,4 +92,10 @@
         return mallAppService.getOrderCancel(apiGetOrderDto);
     }
 
+    @ApiOperation(value = "支付", notes = "支付")
+    @PostMapping(value = "/wxCodePay")
+    public FebsResponse wxCodePay(@RequestBody ApiWxCodePayDto wxCodePayDto) {
+        return mallAppService.wxCodePay(wxCodePayDto);
+    }
+
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/ApiWxCodePayDto.java b/src/main/java/cc/mrbird/febs/mall/dto/ApiWxCodePayDto.java
new file mode 100644
index 0000000..516d15d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/ApiWxCodePayDto.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(value = "ApiWxCodePayDto", description = "新增订单接口参数接收类")
+public class ApiWxCodePayDto {
+
+    @ApiModelProperty(value = "订单ID")
+    private Long orderId;
+
+    @ApiModelProperty(value = "微信条形码")
+    private String wxPayCode;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java
index 6b97eb5..95d4e0c 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallAppService.java
@@ -26,4 +26,6 @@
     FebsResponse getOrder(ApiGetOrderDto apiGetOrderDto);
 
     FebsResponse getOrderCancel(ApiGetOrderDto apiGetOrderDto);
+
+    FebsResponse wxCodePay(ApiWxCodePayDto wxCodePayDto);
 }
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java
index dc8d19c..71d52c0 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallAppServiceImpl.java
@@ -13,6 +13,7 @@
 import cc.mrbird.febs.mall.mapper.*;
 import cc.mrbird.febs.mall.service.IApiMallAppService;
 import cc.mrbird.febs.mall.vo.*;
+import cc.mrbird.febs.pay.service.IXcxCodePayService;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -47,6 +48,7 @@
     private final MallOrderInfoMapper mallOrderInfoMapper;
     private final MallOrderItemMapper mallOrderItemMapper;
     private final MallMemberWalletMapper mallMemberWalletMapper;
+    private final IXcxCodePayService xcxCodePayService;
 
     public static void main(String[] args) {
         System.out.println(SecureUtil.md5("a123456"));
@@ -319,6 +321,25 @@
         return new FebsResponse().success().message("订单已取消");
     }
 
+    @Override
+    public FebsResponse wxCodePay(ApiWxCodePayDto wxCodePayDto) {
+        Long orderId = wxCodePayDto.getOrderId();
+        MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(orderId);
+        String wxPayCode = wxCodePayDto.getWxPayCode();
+        mallOrderInfo.setTakeCode(wxPayCode);
+        List<ApiGetOrderOrderItemVo> appOrderItemByOrderId = mallOrderItemMapper.getAppOrderItemByOrderId(orderId);
+        if(CollUtil.isEmpty(appOrderItemByOrderId)){
+            mallOrderInfo.setName("商品");
+        }else{
+            mallOrderInfo.setName(appOrderItemByOrderId.get(0).getGoodsName());
+        }
+        mallOrderInfo.setPayResult("2");
+        mallOrderInfoMapper.updateById(mallOrderInfo);
+        // 发起付款码支付请求
+        String payResult = xcxCodePayService.pay(mallOrderInfo);
+        return new FebsResponse().success().message(payResult);
+    }
+
     public String generateAsaToken(String token) {
         RSA rsa = new RSA(null, AppContants.PUBLIC_KEY);
         return rsa.encryptBase64(token + "_" + System.currentTimeMillis(), KeyType.PublicKey);
diff --git a/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java b/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java
new file mode 100644
index 0000000..2ed1c3c
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java
@@ -0,0 +1,59 @@
+package cc.mrbird.febs.pay.configure;
+
+import cc.mrbird.febs.common.enumerates.DataDictionaryEnum;
+import cc.mrbird.febs.mall.entity.DataDictionaryCustom;
+import cc.mrbird.febs.mall.mapper.DataDictionaryCustomMapper;
+import cn.hutool.core.util.StrUtil;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@ConditionalOnClass(WxPayService.class)
+@AllArgsConstructor
+public class WxPayConfiguration {
+    private DataDictionaryCustomMapper dataDictionaryCustomMapper;
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxPayService wxService() {
+        String appId = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.XCX_APP_ID.getType(),
+                DataDictionaryEnum.XCX_APP_ID.getCode()
+        ).getValue();
+        String mchId = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.XCX_MCH_ID.getType(),
+                DataDictionaryEnum.XCX_MCH_ID.getCode()
+        ).getValue();
+        String mchKey = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.XCX_MCH_KEY.getType(),
+                DataDictionaryEnum.XCX_MCH_KEY.getCode()
+        ).getValue();
+        String keyPath = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.XCX_MCH_KEY_PATH_P12.getType(),
+                DataDictionaryEnum.XCX_MCH_KEY_PATH_P12.getCode()
+        ).getValue();
+        String notifyUrl = dataDictionaryCustomMapper.selectDicDataByTypeAndCode(
+                DataDictionaryEnum.XCX_NOTICE_URL.getType(),
+                DataDictionaryEnum.XCX_NOTICE_URL.getCode()
+        ).getValue();
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(StrUtil.trim(appId));
+        payConfig.setMchId(StrUtil.trim(mchId));
+        payConfig.setMchKey(StrUtil.trim(mchKey));
+        payConfig.setKeyPath(StrUtil.trim(keyPath));
+        payConfig.setNotifyUrl(StrUtil.trim(notifyUrl));
+
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
index 011abe4..caf30b6 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/XcxPayController.java
@@ -19,6 +19,7 @@
 import cc.mrbird.febs.pay.model.OrderStateMsgVo;
 import cc.mrbird.febs.pay.model.WxTemplateData;
 import cc.mrbird.febs.pay.service.IPayService;
+import cc.mrbird.febs.pay.service.IXcxCodePayService;
 import cc.mrbird.febs.pay.service.IXcxPayService;
 import cc.mrbird.febs.pay.util.PayThreadPool;
 import cc.mrbird.febs.pay.util.Signature;
@@ -28,15 +29,17 @@
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 import org.springframework.web.client.RestTemplate;
 import org.thymeleaf.engine.TemplateData;
 
@@ -69,6 +72,12 @@
     RedisUtils redisUtils;
     @Autowired
     private IApiMallMemberWalletService memberWalletService;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private IXcxCodePayService xcxCodePayService;
 
     @Autowired
     private IXcxPayService iXcxPayService;
@@ -289,4 +298,14 @@
         out.close();
     }
 
+
+    @PostMapping(value = "/xcxCodePayCallBack")
+    public String xcxCodePayCallBack(@RequestBody String xmlData) throws WxPayException {
+        log.info("=======微信支付码付款回调:{}========", xmlData);
+        WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);
+        xcxCodePayService.payCallback(notifyResult.toMap());
+        return WxPayNotifyResponse.success("成功");
+    }
+
+
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IXcxCodePayService.java b/src/main/java/cc/mrbird/febs/pay/service/IXcxCodePayService.java
new file mode 100644
index 0000000..69f082e
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/IXcxCodePayService.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.pay.service;
+
+import cc.mrbird.febs.mall.entity.MallOrderInfo;
+
+import java.util.Map;
+
+public interface IXcxCodePayService {
+    String pay(MallOrderInfo orderInfo);
+
+    void payCallback(Map<String, String> params);
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/xcxCodePayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/xcxCodePayServiceImpl.java
new file mode 100644
index 0000000..5cea005
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/xcxCodePayServiceImpl.java
@@ -0,0 +1,88 @@
+package cc.mrbird.febs.pay.service.impl;
+
+import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.pay.model.BrandWCPayRequestData;
+import cc.mrbird.febs.pay.model.JsApiPayBusiness;
+import cc.mrbird.febs.pay.model.JsApiPayReqData;
+import cc.mrbird.febs.pay.model.JsApiPayResData;
+import cc.mrbird.febs.pay.service.IXcxCodePayService;
+import cc.mrbird.febs.pay.util.WebUtil;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayMicropayRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayMicropayResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.Map;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class xcxCodePayServiceImpl implements IXcxCodePayService {
+
+    private final MallOrderInfoMapper mallOrderInfoMapper;
+    private final WxPayService wxService;
+
+    @Override
+    public String pay(MallOrderInfo mallOrderInfo) {
+        WxPayMicropayRequest request = new WxPayMicropayRequest();
+        request
+        request.setAppid(wxPayProperties.getAppId());
+        request.setMchId(wxPayProperties.getMchId());
+        request.setNotifyUrl(wxPayProperties.getNoticeUrl());
+        request.setBody(orderInfo.getName());
+        request.setOutTradeNo(orderInfo.getOrderNo());
+        request.setTimeExpire(DateUtil.format(DateUtil.offset(new Date(), DateField.MINUTE, 15), DatePattern.PURE_DATETIME_PATTERN));
+        request.setSpbillCreateIp("127.0.0.1");
+        request.setTradeType("APP");
+
+//        if ("dev".equals(active) || "test".equals(active)) {
+        if ("dev".equals(active)) {
+            request.setTotalFee(1);
+        } else {
+            request.setTotalFee(orderInfo.getAmount().add(orderInfo.getCarriage()).multiply(new BigDecimal(100)).intValue());
+        }
+
+        try {
+            WxPayMicropayResult micropay = wxService.micropay(request);
+            return JSONObject.toJSONString(micropay);
+        } catch (WxPayException e) {
+            e.printStackTrace();
+            throw new FebsException("支付异常, 请检查");
+        }
+        return null;
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void payCallback(Map<String, String> params) {
+        String orderNo = params.get("out_trade_no");
+        LambdaQueryWrapper<MallOrderInfo> query = new LambdaQueryWrapper<>();
+        query.eq(MallOrderInfo::getOrderNo, orderNo);
+        MallOrderInfo orderInfo = mallOrderInfoMapper.selectOne(query);
+        if ("1".equals(orderInfo.getPayResult())) {
+            return;
+        }
+        orderInfo.setStatus(OrderStatusEnum.FINISH.getValue());
+        orderInfo.setPayResult("1");
+        orderInfo.setPayTime(DateUtil.date());
+        orderInfo.setPayTradeNo(params.get("transaction_id"));
+        mallOrderInfoMapper.updateById(orderInfo);
+    }
+}

--
Gitblit v1.9.1