From 5cc9063aafa13e75d0fd918bd968c59f61525e2d Mon Sep 17 00:00:00 2001
From: “djh” <“3298565835@qq.com”>
Date: 星期四, 23 一月 2025 14:01:59 +0800
Subject: [PATCH] 煤矿缴费

---
 exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayServiceImpl.java        |   97 +++++++++++++++++--
 exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayService.java                 |    4 
 exam-system/src/main/java/com/gkhy/exam/pay/utils/PayUtils.java                         |   85 ++++++++++++++++-
 exam-system/src/test/java/TextPay.java                                                  |   21 +++
 exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayStudentServiceImpl.java |    5 +
 exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayStudentService.java          |    1 
 exam-system/src/main/java/com/gkhy/exam/pay/controller/CoalPayController.java           |   20 ++--
 exam-system/src/main/java/com/gkhy/exam/pay/controller/PayFeesController.java           |   41 ++++++++
 ruoyi-common/pom.xml                                                                    |    5 +
 9 files changed, 250 insertions(+), 29 deletions(-)

diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/controller/CoalPayController.java b/exam-system/src/main/java/com/gkhy/exam/pay/controller/CoalPayController.java
index 9b84a40..8e9235d 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/controller/CoalPayController.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/controller/CoalPayController.java
@@ -8,6 +8,7 @@
 import com.gkhy.exam.pay.dto.req.CoalPayTypeReq;
 import com.gkhy.exam.pay.entity.CoalPayStudent;
 import com.gkhy.exam.pay.service.CoalPayService;
+import com.ruoyi.common.annotation.Anonymous;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -95,20 +96,19 @@
     /**
      * 个人缴费接口
      */
-    @PostMapping("/findStudent")
+    @GetMapping("/findStudent")
+    @Anonymous
     @ApiOperation(value ="H5个人缴费查询")
-    public AjaxResult findStudent(@RequestBody CoalPayStudentReq coalPayStudent){
-        List<CoalPayStudentRep> coalPayStudentReps = coalPayService.selectCoalPay(coalPayStudent);
+    public AjaxResult findStudent(@RequestParam("idCard") String idCard,@RequestParam("phone") String phone){
+        List<CoalPayStudentRep> coalPayStudentReps = coalPayService.selectCoalPay(idCard,phone);
         return success(coalPayStudentReps);
     }
 
-
-
-//    @PostMapping("/personPay")
-//    @ApiOperation(value = "个人缴费接口")
-//    public void payFees(){
-//
-//    }
+    @PostMapping("/personPay")
+    @ApiOperation(value = "个人缴费接口")
+    public AjaxResult payMoney(@RequestParam("coalPayId") Long coalPayId,@RequestParam("studentId") Long studentId){
+        return success(coalPayService.personPayMoney(coalPayId,studentId));
+    }
 
 
 
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/controller/PayFeesController.java b/exam-system/src/main/java/com/gkhy/exam/pay/controller/PayFeesController.java
new file mode 100644
index 0000000..ac51b25
--- /dev/null
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/controller/PayFeesController.java
@@ -0,0 +1,41 @@
+package com.gkhy.exam.pay.controller;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.gkhy.exam.pay.utils.PayUtils;
+import com.ruoyi.common.core.controller.BaseController;
+import io.swagger.annotations.Api;
+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 java.io.IOException;
+import java.util.Map;
+
+@RestController
+@Api(tags = "缴费通知")
+@RequestMapping("/pay/payFees")
+public class PayFeesController extends BaseController {
+
+
+    @PostMapping("/inform")
+    public Map<String,String> inform(@RequestBody JSONObject jsonObject){
+        PayUtils payUtils = new PayUtils();
+        Map<String, String> receive = null;
+        try {
+            receive = payUtils.receive(jsonObject);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return receive;
+    }
+
+
+
+
+
+
+
+
+}
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayService.java b/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayService.java
index 2ff3cb6..74d3a12 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayService.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayService.java
@@ -24,7 +24,9 @@
 
     AjaxResult deleteCoalPayByIds(Long[] ids);
 
-    List<CoalPayStudentRep> selectCoalPay(CoalPayStudentReq coalPayStudent);
+    List<CoalPayStudentRep> selectCoalPay(String idcard,String phone);
 
     int updateCoalPayType(CoalPayTypeReq coalPayDto);
+
+    String personPayMoney(Long coalPayId, Long studentId);
 }
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayStudentService.java b/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayStudentService.java
index 7058e67..65872cc 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayStudentService.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/service/CoalPayStudentService.java
@@ -27,4 +27,5 @@
 
     List<CoalPayStudent> selectbyIdcard(CoalPayStudentReq coalPayStudent);
 
+    CoalPayStudent selectbyId(Long studentId);
 }
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayServiceImpl.java
index 1f1cd8b..4043ca1 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayServiceImpl.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayServiceImpl.java
@@ -7,35 +7,37 @@
 import com.gkhy.exam.pay.dto.req.CoalPayReq;
 import com.gkhy.exam.pay.dto.req.CoalPayStudentReq;
 import com.gkhy.exam.pay.dto.req.CoalPayTypeReq;
-import com.gkhy.exam.pay.entity.CoalCategory;
-import com.gkhy.exam.pay.entity.CoalPay;
-import com.gkhy.exam.pay.entity.CoalPayCategory;
-import com.gkhy.exam.pay.entity.CoalPayStudent;
+import com.gkhy.exam.pay.entity.*;
 import com.gkhy.exam.pay.mapper.CoalCategoryMapper;
 import com.gkhy.exam.pay.mapper.CoalPayCategoryMapper;
 import com.gkhy.exam.pay.mapper.CoalPayMapper;
 import com.gkhy.exam.pay.service.CoalPayService;
 import com.gkhy.exam.pay.service.CoalPayStudentService;
+import com.gkhy.exam.pay.utils.PayUtils;
+import com.gkhy.exam.pay.utils.ResultVo;
 import com.ruoyi.common.constant.ResultConstants;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.core.domain.entity.SysDept;
-import com.ruoyi.common.core.domain.entity.SysUser;
-import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.exception.BusinessException;
+import com.ruoyi.common.utils.RandomUtil;
 import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.system.mapper.SysDeptMapper;
-import javafx.print.Collation;
-import org.aspectj.weaver.loadtime.Aj;
+import org.aspectj.lang.reflect.UnlockSignature;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.Lock;
 import java.util.stream.Collectors;
 
 @Service
@@ -52,6 +54,11 @@
     private CoalCategoryMapper coalCategoryMapper;
     @Autowired
     private CoalPayStudentService coalPayStudentService;
+
+    @Autowired
+    private RedissonClient redissonClient;
+
+
 
 
     /**
@@ -168,9 +175,12 @@
 
     //个人查询缴费
     @Override
-    public List<CoalPayStudentRep> selectCoalPay(CoalPayStudentReq coalPayStudent) {
+    public List<CoalPayStudentRep> selectCoalPay(String idcard,String phone) {
+        CoalPayStudentReq coalPayStudentReq = new CoalPayStudentReq();
+        coalPayStudentReq.setIdCard(idcard);
+        coalPayStudentReq.setPhone(phone);
         //查询个人需要缴费
-        List<CoalPayStudent> coalPayStudents = coalPayStudentService.selectbyIdcard(coalPayStudent);
+        List<CoalPayStudent> coalPayStudents = coalPayStudentService.selectbyIdcard(coalPayStudentReq);
         List<CoalPayStudentRep> coalPayStudentReps = new ArrayList<>();
         for (CoalPayStudent payStudent : coalPayStudents) {
             //封装学生基础信息
@@ -205,4 +215,69 @@
         }
         return coalPayMapper.updateByPayId(coalPayTypeReq);
     }
+
+    @Override
+    public String personPayMoney(Long coalPayId, Long studentId) {
+        CoalPayStudent coalPayStudent = coalPayStudentService.selectbyId(studentId);
+        CoalPay coalPay = coalPayMapper.selectById(coalPayId);
+        List<CoalCategory> coalCategories = coalCategoryMapper.selectByCoalPayId(coalPayId);
+        CoalTicket coalTicket = coalCategoryMapper.selectCoalTicket();
+
+        PayReqData payReqData = new PayReqData();
+        payReqData.setOrderNo(RandomUtil.generateOrderNumber());
+        payReqData.setMoney(coalPay.getAmount());
+        payReqData.setAmount(1);
+        payReqData.setPayerName(coalPayStudent.getName());
+        payReqData.setCertNo(coalPayStudent.getIdCard());
+        payReqData.setPayerType(1);
+        payReqData.setInvoiceSocialCode(coalTicket.getTicketCompanyCode());
+        payReqData.setHandlingPerson(coalTicket.getDrawer());
+        payReqData.setChecker(coalTicket.getCheck());
+        payReqData.setEnterCode(coalTicket.getCompanyCode());
+        payReqData.setDesc(coalPay.getBatchName());
+
+        PayReqData.Feedata feedata = new PayReqData.Feedata();
+        List<PayReqData.Feedata> feedatas = new ArrayList<>();
+        for (CoalCategory coalCategory : coalCategories) {
+            feedata.setAmount(1);
+            feedata.setPrice(coalCategory.getAmount());
+            feedata.setBusCode(coalCategory.getBusinessCode());
+            feedatas.add(feedata);
+        }
+        payReqData.setFeeDatas(feedatas);
+
+        CoalPayStudent payStudent = new CoalPayStudent();
+
+        RLock lock = redissonClient.getLock("SWSPKMAS_PAY_PERSON");
+        try {
+            lock.lock(10, TimeUnit.SECONDS);
+            if (coalPayStudent.getGovPayStatus()!=0){
+                throw new BusinessException(this.getClass(),ResultConstants.BUSINESS_ERROR,"请勿重复发起支付");
+            }
+            if (StringUtils.isEmpty(coalPayStudent.getPayCode())){
+
+            }
+
+
+            ResultVo resultVo = PayUtils.sendApiPost(payReqData);
+            if (resultVo.getRespcode().equals("BUS0000")){
+                payStudent.setId(studentId);
+                payStudent.setOrderId(resultVo.getRespdata().getOrderNo());
+                payStudent.setGovPayStatus(1);
+                payStudent.setPayCode(resultVo.getRespdata().getBillNo());
+                coalPayStudentService.updateByCoalPayStudent(payStudent);
+                return resultVo.getRespdata().getBillNo();
+            }else {
+                throw new BusinessException(this.getClass(),ResultConstants.BUSINESS_ERROR,"发起支付失败,请稍后重试");
+            }
+        }catch (BusinessException e){
+            throw new BusinessException(this.getClass(),ResultConstants.BUSINESS_ERROR,"请稍后重试");
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        } finally {
+            if(lock.isLocked()){
+                lock.unlock();
+            }
+        }
+    }
 }
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayStudentServiceImpl.java b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayStudentServiceImpl.java
index 52d6633..982e645 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayStudentServiceImpl.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/service/impl/CoalPayStudentServiceImpl.java
@@ -141,4 +141,9 @@
     public List<CoalPayStudent> selectbyIdcard(CoalPayStudentReq coalPayStudent) {
         return coalPayStudentMapper.selectByIdcard(coalPayStudent);
     }
+
+    @Override
+    public CoalPayStudent selectbyId(Long studentId) {
+        return coalPayStudentMapper.selectById(studentId);
+    }
 }
diff --git a/exam-system/src/main/java/com/gkhy/exam/pay/utils/PayUtils.java b/exam-system/src/main/java/com/gkhy/exam/pay/utils/PayUtils.java
index b994838..135fade 100644
--- a/exam-system/src/main/java/com/gkhy/exam/pay/utils/PayUtils.java
+++ b/exam-system/src/main/java/com/gkhy/exam/pay/utils/PayUtils.java
@@ -3,10 +3,7 @@
 import com.alibaba.fastjson2.JSONObject;
 import com.gkhy.exam.pay.entity.PayReqData;
 import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.http.HttpEntity;
-import org.apache.http.HttpResponse;
-import org.apache.http.NameValuePair;
-import org.apache.http.StatusLine;
+import org.apache.http.*;
 import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.HttpResponseException;
@@ -29,6 +26,7 @@
 import org.apache.http.message.BasicNameValuePair;
 import org.apache.http.util.EntityUtils;
 
+import javax.annotation.Resource;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.TrustManager;
 import javax.net.ssl.X509TrustManager;
@@ -44,11 +42,13 @@
  */
 public class PayUtils {
 
+    private final static String appid="ED76A5F1703540BE977D34780B371FEB";
+
+
     public static ResultVo sendApiPost(PayReqData payReqData) throws IOException {
 
         //正式
         String proUrl="http://finpt.xjcz.gov.cn/fs-service/fs-pay/invoice.do";
-        String appid="ED76A5F1703540BE977D34780B371FEB";
         //测试
         String testUrl= "http://finpt.xjcz.gov.cn/fs-service-test/fs-pay/invoice.do";
 
@@ -209,7 +209,82 @@
     }
 
 
+    //缴费结果通知
+    public static Map<String,String> receive(JSONObject jsonObject) throws IOException {
 
+        Map<String, String> params = new HashMap<>();
+        JSONObject reqdata = new JSONObject();
 
+        Map<String,String> result = (Map<String, String>) jsonObject.get("reqdata");
+        String orderNo = result.get("orderNo");
 
+        //确认是否成功
+        String  notarize= affirmPost(orderNo);
+        reqdata.put("orderNo",orderNo);
+        reqdata.put("status",notarize);
+
+        String req = Base64.getEncoder().encodeToString(reqdata.toJSONString().getBytes());
+        String mac = appid+"||"+req;
+        mac = DigestUtils.md5Hex(mac.getBytes());
+        params.put("appid",appid);
+        params.put("reqdata",req);
+        params.put("mac",mac);
+
+        return params;
+    }
+
+    //缴费结果确认查询
+    public static String affirmPost(String orderNo) throws IOException {
+        String porUrl="http://finpt.xjcz.gov.cn/fs-service/fs-pay/notifyConfirm.do";
+        String testUrl="http://finpt.xjcz.gov.cn/fs-service-test/fs-pay/notifyConfirm.do";
+
+        HashMap<String, String> param = new HashMap<>();
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("orderNo",orderNo);
+        String reqdata = Base64.getEncoder().encodeToString(jsonObject.toJSONString().getBytes());
+        String mac = appid+"||"+reqdata;
+        mac=DigestUtils.md5Hex(mac.getBytes());
+        param.put("appid",appid);
+        param.put("reqdata",reqdata);
+        param.put("mac",mac);
+
+        HttpPost httppost = new HttpPost(testUrl);
+        httppost.setEntity(assemblyFormEntity(param,"utf-8"));
+        HttpClient httpClient = getHttpClient(testUrl);
+        HttpResultVo execute = httpClient.execute(httppost, getResponseHandler());
+        String stringContent = execute.getStringContent();
+        ResultVo resultVo = JSONObject.parseObject(stringContent, ResultVo.class);
+        System.out.printf("请求结果为:"+resultVo);
+        if (resultVo.getRespcode().equals("BUS0000")){
+            return "success";
+        }
+        return "fail";
+    }
+
+    //缴费结果查询
+    public static JSONObject query(String orderNo) throws IOException {
+        String proUrl="http://finpt.xjcz.gov.cn/fs-service/fs-pay/query.do";
+        String testUrl="http://finpt.xjcz.gov.cn/fs-service-test/fs-pay/query.do";
+
+        HashMap<String, String> param = new HashMap<>();
+
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("orderNo",orderNo);
+        String reqdata = Base64.getEncoder().encodeToString(jsonObject.toJSONString().getBytes());
+        String mac = appid+"||"+reqdata;
+        mac = DigestUtils.md5Hex(mac.getBytes());
+        param.put("appid",appid);
+        param.put("reqdata",reqdata);
+        param.put("mac",mac);
+
+        HttpPost httppost = new HttpPost(testUrl);
+        httppost.setEntity(assemblyFormEntity(param,"utf-8"));
+        HttpClient httpClient = getHttpClient(testUrl);
+        HttpResultVo execute = httpClient.execute(httppost, getResponseHandler());
+        String stringContent = execute.getStringContent();
+        JSONObject result = JSONObject.parseObject(stringContent);
+        System.out.printf("请求结果json为:"+result);
+        return result;
+    }
 }
diff --git a/exam-system/src/test/java/TextPay.java b/exam-system/src/test/java/TextPay.java
index 5e8fda3..f3b89da 100644
--- a/exam-system/src/test/java/TextPay.java
+++ b/exam-system/src/test/java/TextPay.java
@@ -1,6 +1,9 @@
+import com.alibaba.fastjson2.JSONObject;
 import com.gkhy.exam.pay.entity.PayReqData;
 import com.gkhy.exam.pay.utils.PayUtils;
 import com.gkhy.exam.pay.utils.ResultVo;
+import com.google.gson.JsonObject;
+import com.ruoyi.common.utils.RandomUtil;
 import com.ruoyi.common.utils.uuid.UUID;
 import lombok.extern.log4j.Log4j2;
 import org.junit.jupiter.api.Test;
@@ -12,6 +15,7 @@
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 @SpringBootTest(classes = TextPay.class)
 @ActiveProfiles("dev")
@@ -27,7 +31,7 @@
        PayReqData.Feedata feedatas = new PayReqData.Feedata();
 
        payReqData.setDesc("安全技术考试考务费_煤矿安全作业-001504");
-       payReqData.setOrderNo("10000000001");
+       payReqData.setOrderNo(RandomUtil.generateOrderNumber());
        payReqData.setMoney(BigDecimal.valueOf(103));
        payReqData.setAmount(1);
        payReqData.setPayerName("测试");
@@ -46,13 +50,26 @@
        payReqData.setFeeDatas(feedatas1);
 
 
-       ResultVo resultVo = PayUtils.sendApiPost(payReqData);
+       PayUtils payUtils = new PayUtils();
+       ResultVo resultVo = payUtils.sendApiPost(payReqData);
        System.out.printf("请求结果:"+resultVo);
 
    }
 
 
 
+   @Test
+    public void text001(){
+       try {
+//           String s = PayUtils.affirmPost("10000001");
+           JSONObject query = PayUtils.query("1000001");
+       } catch (IOException e) {
+           throw new RuntimeException(e);
+       }
+   }
+
+
+
 
 
 }
diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml
index 78b298c..bae0a5e 100644
--- a/ruoyi-common/pom.xml
+++ b/ruoyi-common/pom.xml
@@ -161,6 +161,11 @@
             <groupId>com.google.code.gson</groupId>
             <artifactId>gson</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.18.0</version>
+        </dependency>
     </dependencies>
 
 </project>
\ No newline at end of file

--
Gitblit v1.9.2