提交 7aabcfa3 authored 作者: hzh's avatar hzh

代码优化

上级 c459834b
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>ruoyi-common-51weishi</artifactId>
<description>
ruoyi-common-51weishi 51旅游卫士模块
</description>
<dependencies>
<dependency>
<groupId>org.dromara</groupId>
<artifactId>ruoyi-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.22</version>
</dependency>
</dependencies>
</project>
package org.dromara.common.weishi;
import cn.hutool.core.date.StopWatch;
import cn.hutool.http.ContentType;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.dromara.common.weishi.base.HttpKit;
import org.dromara.common.weishi.base.PayKit;
import org.dromara.common.weishi.base.RequestMethodEnum;
import org.dromara.common.weishi.common.ApiHttpResponse;
import org.dromara.common.weishi.enums.ApiEnum;
import org.dromara.common.weishi.enums.Domain;
import org.dromara.common.weishi.enums.DomainEnum;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-15
* @desc api相关接口
**/
@Slf4j
public class Api {
/**
* 获取接口请求的 URL
*
* @param apiEnum {@link ApiEnum} API 接口枚举
* @return {@link String} 返回完整的接口请求URL
*/
public static String getReqUrl(ApiEnum apiEnum) {
return getReqUrl(apiEnum, null);
}
/**
* 获取接口请求的 URL
*
* @param apiEnum {@link ApiEnum} API 接口枚举
* @param domain {@link Domain} API 接口域名枚举
* @return {@link String} 返回完整的接口请求URL
*/
public static String getReqUrl(ApiEnum apiEnum, Domain domain) {
if (domain == null) {
domain = DomainEnum.TEST;
}
return domain.getDomain()
.concat(apiEnum.getUrl());
}
public static ApiHttpResponse v1(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String token,
String body) {
return v1(method, urlPrefix, urlSuffix, token, null, body, null);
}
public static ApiHttpResponse v1(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String token,
Map<String, Object> params, String body) {
return v1(method, urlPrefix, urlSuffix, token, params, body, null);
}
/**
* v1 接口统一执行人口
*
* @param method {@link RequestMethodEnum} 请求方法
* @param urlPrefix 可通过 {@link Domain}来获取
* @param urlSuffix 可通过 {@link ApiEnum} 来获取,URL挂载参数需要自行拼接
* @param token token
* @param params Get 接口请求参数
* @param body 接口请求参数
* @param file 文件
* @return 请求返回的结果
*/
public static ApiHttpResponse v1(RequestMethodEnum method, String urlPrefix, String urlSuffix,
String token,
Map<String, Object> params, String body, File file) {
if (null != params && !params.keySet().isEmpty()) {
urlSuffix = urlSuffix.concat("?").concat(PayKit.createLinkString(params, true));
}
// 构建 Authorization
String authorization = token;
if (method == RequestMethodEnum.GET) {
return get(urlPrefix.concat(urlSuffix), authorization, null);
} else if (method == RequestMethodEnum.POST) {
return post(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == RequestMethodEnum.DELETE) {
return delete(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == RequestMethodEnum.UPLOAD) {
return upload(urlPrefix.concat(urlSuffix), authorization, body, file);
} else if (method == RequestMethodEnum.PATCH) {
return patch(urlPrefix.concat(urlSuffix), authorization, body);
} else if (method == RequestMethodEnum.PUT) {
return put(urlPrefix.concat(urlSuffix), authorization, body);
}
return null;
}
/**
* put 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse put(String url, String authorization, String data) {
return put(url, data, getHeaders(authorization));
}
/**
* put 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse put(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().put(url, data, headers);
}
/**
* patch 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse patch(String url, String authorization, String data) {
return patch(url, data, getHeaders(authorization));
}
/**
* patch 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse patch(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().patch(url, data, headers);
}
/**
* upload 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @param file 上传文件
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse upload(String url, String authorization, String data, File file) {
Map<String, Object> paramMap = new HashMap<>(2);
paramMap.put("file", file);
paramMap.put("meta", data);
return upload(url, paramMap, getUploadHeaders(authorization));
}
/**
* upload 请求
*
* @param url 请求url
* @param params 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse upload(String url, Map<String, Object> params, Map<String, String> headers) {
return HttpKit.getDelegate().post(url, params, headers);
}
public static Map<String, String> getUploadHeaders(String authorization) {
Map<String, String> headers = getBaseHeaders(authorization);
headers.put("Content-Type", "multipart/form-data;boundary=\"boundary\"");
return headers;
}
/**
* delete 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse delete(String url, String authorization, String data) {
return delete(url, data, getHeaders(authorization));
}
/**
* delete 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse delete(String url, String data, Map<String, String> headers) {
return HttpKit.getDelegate().delete(url, data, headers);
}
/**
* post 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param data 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse post(String url, String authorization, String data) {
return post(url, data, getHeaders(authorization));
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse post(String url, String data, Map<String, String> headers) {
log.info("请求路径:{}", url);
log.info("请求头:{}", JSON.toJSONString(headers));
log.info("请求体:{}", data);
StopWatch watch = new StopWatch();
watch.start();
ApiHttpResponse res = HttpKit.getDelegate().post(url, data, headers);
log.info("返回参数:{}", JSON.toJSONString(res));
watch.stop();
log.info("请求耗时:{}ms", watch.getTotalTimeMillis());
return res;
}
/**
* get 请求
*
* @param url 请求url
* @param authorization 授权信息
* @param params 请求参数
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse get(String url, String authorization, Map<String, Object> params) {
return get(url, params, getHeaders(authorization));
}
public static boolean isProd(String url) {
return url.startsWith(DomainEnum.PROD.getDomain());
}
/**
* get 请求
*
* @param url 请求url
* @param params 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public static ApiHttpResponse get(String url, Map<String, Object> params, Map<String, String> headers) {
return HttpKit.getDelegate().get(url, params, headers);
}
public static Map<String, String> getHeaders(String authorization) {
Map<String, String> headers = getBaseHeaders(authorization);
headers.put("Accept-language", "zh-CN,zh");
headers.put("Content-Type", ContentType.JSON.toString());
if (StringUtils.isNotEmpty(authorization)) {
headers.put("Authorization", "Bearer " + authorization);
}
return headers;
}
public static Map<String, String> getBaseHeaders(String authorization) {
Map<String, String> headers = new HashMap<>(5);
headers.put("Accept", ContentType.JSON.toString());
if (StringUtils.isNotEmpty(authorization)) {
headers.put("Authorization", "Bearer " + authorization);
}
return headers;
}
}
package org.dromara.common.weishi.base;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.net.SSLContextBuilder;
import cn.hutool.core.net.SSLProtocols;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import org.dromara.common.weishi.common.ApiHttpResponse;
import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLSocketFactory;
import java.io.File;
import java.io.InputStream;
import java.net.Proxy;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Map;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付等常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Http 代理类</p>
*
* @author Javen
*/
public abstract class AbstractHttpDelegate {
/**
* 设置代理
*
* @return {@link Proxy} 代理对象
*/
public Proxy getProxy() {
return null;
}
/**
* get 请求
*
* @param url 请求url
* @return {@link String} 请求返回的结果
*/
public String get(String url) {
return HttpUtil.get(url);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @return {@link String} 请求返回的结果
*/
public String get(String url, Map<String, Object> paramMap) {
return HttpUtil.get(url, paramMap);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse get(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = getToResponse(url, paramMap, headers);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data) {
return HttpUtil.post(url, data);
}
/**
* post 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @return {@link String} 请求返回的结果
*/
public String post(String url, Map<String, Object> paramMap) {
return HttpUtil.post(url, paramMap);
}
/**
* post 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse post(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = postToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse post(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = postToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* patch 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse patch(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = patchToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* patch 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse patch(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = patchToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* delete 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse delete(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = deleteToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* delete 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse delete(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = deleteToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* put 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse put(String url, Map<String, Object> paramMap, Map<String, String> headers) {
HttpResponse httpResponse = putToResponse(url, headers, paramMap);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* put 请求
*
* @param url 请求url
* @param data 请求参数
* @param headers 请求头
* @return {@link ApiHttpResponse} 请求返回的结果
*/
public ApiHttpResponse put(String url, String data, Map<String, String> headers) {
HttpResponse httpResponse = putToResponse(url, headers, data);
return JSONObject.parseObject(httpResponse.body(), ApiHttpResponse.class);
}
/**
* 上传文件
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param filePath 上传文件路径
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String upload(String url, String data, String certPath, String certPass, String filePath, String protocol) {
try {
File file = FileUtil.newFile(filePath);
SSLSocketFactory sslSocketFactory = getSslSocketFactory(certPath, null, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(sslSocketFactory)
.header("Content-Type", "multipart/form-data;boundary=\"boundary\"")
.form("file", file)
.form("meta", data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 上传文件
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param filePath 上传文件路径
* @return {@link String} 请求返回的结果
*/
public String upload(String url, String data, String certPath, String certPass, String filePath) {
return upload(url, data, certPath, certPass, filePath, SSLProtocols.TLSv1);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, String certPath, String certPass, String protocol) {
try {
SSLSocketFactory socketFactory = getSslSocketFactory(certPath, null, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(socketFactory)
.body(data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certPath 证书路径
* @param certPass 证书密码
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, String certPath, String certPass) {
return post(url, data, certPath, certPass, SSLProtocols.TLSv1);
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certFile 证书文件输入流
* @param certPass 证书密码
* @param protocol 协议
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, InputStream certFile, String certPass, String protocol) {
try {
SSLSocketFactory sslSocketFactory = getSslSocketFactory(null, certFile, certPass, protocol);
return HttpRequest.post(url)
.setProxy(getProxy())
.setSSLSocketFactory(sslSocketFactory)
.body(data)
.execute()
.body();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* post 请求
*
* @param url 请求url
* @param data 请求参数
* @param certFile 证书文件输入流
* @param certPass 证书密码
* @return {@link String} 请求返回的结果
*/
public String post(String url, String data, InputStream certFile, String certPass) {
return post(url, data, certFile, certPass, SSLProtocols.TLSv1);
}
/**
* get 请求
*
* @param url 请求url
* @param paramMap 请求参数
* @param headers 请求头
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse getToResponse(String url, Map<String, Object> paramMap, Map<String, String> headers) {
return HttpRequest.get(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* post 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse postToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.post(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* post 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse postToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.post(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* patch 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse patchToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.patch(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* patch 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse patchToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.patch(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* delete 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse deleteToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.delete(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* delete 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse deleteToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.delete(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
/**
* put 请求
*
* @param url 请求url
* @param headers 请求头
* @param data 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse putToResponse(String url, Map<String, String> headers, String data) {
return HttpRequest.put(url)
.setProxy(getProxy())
.addHeaders(headers)
.body(data)
.execute();
}
/**
* put 请求
*
* @param url 请求url
* @param headers 请求头
* @param paramMap 请求参数
* @return {@link HttpResponse} 请求返回的结果
*/
private HttpResponse putToResponse(String url, Map<String, String> headers, Map<String, Object> paramMap) {
return HttpRequest.put(url)
.setProxy(getProxy())
.addHeaders(headers)
.form(paramMap)
.execute();
}
private KeyManager[] getKeyManager(String certPass, String certPath, InputStream certFile) throws Exception {
KeyStore clientStore = KeyStore.getInstance("PKCS12");
if (certFile != null) {
clientStore.load(certFile, certPass.toCharArray());
} else {
clientStore.load(Files.newInputStream(Paths.get(certPath)), certPass.toCharArray());
}
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(clientStore, certPass.toCharArray());
return kmf.getKeyManagers();
}
private SSLSocketFactory getSslSocketFactory(String certPath, InputStream certFile, String certPass, String protocol) throws Exception {
SSLContextBuilder sslContextBuilder = SSLContextBuilder.create();
sslContextBuilder.setProtocol(protocol);
sslContextBuilder.setKeyManagers(getKeyManager(certPass, certPath, certFile));
sslContextBuilder.setSecureRandom(new SecureRandom());
return sslContextBuilder.buildChecked().getSocketFactory();
}
}
package org.dromara.common.weishi.base;
import jakarta.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Http 工具类</p>
*
* @author Javen
*/
public class HttpKit {
private static AbstractHttpDelegate delegate = new DefaultHttpKit();
public static AbstractHttpDelegate getDelegate() {
return delegate;
}
public static void setDelegate(AbstractHttpDelegate delegate) {
HttpKit.delegate = delegate;
}
public static String readData(HttpServletRequest request) {
BufferedReader br = null;
try {
StringBuilder result = new StringBuilder();
br = request.getReader();
for (String line; (line = br.readLine()) != null; ) {
if (result.length() > 0) {
result.append("\n");
}
result.append(line);
}
return result.toString();
} catch (IOException e) {
throw new RuntimeException(e);
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
/**
* 将同步通知的参数转化为Map
*
* @param request {@link HttpServletRequest}
* @return 转化后的 Map
*/
public static Map<String, String> toMap(HttpServletRequest request) {
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (String name : requestParams.keySet()) {
String[] values = requestParams.get(name);
String valueStr = "" ;
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + "," ;
}
params.put(name, valueStr);
}
return params;
}
}
/**
* 使用 huTool 实现的 Http 工具类
*
* @author Javen
*/
class DefaultHttpKit extends AbstractHttpDelegate {
}
package org.dromara.common.weishi.base;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.*;
public class PayKit {
/**
* 把所有元素排序
*
* @param params 需要排序并参与字符拼接的参数组
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params) {
return createLinkString(params, false);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, boolean encode) {
return createLinkString(params, "&", encode);
}
/**
* @param params 需要排序并参与字符拼接的参数组
* @param connStr 连接符号
* @param encode 是否进行URLEncoder
* @return 拼接后字符串
*/
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode) {
return createLinkString(params, connStr, encode, false);
}
public static String createLinkString(Map<String, Object> params, String connStr, boolean encode, boolean quotes) {
List<String> keys = new ArrayList<>(params.keySet());
Collections.sort(keys);
StringBuilder content = new StringBuilder();
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
Object value = params.get(key);
// 参数的值为空不参与签名
if (Objects.isNull(value)) {
continue;
}
// 拼接时,不包括最后一个&字符
if (i == keys.size() - 1) {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"');
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value);
}
} else {
if (quotes) {
content.append(key).append("=").append('"').append(encode ? urlEncode(value.toString()) : value).append('"').append(connStr);
} else {
content.append(key).append("=").append(encode ? urlEncode(value.toString()) : value).append(connStr);
}
}
}
return content.toString();
}
/**
* URL 编码
*
* @param src 需要编码的字符串
* @return 编码后的字符串
*/
public static String urlEncode(String src) {
return URLEncoder.encode(src, StandardCharsets.UTF_8).replace("+", "%20");
}
}
package org.dromara.common.weishi.base;
/**
* HTTP 请求方法枚举
*
* @author wenhe
*/
public enum RequestMethodEnum {
/**
* 上传实质是 post 请求
*/
UPLOAD("POST"),
/**
* post 请求
*/
POST("POST"),
/**
* get 请求
*/
GET("GET"),
/**
* put 请求
*/
PUT("PUT"),
/**
* delete 请求
*/
DELETE("DELETE"),
/**
* options 请求
*/
OPTIONS("OPTIONS"),
/**
* head 请求
*/
HEAD("HEAD"),
/**
* trace 请求
*/
TRACE("TRACE"),
/**
* connect 请求
*/
CONNECT("CONNECT"),
/**
* PATCH 请求
*/
PATCH("PATCH"),
;
private final String method;
RequestMethodEnum(String method) {
this.method = method;
}
@Override
public String toString() {
return this.method;
}
}
package org.dromara.common.weishi.common;
import lombok.Data;
/**
* @author hzh
* @date 2024-10-15
* @desc 响应实体
**/
@Data
public class ApiHttpResponse {
/**
* 返回消息提示
*/
private String ResultMsg;
/**
* 返回代码
*/
private int ResultTp;
/**
* 返回数据
*/
private String Data;
}
package org.dromara.common.weishi.common;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* code返回值
*
* @author wenhe
*/
@Getter
@AllArgsConstructor
public enum Code {
/**
* 成功
*/
SUCCESS(0, "成功");
private final Integer code;
private final String message;
}
package org.dromara.common.weishi.common;
import lombok.*;
import lombok.experimental.Accessors;
import java.util.List;
import java.util.Map;
/**
* @author hzh
* @date 2024-10-18
* @desc 分页信息
**/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class PageInfo<T> {
/**
* 额外参数
*/
private Map<String, Object> map;
/**
* 总记录数
*/
private Integer total;
/**
* 总页数
*/
private Integer pages;
/**
* 当前页数
*/
private Integer pageNum;
/**
* 每页显示的数量
*/
private Integer count;
/**
* 结果集合
*/
private List<T> list;
}
package org.dromara.common.weishi.config;
/**
* @author wenhe
*/
public interface UserConfig {
/**
* 用户名
*/
String USERNAME = "testuser";
/**
* 密码
*/
String PASSWORD = "Abc123.";
}
package org.dromara.common.weishi.enums;
import java.util.Arrays;
import java.util.Optional;
/**
* API枚举接口
*
* @author hzh
*/
public interface ApiEnum {
/**
* 根据 url 获取枚举值
*
* @param enumClass 枚举class
* @param url url
* @param <E> 枚举类
* @return 枚举值
*/
static <E extends Enum<?> & ApiEnum> Optional<E> urlOf(Class<E> enumClass, String url) {
return Arrays.stream(enumClass.getEnumConstants()).filter(e -> e.getUrl().equals(url)).findFirst();
}
/**
* 获取枚举URL
*
* @return 枚举编码
*/
String getUrl();
/**
* 获取详细的描述信息
*
* @return 描述信息
*/
String getDesc();
}
package org.dromara.common.weishi.enums;
/**
* 获取可用域名
*
* @author wenhe
*/
public interface Domain {
/**
* 获取域名
*
* @return 返回域名
*/
String getDomain();
}
package org.dromara.common.weishi.enums;
/**
* 域名枚举
*
* @author wenhe
*/
public enum DomainEnum implements Domain {
/**
* 测试域名
*/
TEST("https://beta.51weishi.com:5005"),
/**
* 生产域名
*/
PROD("https://insure.51weishi.com");
/**
* 域名
*/
private final String domain;
DomainEnum(String domain) {
this.domain = domain;
}
@Override
public String getDomain() {
return domain;
}
@Override
public String toString() {
return domain;
}
}
...@@ -29,7 +29,7 @@ public enum InsureApiEnum implements ApiEnum { ...@@ -29,7 +29,7 @@ public enum InsureApiEnum implements ApiEnum {
/** /**
* 保单撤单接口 * 保单撤单接口
*/ */
INSURE_CANCEL("/api/v1/insure/withdraw/policy/{policyNum}", "保单撤单接口"), POLICY_CANCEL("/api/v1/insure/withdraw/policy/{policyNum}", "保单撤单接口"),
/** /**
* 根据订单号下载保单 * 根据订单号下载保单
*/ */
......
package org.dromara.common.weishi.exception;
import java.io.Serial;
/**
* @author hzh
* @date 2025-05-12
**/
public class WeishiException extends RuntimeException{
@Serial
private static final long serialVersionUID = 1L;
public WeishiException(String message) {
super(message);
}
}
/**
* <p>IJPay 让支付触手可及,封装了微信支付、支付宝支付、银联支付常用的支付方式以及各种常用的接口。</p>
*
* <p>不依赖任何第三方 mvc 框架,仅仅作为工具使用简单快速完成支付模块的开发,可轻松嵌入到任何系统里。 </p>
*
* <p>IJPay 交流群: 723992875、864988890</p>
*
* <p>Node.js 版: <a href="https://gitee.com/javen205/TNWX">https://gitee.com/javen205/TNWX</a></p>
*
* <p>Model 公用方法</p>
*
* @author Javen
*/
package org.dromara.common.weishi.model;
import cn.hutool.core.util.StrUtil;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class BaseModel {
/**
* 将建构的 builder 转为 Map
*
* @return 转化后的 Map
*/
public Map<String, String> toMap() {
String[] fieldNames = getFiledNames(this);
HashMap<String, String> map = new HashMap<String, String>(fieldNames.length);
for (String name : fieldNames) {
String value = (String) getFieldValueByName(name, this);
if (StrUtil.isNotEmpty(value)) {
map.put(name, value);
}
}
return map;
}
/**
* 获取属性名数组
*
* @param obj 对象
* @return 返回对象属性名数组
*/
public String[] getFiledNames(Object obj) {
Field[] fields = obj.getClass().getDeclaredFields();
String[] fieldNames = new String[fields.length];
for (int i = 0; i < fields.length; i++) {
fieldNames[i] = fields[i].getName();
}
return fieldNames;
}
/**
* 根据属性名获取属性值
*
* @param fieldName 属性名称
* @param obj 对象
* @return 返回对应属性的值
*/
public Object getFieldValueByName(String fieldName, Object obj) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = new StringBuffer().append("get")
.append(firstLetter)
.append(fieldName.substring(1))
.toString();
Method method = obj.getClass().getMethod(getter);
return method.invoke(obj);
} catch (Exception e) {
return null;
}
}
}
...@@ -3,8 +3,10 @@ package org.dromara.common.weishi.model.req; ...@@ -3,8 +3,10 @@ package org.dromara.common.weishi.model.req;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data @Data
@Accessors(chain = true)
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
public class AuthRequest { public class AuthRequest {
......
package org.dromara.common.weishi.service;
import org.dromara.common.weishi.model.req.ApplyRequest;
import org.dromara.common.weishi.model.req.ProposalRequest;
import org.dromara.common.weishi.model.res.*;
import java.util.List;
/**
* @author wenhe
*/
public interface WeishiService {
/**
* 认证接口
*
* @return 数据
*/
AuthResponse authorize();
/**
* 保险下单接口
*
* @param request 请求参数
* @return 响应数据
*/
ApplyResponse insureApply(ApplyRequest request);
/**
* 核保接口
*
* @param request 请求参数
* @return 响应数据
*/
ProposalResponse insureProposal(ProposalRequest request);
/**
* 签单接口
*
* @param orderNum 订单号
* @return 数据
*/
IssueResponse insureDetail(String orderNum);
/**
* 订单撤单接口
*
* @param orderNum 订单号
*/
void insureCancel(String orderNum);
/**
* 保单撤单接口
*
* @param policyNum 保单号
*/
void policyCancel(String policyNum);
/**
* 产品列表接口
*
* @return 产品列表
*/
List<ProductsResponse> productList();
/**
* 产品详情
*
* @param productId 产品id
* @return 产品详情
*/
ProductResponse productDetail(Integer productId);
/**
* 获取保险公司相关文档接口
* @param productId 产品id
* @param annexTp
* @return
*/
AnnexResponse annex(Integer productId,String annexTp);
}
package org.dromara.common.weishi.service.impl;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import org.dromara.common.weishi.Api;
import org.dromara.common.weishi.base.RequestMethodEnum;
import org.dromara.common.weishi.common.ApiHttpResponse;
import org.dromara.common.weishi.common.Code;
import org.dromara.common.weishi.config.UserConfig;
import org.dromara.common.weishi.enums.DomainEnum;
import org.dromara.common.weishi.enums.auth.AuthApiEnum;
import org.dromara.common.weishi.enums.insure.InsureApiEnum;
import org.dromara.common.weishi.enums.product.ProductApiEnum;
import org.dromara.common.weishi.exception.WeishiException;
import org.dromara.common.weishi.model.req.ApplyRequest;
import org.dromara.common.weishi.model.req.AuthRequest;
import org.dromara.common.weishi.model.req.ProposalRequest;
import org.dromara.common.weishi.model.res.*;
import org.dromara.common.weishi.service.WeishiService;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @author hzh
* @date 2025-05-12
**/
public class WeishiServiceImpl implements WeishiService {
@Override
public AuthResponse authorize() {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
AuthApiEnum.AUTHORIZE.getUrl(),
null,
JSON.toJSONString(
new AuthRequest()
.setUsername(UserConfig.USERNAME)
.setPassword(UserConfig.PASSWORD)
));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), AuthResponse.class);
}
@Override
public ApplyResponse insureApply(ApplyRequest request) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
InsureApiEnum.APPLY.getUrl(),
getToken(),
JSON.toJSONString(request));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ApplyResponse.class);
}
@Override
public ProposalResponse insureProposal(ProposalRequest request) {
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
InsureApiEnum.PROPOSAL.getUrl(),
getToken(),
JSON.toJSONString(request));
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ProposalResponse.class);
}
@Override
public IssueResponse insureDetail(String orderNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("OrderNum", orderNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.ISSUE.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), IssueResponse.class);
}
@Override
public void insureCancel(String orderNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("OrderNum", orderNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.CANCEL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
}
@Override
public void policyCancel(String policyNum) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("policyNum", policyNum)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(InsureApiEnum.POLICY_CANCEL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
}
/**
* 获取token
*
* @return token
*/
private String getToken() {
return authorize().getAccess_token();
}
@Override
public List<ProductsResponse> productList() {
ApiHttpResponse res = Api.v1(RequestMethodEnum.GET,
DomainEnum.TEST.getDomain(),
ProductApiEnum.PRODUCT_LIST.getUrl(),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseArray(res.getData(), ProductsResponse.class);
}
@Override
public ProductResponse productDetail(Integer productId) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("productId", productId)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.PRODUCT_DETAIL.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), ProductResponse.class);
}
@Override
public AnnexResponse annex(Integer productId, String annexTp) {
Map<String, Object> map = MapUtil.<String, Object>builder()
.put("productId", productId)
.put("annexTp", annexTp)
.build();
ApiHttpResponse res = Api.v1(RequestMethodEnum.POST,
DomainEnum.TEST.getDomain(),
StrUtil.format(ProductApiEnum.ANNEX.getUrl(), map),
getToken(),
null);
if (!Objects.equals(res.getResultTp(), Code.SUCCESS.getCode())) {
throw new WeishiException(res.getResultMsg());
}
return JSON.parseObject(res.getData(), AnnexResponse.class);
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论