Procházet zdrojové kódy

admin功能增加退款相关配置,swagger中可调用接口。
查询微信支付订单
查询微信退款订单
退款

baolei před 2 měsíci
rodič
revize
c2aae195f5

+ 13 - 0
08.src/Xingxi/xingxi-admin/pom.xml

@@ -71,6 +71,19 @@
             <artifactId>lombok</artifactId>
             <optional>true</optional>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.5.0</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>

+ 36 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/config/WechatPayConfig.java

@@ -0,0 +1,36 @@
+package com.xingxi.web.wxpay.config;
+
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+@Component
+@EnableConfigurationProperties(WechatPayProperties.class)
+public class WechatPayConfig {
+
+    @Resource
+    private WechatPayProperties payProperties;
+
+    @Bean
+    public WxPayService wxPayService() {
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(payProperties.getAppId());
+        payConfig.setMchId(payProperties.getMchId());
+//        payConfig.setMchKey(payProperties.getApiv3Key());
+//        payConfig.setKeyPath(payProperties.getPrivateKeyPath());
+        payConfig.setNotifyUrl(payProperties.getCallbackUrl());
+        payConfig.setApiV3Key(payProperties.getApiv3Key());
+        payConfig.setCertSerialNo(payProperties.getCertSerialNo());
+        payConfig.setPrivateCertPath(payProperties.getPrivateCertPath());
+        payConfig.setPrivateKeyPath(payProperties.getPrivateKeyPath());
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+}

+ 19 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/config/WechatPayProperties.java

@@ -0,0 +1,19 @@
+package com.xingxi.web.wxpay.config;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "xingxi.wxpay")
+public class WechatPayProperties {
+
+    private String appId;
+    private String mchId;
+    private String apiv3Key;
+    private String certSerialNo;
+    private String privateKeyPath;
+    private String privateCertPath;
+    private String callbackUrl;
+    private String refundcallbackUrl;
+
+}

+ 71 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/controller/WechatPayController.java

@@ -0,0 +1,71 @@
+package com.xingxi.web.wxpay.controller;
+
+import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryV3Result;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
+import com.xingxi.common.core.controller.BaseController;
+import com.xingxi.common.exception.BusinessException;
+import com.xingxi.web.wxpay.service.WechatPayService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+
+/**
+ * swagger 用户测试方法
+ * 
+ * @author ruoyi
+ */
+@Api("用户信息管理")
+@RestController
+@RequestMapping("/wechatPay")
+public class WechatPayController extends BaseController
+{
+
+    @Autowired
+    private WechatPayService wechatPayService;
+
+    @ApiOperation("查询微信支付订单(商户订单编号或微信订单ID必须有一个)")
+    @ApiImplicitParams({
+        @ApiImplicitParam(name = "OutTradeNo", value = "商户订单编号", dataType = "String", dataTypeClass = String.class),
+        @ApiImplicitParam(name = "TransactionId", value = "微信订单ID", dataType = "String", dataTypeClass = String.class)
+    })
+    @PostMapping("/orderQuery")
+    public WxPayOrderQueryV3Result orderQuery(WxPayOrderQueryV3Request request) {
+        if (StringUtils.isBlank(request.getTransactionId()) && StringUtils.isBlank(request.getOutTradeNo())) {
+            throw new BusinessException("请输入商户订单编号或微信订单ID!");
+        }
+        return wechatPayService.orderQuery(request);
+    }
+
+    @ApiOperation("查询微信退款订单")
+    @ApiImplicitParam(name = "outTradeNo", value = "退款单号", dataType = "String", dataTypeClass = String.class)
+    @PostMapping("/refundQuery")
+    public WxPayRefundQueryV3Result orderQuery(String outTradeNo) {
+        if (StringUtils.isBlank(outTradeNo)) {
+            throw new BusinessException("请输入商户退款单号!");
+        }
+        return wechatPayService.refundQuery(outTradeNo);
+    }
+
+    @ApiOperation("退款")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "orderNo", value = "商户订单号", required = true, dataType = "String", dataTypeClass = String.class),
+            @ApiImplicitParam(name = "payAmount", value = "支付金额(分)", required = true, dataType = "BigDecimal", dataTypeClass = BigDecimal.class),
+            @ApiImplicitParam(name = "refundAmount", value = "退款金额(分)", required = true, dataType = "BigDecimal", dataTypeClass = BigDecimal.class)
+    })
+    @PostMapping("/refund")
+    public WxPayRefundV3Result refund(String orderNo, BigDecimal payAmount, BigDecimal refundAmount) {
+        return wechatPayService.refund(orderNo, payAmount, refundAmount);
+    }
+
+}
+

+ 83 - 0
08.src/Xingxi/xingxi-admin/src/main/java/com/xingxi/web/wxpay/service/WechatPayService.java

@@ -0,0 +1,83 @@
+package com.xingxi.web.wxpay.service;
+
+import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryV3Request;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryV3Request;
+import com.github.binarywang.wxpay.bean.request.WxPayRefundV3Request;
+import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryV3Result;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryV3Result;
+import com.github.binarywang.wxpay.bean.result.WxPayRefundV3Result;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Slf4j
+@Service
+public class WechatPayService {
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    public WxPayOrderQueryV3Result orderQuery(WxPayOrderQueryV3Request request) {
+        // 查询是否支付成功
+        WxPayOrderQueryV3Request wxQryRequest = new WxPayOrderQueryV3Request();
+        wxQryRequest.setOutTradeNo(request.getOutTradeNo());
+        wxQryRequest.setTransactionId(request.getTransactionId());
+
+        WxPayOrderQueryV3Result rtn = null;
+        try {
+            rtn = wxPayService.queryOrderV3(wxQryRequest);
+        } catch (WxPayException e) {
+            log.error(e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+
+        return rtn;
+    }
+
+    public WxPayRefundV3Result refund(String orderNo, BigDecimal payAmount, BigDecimal refundAmount) {
+        WxPayRefundV3Result rtn = null;
+
+        String outRefundNo = "REFUND" + orderNo;
+        WxPayRefundV3Request wxRefundRequest = new WxPayRefundV3Request();
+        wxRefundRequest.setOutTradeNo(orderNo);
+        wxRefundRequest.setOutRefundNo(outRefundNo);
+        wxRefundRequest.setReason(orderNo + "退款");
+
+        WxPayRefundV3Request.Amount refundAmountObj = new WxPayRefundV3Request.Amount();
+        refundAmountObj.setRefund(refundAmount.intValue()); // 分
+        refundAmountObj.setTotal(payAmount.intValue()); // 分
+        refundAmountObj.setCurrency("CNY");
+
+        wxRefundRequest.setAmount(refundAmountObj);
+        try {
+            rtn = wxPayService.refundV3(wxRefundRequest);
+        } catch (WxPayException e) {
+            log.error(e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+
+        return rtn;
+    }
+
+    public WxPayRefundQueryV3Result refundQuery(String outRefundNo) {
+        WxPayRefundQueryV3Result rtn = null;
+
+        try {
+            WxPayRefundQueryV3Request wxRefundRequest = new WxPayRefundQueryV3Request();
+            wxRefundRequest.setOutRefundNo(outRefundNo);
+
+            rtn = wxPayService.refundQueryV3(wxRefundRequest);
+
+        } catch (WxPayException e) {
+            log.error(e.getMessage(), e);
+            throw new RuntimeException(e);
+        }
+
+        return rtn;
+    }
+
+}

+ 25 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/META-INF/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIEITCCAwmgAwIBAgIUT74STeWq1T4f9S50ATGmBy/mkvEwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjUwNTA2MTI0MTQ5WhcNMzAwNTA1MTI0MTQ5WjB7MRMwEQYDVQQDDAox
+NzA5MzM3MjEwMRswGQYDVQQKDBLlvq7kv6HllYbmiLfns7vnu58xJzAlBgNVBAsM
+HuS4iua1t+mmqOemp+WVhui0uOaciemZkOWFrOWPuDELMAkGA1UEBhMCQ04xETAP
+BgNVBAcMCFNoZW5aaGVuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
+vwu+mxVg80S1sLasQt9tJXSiP6y6EvBqA+I+ILsjcjvNhLyklUR8heh4bZII7laF
+Z1865HZvQFy6gMM8cHAY29gYtGAHJpmMaDRstQUhZsUB0V3SJexGdJMXFJzDcTEG
+pwKC1V+nKo8oLYu0Z1Qp8qRRMfnxZRTHpsGxS3urrIvuxjUYT4MtP5LfpFgGyzzA
+KkESxazNNF/tmSPcFsJ4Avvi0185pk0ywUteI1v1X6TNwveSoVEsTCQkCY+xHQ8s
+wgXKzsWltND7izxV9v160l0lDm+BE6WlCIOkpgpg4NvCUMs09XJqIKJ5WTpZZ7KS
+e8ZNsu0710DkIaaRyKqsywIDAQABo4G5MIG2MAkGA1UdEwQCMAAwCwYDVR0PBAQD
+AgP4MIGbBgNVHR8EgZMwgZAwgY2ggYqggYeGgYRodHRwOi8vZXZjYS5pdHJ1cy5j
+b20uY24vcHVibGljL2l0cnVzY3JsP0NBPTFCRDQyMjBFNTBEQkMwNEIwNkFEMzk3
+NTQ5ODQ2QzAxQzNFOEVCRDImc2c9SEFDQzQ3MUI2NTQyMkUxMkIyN0E5RDMzQTg3
+QUQxQ0RGNTkyNkUxNDAzNzEwDQYJKoZIhvcNAQELBQADggEBAJbIWrtDSomABA61
+5X4FgVC4M9WIjiZJDgPgf3W8ztVnXTMuk5uD1Lxb/W5Dx04ZXfbcb/ALz00MnbyK
+JOvY0w34p0ye8wsHAUlxhXOMOjiNSIQrzbMeeO4IicD6bFIFfVS7iS1WkH4MuiC0
+qrt3+UPWVBa3e8BAca+8TohM+HJpSWxpy9vxRNi5ESWR1DSupPykJEJiRquQ3eXT
+z00lQuuqxgldT2qioGoxcjCn891UedKtViE3PXgkU34YWLqrMu5O0PvcDyVb9/fT
+6IbG9C4Z4AyN91oYwpeXph5WQApgiOLl9LLwUN1IDzYvbXGbRudYbvypSHy88+Yf
+6y1/s3w=
+-----END CERTIFICATE-----

+ 28 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/META-INF/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC/C76bFWDzRLWw
+tqxC320ldKI/rLoS8GoD4j4guyNyO82EvKSVRHyF6HhtkgjuVoVnXzrkdm9AXLqA
+wzxwcBjb2Bi0YAcmmYxoNGy1BSFmxQHRXdIl7EZ0kxcUnMNxMQanAoLVX6cqjygt
+i7RnVCnypFEx+fFlFMemwbFLe6usi+7GNRhPgy0/kt+kWAbLPMAqQRLFrM00X+2Z
+I9wWwngC++LTXzmmTTLBS14jW/VfpM3C95KhUSxMJCQJj7EdDyzCBcrOxaW00PuL
+PFX2/XrSXSUOb4ETpaUIg6SmCmDg28JQyzT1cmogonlZOllnspJ7xk2y7TvXQOQh
+ppHIqqzLAgMBAAECggEBAIHa98nt9CImd+EPqXMi7stgxc/GFgw9gbH2HAifau6A
+m6c3mh8jmAhlBUZk1tE52h9zaVJU9jWnUdWn3vMGHr9/2PrxsqqYAAnsaF96h0OV
+cTDgNrE0MoeWWz/Vdjr/+eeXG1rxU2zoNYUPyqXZXVHiQpZXr67nOvWr/liyTPRQ
+Ue2d/mHYFXlWfEURPcBsyL8Tk33Ehz4Q2QYykn71q002qgb91vnvyjMaQsUsuQZ6
+OZVlvbte3p74MWDLv/XNd2LbesWosyRs6BXxMauckXcK1WVKCV5C5feWu76daHOv
+7Q5jOuN4KgCDlZ0Q+I9tA0T4HYqNSaD1FufZdKAeAWECgYEA+5X9ZGeiAbYoKOR4
+A9srNhLEkEKko8dVUvtomnV0WAaZ2tuiWzOBmTyZFrdQkQV9P8oxad0X5pl7tdKF
+Vm5RLtb1LWcodf4f2KZiqQOPpoDAYvCJ14EfLdFo3K/HJXMeNdcCYHyTN0cCJuYz
+zLFeUolVt4nPN7B+w+q6pWLQVMMCgYEAwmXWGRMX5UpW5qKOrVWW8MQe1STi9lgo
+IvjJhB/CITXruA3Cskpvt8yZPCB/w9Lgpjy6mf8UZoB+nUPB7Yd1uVJdmh9bHaOW
+zRx+4JZujBsbeWUsTJMn58g4c0SzZLU3weKj5KyfQxNK7zJ5MLm+xQ5ckrJ5YP8T
+6oKpySYmp1kCgYANhjOX6SZBV0xzXkzBUE/TWVDtvFdjYnzIuDEYVIYLkVdF95aT
+toIZ/bLxEKupEBV6j2D2oub9A3UuAgIe8lE05mNJrIj1RtLpb5BQK5vWRIeTCgEu
+74cAjIhJjL102upd1JARJcE4MH4CH0/bihFa+Hz+H89e3AMEfyLHbzdpxwKBgHt0
+WOdLrN08vLtzeNCzjkwRANOzvT9c9QBgpvl1gb+9kpksg/zeMNy03ovEx98AyRJJ
+dufdioMeD0qogTvrzuOGX1NFnoPQJDDWa+0NG992R5hsnBl1St5z1QW/F35ZZ7OF
+zzemOO5MDkah8zzyeSiD2l5/YX4r/+XqXREVXW7hAoGAPCCPTfM5wFBPejI5SUDS
+Bs1FPvRY0nDJrTQ9JlYdcaSHDHy3nLukJKrl9JoApFTgyUQFllP4JpniFPqGKh/x
+xs8u2xvzxwcePbliTRHnfkjTf0paez7QGkJf7PJ1qPzH3f5+btmIsS+utB5v29LJ
+TbctUOY6P/kh2C518AmGOq8=
+-----END PRIVATE KEY-----

+ 11 - 0
08.src/Xingxi/xingxi-admin/src/main/resources/application.yml

@@ -143,3 +143,14 @@ xss:
 swagger:
   # 是否开启swagger
   enabled: true
+
+xingxi:
+  wxpay:
+    appId: "wx12e34630814e5d30"
+    mchId: "1709337210"
+    apiv3Key: "mF9oH1oV9wY3gL8iW3kU4fJ7fE1dW4vK"
+    certSerialNo: 4FBE124DE5AAD53E1FF52E740131A6072FE692F1
+    privateKeyPath: "classpath:META-INF/apiclient_key.pem"
+    privateCertPath: "classpath:META-INF/apiclient_cert.pem"
+    callbackUrl: "https://mpapi.gululuq.com/unifiedpay/wxpay/callback"
+    refundcallbackUrl: "https://mpapi.gululuq.com/unifiedpay/refund/wxpay/callback"

+ 5 - 0
08.src/Xingxi/xingxi-mq-server/src/main/java/com/xingxi/mq/consumer/order/OrderCloseConsumer.java

@@ -143,6 +143,7 @@ public class OrderCloseConsumer extends AbstractRabbitConsumer {
 
                 // TODO 增加退款表,保存退款信息
                 RefundInfo refundInfo = new RefundInfo();
+                refundInfo.setDelFlag(EDelFlag.NO.getVal());
                 refundInfo.setTransactionId(refundV3Result.getTransactionId());
                 refundInfo.setOutTradeNo(orgOrder.getOrderNo());
                 refundInfo.setOutRefundNo(outRefundNo);
@@ -164,6 +165,10 @@ public class OrderCloseConsumer extends AbstractRabbitConsumer {
                 refundInfo.setSettlementTotal(new BigDecimal(refundV3Result.getAmount().getSettlementTotal()));
                 refundInfo.setDiscountRefund(new BigDecimal(refundV3Result.getAmount().getDiscountRefund()));
 
+                refundInfo.setCreateUser(opName);
+                refundInfo.setCreateTime(nowDate);
+                refundInfo.setUpdateUser(opName);
+                refundInfo.setUpdateTime(nowDate);
                 refundInfoServiceImpl.insertRefundInfo(refundInfo);
 
             }