From f823430e931eec969faf68648c7d9b96d6beba3d Mon Sep 17 00:00:00 2001
From: yupeng <roc__yu@163.com>
Date: 星期五, 24 一月 2025 10:44:33 +0800
Subject: [PATCH] 更新银行配置、新增接口

---
 ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java               |   12 +
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java |    1 
 bankapi/pom.xml                                                                 |    8 +
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java  |   26 +++
 bankapi/src/main/java/com/taxi591/bankapi/service/BankService.java              |   12 +
 bankapi/src/main/java/com/taxi591/bankapi/BankProperties.java                   |    3 
 bankapi/src/main/java/com/taxi591/bankapi/utils/HttpClientUtils.java            |  302 +++++++++++++++++++++++++++++++++++++++++++
 bankapi/src/main/java/com/taxi591/bankapi/utils/Base64Util.java                 |   50 +++++++
 8 files changed, 412 insertions(+), 2 deletions(-)

diff --git a/bankapi/pom.xml b/bankapi/pom.xml
index 4867d1f..d31f24e 100644
--- a/bankapi/pom.xml
+++ b/bankapi/pom.xml
@@ -14,6 +14,9 @@
     <groupId>org.taxi591</groupId>
     <artifactId>bankapi</artifactId>
     <version>1.0.0-SNAPSHOT</version>
+    <properties>
+        <httpclient_version>4.5.2</httpclient_version>
+    </properties>
     <dependencies>
         <dependency>
             <groupId>com.ruoyi</groupId>
@@ -23,6 +26,11 @@
             <groupId>com.ruoyi</groupId>
             <artifactId>ruoyi-common</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>${httpclient_version}</version>
+        </dependency>
     </dependencies>
     <build>
         <plugins>
diff --git a/bankapi/src/main/java/com/taxi591/bankapi/BankProperties.java b/bankapi/src/main/java/com/taxi591/bankapi/BankProperties.java
index fd391c9..6e959eb 100644
--- a/bankapi/src/main/java/com/taxi591/bankapi/BankProperties.java
+++ b/bankapi/src/main/java/com/taxi591/bankapi/BankProperties.java
@@ -15,6 +15,9 @@
 
     private Boolean enable = true;
 
+
+    private String baseUrl="http://hello.enjoy.abchina.com";
+
     /**
      * 证书路径
      */
diff --git a/bankapi/src/main/java/com/taxi591/bankapi/service/BankService.java b/bankapi/src/main/java/com/taxi591/bankapi/service/BankService.java
index cd16b9b..39adb3b 100644
--- a/bankapi/src/main/java/com/taxi591/bankapi/service/BankService.java
+++ b/bankapi/src/main/java/com/taxi591/bankapi/service/BankService.java
@@ -64,9 +64,10 @@
      */
     public CovertPayBackResult covertPayCallBack(HttpServletRequest httpRequest, Function<ChargeBillRequest,Boolean> consumer) {
         CovertPayBackResult result = new CovertPayBackResult();
+        String requestContent = "";
         try {
             // 接收报文
-            String requestContent = SignatureAndVerification.getRequestBody(httpRequest).trim();
+            requestContent = SignatureAndVerification.getRequestBody(httpRequest).trim();
             String sign = requestContent.substring(0,
                     requestContent.indexOf("||"));;
             String requestBody = requestContent.substring(sign
@@ -95,13 +96,20 @@
             }
             result.setResult(chargeBillRequest);
             result.setBack(createResponse(chargeBillRequest,dealBack));
+        }catch (ServiceException e){
+            throw e;
         }catch (Exception e){
-            log.error("解析报文发生异常",e);
+            log.error("解析异常:{}",requestContent,e);
+            throw new ServiceException("支付回调解析异常");
         }
         return result;
     }
 
 
+    public void covertBillTo(){
+
+
+    }
 
 
 
diff --git a/bankapi/src/main/java/com/taxi591/bankapi/utils/Base64Util.java b/bankapi/src/main/java/com/taxi591/bankapi/utils/Base64Util.java
new file mode 100644
index 0000000..4cec7d4
--- /dev/null
+++ b/bankapi/src/main/java/com/taxi591/bankapi/utils/Base64Util.java
@@ -0,0 +1,50 @@
+package com.taxi591.bankapi.utils;
+
+import org.apache.commons.codec.binary.Base64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.UnsupportedEncodingException;
+
+/**
+ * 将String进行base64编码解码,使用utf-8
+ * yuan
+ */
+public class Base64Util {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(Base64Util.class);
+    private static final String UTF_8 = "UTF-8";
+
+    /**
+     * 对给定的字符串进行base64解码操作
+     */
+    public static String decodeData(String inputData) {
+        try {
+            if (null == inputData) {
+                return null;
+            }
+            return new String(Base64.decodeBase64(inputData.getBytes(UTF_8)), UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            LOGGER.error(inputData, e);
+        }
+
+        return null;
+    }
+
+    /**
+     * 对给定的字符串进行base64加密操作
+     */
+    public static String encodeData(String inputData) {
+        try {
+            if (null == inputData) {
+                return null;
+            }
+            return new String(Base64.encodeBase64(inputData.getBytes(UTF_8)), UTF_8);
+        } catch (UnsupportedEncodingException e) {
+            LOGGER.error(inputData, e);
+        }
+
+        return null;
+    }
+
+}
\ No newline at end of file
diff --git a/bankapi/src/main/java/com/taxi591/bankapi/utils/HttpClientUtils.java b/bankapi/src/main/java/com/taxi591/bankapi/utils/HttpClientUtils.java
new file mode 100644
index 0000000..7458c49
--- /dev/null
+++ b/bankapi/src/main/java/com/taxi591/bankapi/utils/HttpClientUtils.java
@@ -0,0 +1,302 @@
+package com.taxi591.bankapi.utils;
+
+import org.apache.http.Header;
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.*;
+import java.util.Map.Entry;
+
+/**
+ *httpClient操作远程url工具类
+ */
+public class HttpClientUtils {
+	private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class);
+	/**
+	 * 发送str格式的post请求
+	 * @param url
+	 * @param jsonStr
+	 * @return
+	 */
+	public static String doPostStr(String url, String str) {
+		// 建立HttpPost对象
+		HttpPost httppost = new HttpPost(url);
+		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+		CloseableHttpClient client = httpClientBuilder.build();
+//		int statusCode = 0;
+		String responseBody = null;
+		try {
+			// 设置发送内容、编码等
+			StringEntity stringEntity = new StringEntity(str, "utf-8");
+			stringEntity.setContentType("text/plain");
+			httppost.setEntity(stringEntity);
+			// 发送Post,并返回一个HttpResponse对象
+			HttpResponse response = client.execute(httppost);
+//			// 获取返回码
+//			statusCode = response.getStatusLine().getStatusCode();
+			// 获取返回报文
+			responseBody = EntityUtils.toString(response.getEntity());
+			return responseBody;
+		}catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	
+	/**
+	 * 下载文件
+	 * @param url
+	 * @param jsonStr
+	 * @param 前台的返回流
+	 * @return
+	 */
+	public static void doPostFile(String url, String str,HttpServletResponse httpResponse) {
+		ServletOutputStream out = null;
+		// 建立HttpPost对象
+		HttpPost httppost = new HttpPost(url);
+		HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
+		CloseableHttpClient client = httpClientBuilder.build();
+		try {
+			// 设置发送内容、编码等
+			StringEntity stringEntity = new StringEntity(str, "utf-8");
+			stringEntity.setContentType("text/plain");
+			httppost.setEntity(stringEntity);
+			// 发送Post,并返回一个HttpResponse对象
+			HttpResponse response = client.execute(httppost);
+			// 获取返回报文
+			String responseStr = EntityUtils.toString(response.getEntity());
+		
+			//如果系统返回未加密异常则会返回"{"+json+"}"
+			if (responseStr.startsWith("{")){
+				//设置响应头信息为页面形式
+				httpResponse.setCharacterEncoding("UTF-8");
+				httpResponse.setContentType("text/html;charset=utf-8");
+				httpResponse.sendRedirect("downloadTraceFail.jsp");
+				
+			//如果返回内容为异常信息则返回内容为"签名||base64加密"形式
+			}else if (responseStr.contains("||")) {
+				//截取签名信息
+				String headSub = responseStr.substring(0, responseStr.indexOf("||"));
+				logger.warn("获取签名的前半部分:"+headSub);
+				//截取加密的json信息,进行解密
+				String tailSub = responseStr.substring(responseStr.indexOf("||")+2);
+				logger.warn("获取签名的后半部分:"+tailSub);
+				//将获取到的json报文进行解析,获取报文体信息
+				responseStr = Base64Util.decodeData(tailSub);
+				logger.warn("获取签名解密后:"+responseStr);
+				
+				//设置响应头信息为页面形式
+				httpResponse.setCharacterEncoding("UTF-8");
+				httpResponse.setContentType("text/html;charset=utf-8");
+				httpResponse.sendRedirect("downloadTraceFail.jsp");
+				
+			//返回内容为正常内容,将response消息头读取直接写入httpResponse中
+			}else{
+				Header[] encode = response.getAllHeaders();
+				for (Header header : encode) {
+					httpResponse.setHeader(header.getName(), header.getValue());
+				}
+			}
+			//将获取到的信息封装到httpEntity中,反映到页面中去
+			logger.warn("最终获取到的信息:"+responseStr);
+			HttpEntity entity = new StringEntity(responseStr,"UTF-8");
+			//通过输出流将结果反映到页面上
+			out = httpResponse.getOutputStream();
+			entity.writeTo(out);
+			out.flush();
+		}catch (Exception e) {
+			e.printStackTrace();
+		}finally{
+			if(out != null){
+				try {
+					out.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+	
+	/**
+	 * get 请求方法
+	 * @param url
+	 * @return
+	 */
+	public static String doGet(String url) {
+		CloseableHttpClient httpClient = null;
+		CloseableHttpResponse response = null;
+		String result = "";
+		
+		try {
+			//通过址默认配置创建一个httpClient实例
+			httpClient = HttpClients.createDefault();
+			//创建httpGet远程连接实例
+			HttpGet httpGet = new HttpGet(url);
+			//设置配置请求参数
+			RequestConfig requestConfig = RequestConfig.custom()
+					.setConnectTimeout(35000)//连接主机服务超时时间
+					.setConnectionRequestTimeout(35000)//请求超时时间
+					.setSocketTimeout(60000)//数据读取超时时间
+					.build();
+			//为httpGet实例设置配置
+			httpGet.setConfig(requestConfig);
+			//执行get请求得到返回对象
+			response = httpClient.execute(httpGet);
+			//通过返回对象获取返回数据
+			HttpEntity entity = response.getEntity();
+			//通过EntityUtils中的toString方法将结果转换为字符串
+			result = EntityUtils.toString(entity);
+			
+		} catch (ClientProtocolException e) {
+			e.printStackTrace();
+		} catch (IOException e) {
+			e.printStackTrace();
+		} finally {
+			//关闭资源
+			if(null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			
+			if(null != httpClient) {
+				try {
+					httpClient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		
+		return result;
+	}
+
+	/**
+	 * post请求
+	 * @param url
+	 * @param paramMap
+	 * @return
+	 */
+	public static String doPost(String url, Map<String,Object> paramMap) {
+		CloseableHttpClient httpClient = null;
+		CloseableHttpResponse response = null;
+		String result = "";
+		
+		try {
+			//创建httpClient实例
+			httpClient = HttpClients.createDefault();
+			//创建httpPost远程连接实例
+			HttpPost httpPost = new HttpPost(url);
+			//配置请求参数实例
+			RequestConfig requestConfig = RequestConfig.custom()
+					.setConnectTimeout(35000)//设置连接主机服务超时时间
+					.setConnectionRequestTimeout(35000)//设置连接请求超时时间
+					.setSocketTimeout(60000)//设置读取数据连接超时时间
+					.build();
+			//为httpPost实例设置配置
+			httpPost.setConfig(requestConfig);
+			
+			//封装post请求参数
+			if(null != paramMap && paramMap.size() > 0) {
+				List<NameValuePair> nvps = new ArrayList<NameValuePair>();
+				//通过map集成entrySet方法获取entity
+				Set<Entry<String, Object>> entrySet = paramMap.entrySet();
+				//循环遍历,获取迭代器
+				Iterator<Entry<String, Object>> iterator = entrySet.iterator();
+				while (iterator.hasNext()) {
+					Entry<String, Object> mapEntry = iterator.next();
+					nvps.add(new BasicNameValuePair(mapEntry.getKey(), mapEntry.getValue().toString()));
+				}
+				
+				//为httpPost设置封装好的请求参数
+				httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));
+			}
+		
+			//执行post请求得到返回对象
+			response = httpClient.execute(httpPost);
+			//通过返回对象获取数据
+			HttpEntity entity = response.getEntity();
+			//将返回的数据转换为字符串
+			result = EntityUtils.toString(entity);
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			//关闭资源
+			if(null != response) {
+				try {
+					response.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+			
+			if(null != httpClient) {
+				try {
+					httpClient.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+		return result;
+	}
+	
+
+	/**
+	 * 
+	 * @param request
+	 * @return
+	 * @throws IOException
+	 */
+	public static String getRequestBody(HttpServletRequest request)
+			throws IOException {
+		/** 读取httpbody内容 */
+		StringBuilder httpBody = new StringBuilder();
+		BufferedReader br = null;
+		try {
+			br = new BufferedReader(new InputStreamReader(
+					request.getInputStream()));
+			String line = null;
+			while ((line = br.readLine()) != null) {
+				httpBody.append(line);
+			}
+		} catch (IOException ex) {
+			throw ex;
+		} finally {
+			if (br != null) {
+				try {
+					br.close();
+				} catch (IOException ex) {
+					ex.printStackTrace();
+				}
+			}
+		}
+		return httpBody.toString();
+	}
+
+	
+	
+}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
index 4ae6b2b..fc28438 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -12,6 +12,7 @@
 import com.ruoyi.system.service.TContractService;
 import com.ruoyi.system.service.THouseService;
 import com.ruoyi.system.vo.HouseVO;
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java
new file mode 100644
index 0000000..56fb75f
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/query/TBillQuery.java
@@ -0,0 +1,12 @@
+package com.ruoyi.system.query;
+
+import com.ruoyi.common.core.domain.BasePage;
+import lombok.Data;
+
+@Data
+public class TBillQuery extends BasePage {
+
+
+
+
+}
diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
index c0e3bd4..0418f45 100644
--- a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TBillServiceImpl.java
@@ -1,9 +1,14 @@
 package com.ruoyi.system.service.impl;
 
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.core.redis.RedisCache;
 import com.ruoyi.system.mapper.TBillMapper;
 import com.ruoyi.system.model.TBill;
+import com.ruoyi.system.query.TBillQuery;
 import com.ruoyi.system.service.TBillService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import io.jsonwebtoken.lang.Assert;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +22,25 @@
 @Service
 public class TBillServiceImpl extends ServiceImpl<TBillMapper, TBill> implements TBillService {
 
+    @Autowired
+    RedisCache redisCache;
+
+    public AjaxResult queryPage(TBillQuery query){
+        return AjaxResult.success();
+    }
+
+
+
+    /**
+     * 传的金额
+     * @param tBill
+     * @return
+     */
+    public Boolean checkAndUpdateBill(TBill tBill){
+        return true;
+    }
+
+
+
+
 }

--
Gitblit v1.7.1