From 836f6b0a77281c638fe05286112cbd68d25b970a Mon Sep 17 00:00:00 2001
From: dzc <2388224167@qq.com>
Date: Mon, 3 Mar 2025 16:21:05 +0800
Subject: [PATCH 1/2] =?UTF-8?q?feat:=E6=AD=A3=E5=85=83=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=AF=B9=E6=8E=A5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...loudAuthenticationFailureEventHandler.java | 188 +++++++++---------
.../common/core/constant/CacheConstants.java | 2 +
.../ZyForeignGetRegionIdByTokenDto.java | 3 -
.../dto/zy/mer/ZyMerSyncDealerInfoDto.java | 17 +-
.../dto/zy/self/ZySelfTokenDto.java | 37 ++++
.../thirdparty/vo/zy/ZyBaseEncryptVo.java | 17 ++
.../pjcloud/thirdparty/vo/zy/ZyBaseVo.java | 39 +++-
.../ZyForeignGetRegionIdByTokenVo.java | 4 +-
.../vo/zy/self/ZySelfCorrectVo.java | 39 ++++
.../vo/zy/self/ZySelfGetTokenVo.java | 6 +
.../thirdparty/vo/zy/self/ZySelfPayVo.java | 41 ++++
.../pjcloud-thirdparty-biz/pom.xml | 11 +
.../pjcloud/thirdparty/config/ZyConfig.java | 6 +
.../controller/zy/ZySelfController.java | 55 +++++
.../service/ZyDoForeignService.java | 8 +
.../service/impl/ZyForeignService.java | 2 +-
.../thirdparty/service/impl/ZyMerService.java | 4 +-
.../service/impl/ZySelfService.java | 29 +++
.../impl/zy/ZyDoForeignServiceImpl.java | 30 +++
.../service/impl/zy/ZyForeignServiceImpl.java | 23 ++-
.../service/impl/zy/ZyMerServiceImpl.java | 16 +-
.../service/impl/zy/ZySelfServiceImpl.java | 148 ++++++++++++++
.../thirdparty/utils/zy/api/ZyApiTool.java | 86 ++++++--
.../src/main/resources/application.yml | 15 +-
.../java/com/bsd/pjcloud/admin/ZyTest.java | 82 +++-----
25 files changed, 713 insertions(+), 195 deletions(-)
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/self/ZySelfTokenDto.java
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseEncryptVo.java
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ZySelfController.java
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ZyDoForeignService.java
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyDoForeignServiceImpl.java
diff --git a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/handler/PjcloudAuthenticationFailureEventHandler.java b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/handler/PjcloudAuthenticationFailureEventHandler.java
index 6afa4d62c..4ef8f487c 100644
--- a/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/handler/PjcloudAuthenticationFailureEventHandler.java
+++ b/pjcloud-auth/src/main/java/com/bsd/pjcloud/auth/support/handler/PjcloudAuthenticationFailureEventHandler.java
@@ -59,115 +59,117 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
public class PjcloudAuthenticationFailureEventHandler implements AuthenticationFailureHandler {
- private static final MappingJackson2HttpMessageConverter errorHttpResponseConverter = new MappingJackson2HttpMessageConverter();
+ private static final MappingJackson2HttpMessageConverter errorHttpResponseConverter = new MappingJackson2HttpMessageConverter();
- private final StringRedisTemplate redisTemplate;
+ private final StringRedisTemplate redisTemplate;
- private final ApplicationEventPublisher publisher;
+ private final ApplicationEventPublisher publisher;
- private final KeyStrResolver tenantKeyStrResolver;
+ private final KeyStrResolver tenantKeyStrResolver;
- private final RemoteUserService userService;
+ private final RemoteUserService userService;
- /**
- * Called when an authentication attempt fails.
- * @param request the request during which the authentication attempt occurred.
- * @param response the response.
- * @param exception the exception which was thrown to reject the authentication
- * request.
- */
- @Override
- @SneakyThrows
- public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
- AuthenticationException exception) {
- String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE);
- exception.printStackTrace();
- log.info("登录失败,异常:{}", exception.getLocalizedMessage());
+ /**
+ * Called when an authentication attempt fails.
+ *
+ * @param request the request during which the authentication attempt occurred.
+ * @param response the response.
+ * @param exception the exception which was thrown to reject the authentication
+ * request.
+ */
+ @Override
+ @SneakyThrows
+ public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException exception) {
+ String grantType = request.getParameter(OAuth2ParameterNames.GRANT_TYPE);
+ exception.printStackTrace();
+ log.info("登录失败,异常:|{}|stack:|{}|", exception.getLocalizedMessage(), exception.getStackTrace());
- // 密码模式记录错误信息
- if (OAuth2ParameterNames.PASSWORD.equals(grantType)) {
- String username = request.getParameter(OAuth2ParameterNames.USERNAME);
+ // 密码模式记录错误信息
+ if (OAuth2ParameterNames.PASSWORD.equals(grantType)) {
+ String username = request.getParameter(OAuth2ParameterNames.USERNAME);
- // 密码错误记录错误次数 (TOC用户不记录)
- String header = WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC);
- if (exception instanceof OAuth2AuthenticationException
- && !SecurityConstants.HEADER_TOC_YES.equals(header)) {
- recordLoginFailureTimes(username);
- }
+ // 密码错误记录错误次数 (TOC用户不记录)
+ String header = WebUtils.getRequest().getHeader(SecurityConstants.HEADER_TOC);
+ if (exception instanceof OAuth2AuthenticationException
+ && !SecurityConstants.HEADER_TOC_YES.equals(header)) {
+ recordLoginFailureTimes(username);
+ }
- // 记录登录失败错误信息
- sendFailureEventLog(request, exception, username);
- }
+ // 记录登录失败错误信息
+ sendFailureEventLog(request, exception, username);
+ }
- // 写出错误信息
- sendErrorResponse(request, response, exception);
- }
+ // 写出错误信息
+ sendErrorResponse(request, response, exception);
+ }
- /**
- * 记录失败日志
- * @param request HttpServletRequest
- * @param exception 错误日志
- * @param username 用户名
- */
- private void sendFailureEventLog(HttpServletRequest request, AuthenticationException exception, String username) {
- SysLogDTO logVo = SysLogUtils.getSysLog();
- logVo.setTitle("登录失败");
- logVo.setLogType(LogTypeEnum.ERROR.getType());
- logVo.setException(exception.getLocalizedMessage());
- // 发送异步日志事件
- String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME);
- if (StrUtil.isNotBlank(startTimeStr)) {
- Long startTime = Long.parseLong(startTimeStr);
- Long endTime = System.currentTimeMillis();
- logVo.setTime(endTime - startTime);
- }
- String header = request.getHeader(HttpHeaders.AUTHORIZATION);
- String clientId = WebUtils.extractClientId(header).orElse(null);
- logVo.setServiceId(clientId);
- logVo.setCreateBy(username);
- logVo.setTenantId(Long.parseLong(tenantKeyStrResolver.key()));
- publisher.publishEvent(new SysLogEvent(logVo));
- }
+ /**
+ * 记录失败日志
+ *
+ * @param request HttpServletRequest
+ * @param exception 错误日志
+ * @param username 用户名
+ */
+ private void sendFailureEventLog(HttpServletRequest request, AuthenticationException exception, String username) {
+ SysLogDTO logVo = SysLogUtils.getSysLog();
+ logVo.setTitle("登录失败");
+ logVo.setLogType(LogTypeEnum.ERROR.getType());
+ logVo.setException(exception.getLocalizedMessage());
+ // 发送异步日志事件
+ String startTimeStr = request.getHeader(CommonConstants.REQUEST_START_TIME);
+ if (StrUtil.isNotBlank(startTimeStr)) {
+ Long startTime = Long.parseLong(startTimeStr);
+ Long endTime = System.currentTimeMillis();
+ logVo.setTime(endTime - startTime);
+ }
+ String header = request.getHeader(HttpHeaders.AUTHORIZATION);
+ String clientId = WebUtils.extractClientId(header).orElse(null);
+ logVo.setServiceId(clientId);
+ logVo.setCreateBy(username);
+ logVo.setTenantId(Long.parseLong(tenantKeyStrResolver.key()));
+ publisher.publishEvent(new SysLogEvent(logVo));
+ }
- /**
- * 记录登录失败此处,如果操作阈值 调用接口锁定用户
- * @param username username
- */
- private void recordLoginFailureTimes(String username) {
- String key = String.format("%s:%s:%s", tenantKeyStrResolver.key(), CacheConstants.LOGIN_ERROR_TIMES, username);
- Long deltaTimes = ParamResolver.getLong("LOGIN_ERROR_TIMES", 5L);
- Long times = redisTemplate.opsForValue().increment(key);
+ /**
+ * 记录登录失败此处,如果操作阈值 调用接口锁定用户
+ *
+ * @param username username
+ */
+ private void recordLoginFailureTimes(String username) {
+ String key = String.format("%s:%s:%s", tenantKeyStrResolver.key(), CacheConstants.LOGIN_ERROR_TIMES, username);
+ Long deltaTimes = ParamResolver.getLong("LOGIN_ERROR_TIMES", 5L);
+ Long times = redisTemplate.opsForValue().increment(key);
- // 自动过期时间
- Long deltaTime = ParamResolver.getLong("DELTA_TIME", 1L);
- redisTemplate.expire(key, deltaTime, TimeUnit.HOURS);
+ // 自动过期时间
+ Long deltaTime = ParamResolver.getLong("DELTA_TIME", 1L);
+ redisTemplate.expire(key, deltaTime, TimeUnit.HOURS);
- if (deltaTimes <= times) {
- userService.lockUser(username);
- }
- }
+ if (deltaTimes <= times) {
+ userService.lockUser(username);
+ }
+ }
- private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response,
- AuthenticationException exception) throws IOException {
- ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response);
- httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED);
- String errorMessage;
+ private void sendErrorResponse(HttpServletRequest request, HttpServletResponse response,
+ AuthenticationException exception) throws IOException {
+ ServletServerHttpResponse httpResponse = new ServletServerHttpResponse(response);
+ httpResponse.setStatusCode(HttpStatus.UNAUTHORIZED);
+ String errorMessage;
- if (exception instanceof OAuth2AuthenticationException) {
- OAuth2AuthenticationException authorizationException = (OAuth2AuthenticationException) exception;
- errorMessage = StrUtil.isBlank(authorizationException.getError().getDescription())
- ? authorizationException.getError().getErrorCode()
- : authorizationException.getError().getDescription();
+ if (exception instanceof OAuth2AuthenticationException) {
+ OAuth2AuthenticationException authorizationException = (OAuth2AuthenticationException) exception;
+ errorMessage = StrUtil.isBlank(authorizationException.getError().getDescription())
+ ? authorizationException.getError().getErrorCode()
+ : authorizationException.getError().getDescription();
- this.errorHttpResponseConverter.write(
- R.failed(authorizationException.getError().getErrorCode(), errorMessage),
- MediaType.APPLICATION_JSON, httpResponse);
+ this.errorHttpResponseConverter.write(
+ R.failed(authorizationException.getError().getErrorCode(), errorMessage),
+ MediaType.APPLICATION_JSON, httpResponse);
- }
- else {
- errorMessage = exception.getLocalizedMessage();
- this.errorHttpResponseConverter.write(R.failed(errorMessage), MediaType.APPLICATION_JSON, httpResponse);
- }
- }
+ } else {
+ errorMessage = exception.getLocalizedMessage();
+ this.errorHttpResponseConverter.write(R.failed(errorMessage), MediaType.APPLICATION_JSON, httpResponse);
+ }
+ }
}
diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java
index 95ecb3d15..231c3263a 100644
--- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java
+++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/constant/CacheConstants.java
@@ -138,5 +138,7 @@ public interface CacheConstants {
String THIRDPARTY_ZY_MER_TOKEN = "thirdparty:zy:mer_token";
+ String THIRDPARTY_ZY_SELF_TOKEN = "thirdparty:zy:self_token:";
+
/* ************************************* end 第三方对接相关 end ************************************* */
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignGetRegionIdByTokenDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignGetRegionIdByTokenDto.java
index 2fb97b07c..f777e9113 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignGetRegionIdByTokenDto.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/foreign/ZyForeignGetRegionIdByTokenDto.java
@@ -8,9 +8,6 @@ import lombok.NoArgsConstructor;
/**
* 获取区域编码
*/
-//@Builder
-//@AllArgsConstructor
-//@NoArgsConstructor
@Data
public class ZyForeignGetRegionIdByTokenDto {
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncDealerInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncDealerInfoDto.java
index 5343dbe2c..a4e34156e 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncDealerInfoDto.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncDealerInfoDto.java
@@ -14,15 +14,17 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
@Data
public class ZyMerSyncDealerInfoDto {
+
+ /**
+ * 所属记账单位编号
+ */
+ private String EPID;
+
/**
* 商户所在系统的键值
*/
private String DealerKeyObj;
- /**
- * 商户名称
- */
- private String DealerName;
/**
* 商户是否有效0:禁用 1:有效
@@ -30,9 +32,10 @@ public class ZyMerSyncDealerInfoDto {
private Integer IsValid;
/**
- * 所属记账单位编号
+ * 商户名称
*/
- private String EPID;
+ private String DealerName;
+
/**
* 每次推送版本号,格式化为14位字符串,如果是数字不足14位的,前面补0。
@@ -42,5 +45,5 @@ public class ZyMerSyncDealerInfoDto {
/**
* 商户类型,0食堂餐厅,1超市,2普通商家,3其他;不传默认是食堂餐厅类型
*/
- private String DealerType;
+ private Integer DealerType;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/self/ZySelfTokenDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/self/ZySelfTokenDto.java
new file mode 100644
index 000000000..ef92153aa
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/self/ZySelfTokenDto.java
@@ -0,0 +1,37 @@
+package com.bsd.pjcloud.thirdparty.dto.zy.self;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ZySelfTokenDto {
+ /**
+ * 第三方app用户id
+ */
+ private String appid;
+
+ /**
+ * 第三方app用户密钥
+ */
+ private String appSecret;
+
+ /**
+ * 用户唯一标识
+ */
+ private String token;
+
+ /**
+ * 登录时间
+ */
+ private Long loginTime;
+
+ /**
+ * 过期时间
+ */
+ private Long expireTime;
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseEncryptVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseEncryptVo.java
new file mode 100644
index 000000000..4250bc0da
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseEncryptVo.java
@@ -0,0 +1,17 @@
+package com.bsd.pjcloud.thirdparty.vo.zy;
+
+import lombok.Data;
+
+@Data
+public class ZyBaseEncryptVo {
+ // 请求成功
+ public static String successCode = "0";
+
+ private String code;
+
+ private String data;
+
+ public boolean isSuccess() {
+ return successCode.equals(code);
+ }
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java
index 6b00ddec4..92b0eaef6 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/ZyBaseVo.java
@@ -1,14 +1,49 @@
package com.bsd.pjcloud.thirdparty.vo.zy;
import cn.hutool.core.util.ObjectUtil;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
@Data
public class ZyBaseVo {
-
+ // 请求成功
public static String successCode = "0";
- private Integer code;
+ // 系统繁忙,具体看错误消息msg
+ public static String errorCode = "-1";
+
+ // 应用服务错误
+ public static String serviceError = "10003";
+
+ // 无效卡,错误信息可查看msg
+ public static String invalidCard = "10004";
+
+ // 记账单位数据不存在,请先同步
+ public static String accountBookIsEmpty = "20001";
+
+ // 请同步最新数据
+ public static String syncNewData = "20002";
+
+ // 缺少签名参数
+ public static String signIsEmpty = "30001";
+
+ // 无效的appId
+ public static String appIdError = "40001";
+
+ // 无效的appSecret
+ public static String appSecretError = "40002";
+
+ // 数据加密认证失败!sign值验证失败
+ public static String signError = "40003";
+
+ // 无效的access_token
+ public static String accessTokenError = "40004";
+
+ public static String defaultErrorMsg = "服务异常,请重试或联系管理员";
+
+ private String code;
private String msg;
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/foreign/ZyForeignGetRegionIdByTokenVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/foreign/ZyForeignGetRegionIdByTokenVo.java
index 48ac20905..cb8f15212 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/foreign/ZyForeignGetRegionIdByTokenVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/foreign/ZyForeignGetRegionIdByTokenVo.java
@@ -12,7 +12,7 @@ public class ZyForeignGetRegionIdByTokenVo extends ZyBaseVo {
private VoData data;
@Data
- static class VoData {
+ public static class VoData {
/**
* 区域编码
*/
@@ -22,7 +22,7 @@ public class ZyForeignGetRegionIdByTokenVo extends ZyBaseVo {
*/
private String regionAllName;
/**
- * 地市简称
+ * 地市简称
*/
private String regionName;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfCorrectVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfCorrectVo.java
index 462a5d028..75877cb8d 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfCorrectVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfCorrectVo.java
@@ -1,13 +1,52 @@
package com.bsd.pjcloud.thirdparty.vo.zy.self;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseVo;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* 第三方一卡通系统提供冲正接口
*/
@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class ZySelfCorrectVo extends ZyBaseVo {
+ /**
+ * 帐号
+ */
+ private String accNum;
+ /**
+ * 用户姓名
+ */
+ private String accName;
+
+ /**
+ * 人员编号
+ */
+ private String perCode;
+
+ /**
+ * 订单流水号,全局唯一,第三方流水号
+ */
+ private String platformSerialNum;
+
+ /**
+ * 智慧园区通刷服务平台扣费流水号
+ */
+ private String serialNum;
+
+ /**
+ * 消费金额,格式是XX.XX元
+ */
+ private String amount;
+
+ /**
+ * 第三方一卡通系统返回正常扣费的时间点 统一为yyyy-MM-dd HH:mm:ss
+ */
+ private String recDate;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfGetTokenVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfGetTokenVo.java
index c0eb4310f..bfad755be 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfGetTokenVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfGetTokenVo.java
@@ -1,12 +1,18 @@
package com.bsd.pjcloud.thirdparty.vo.zy.self;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseVo;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* 第三方提供获取token
*/
@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class ZySelfGetTokenVo extends ZyBaseVo {
private String access_token;
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfPayVo.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfPayVo.java
index 6900edd3d..456d496af 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfPayVo.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/vo/zy/self/ZySelfPayVo.java
@@ -1,11 +1,52 @@
package com.bsd.pjcloud.thirdparty.vo.zy.self;
import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseVo;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* 第三方一卡通系统提供扣费接口
*/
@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
public class ZySelfPayVo extends ZyBaseVo {
+
+ /**
+ * 帐号
+ */
+ private String accNum;
+
+ /**
+ * 用户姓名
+ */
+ private String accName;
+
+ /**
+ * 人员编号
+ */
+ private String perCode;
+
+ /**
+ * 订单流水号,全局唯一,第三方流水号
+ */
+ private String platformSerialNum;
+
+ /**
+ * 智慧园区通刷服务平台扣费流水号
+ */
+ private String serialNum;
+
+ /**
+ * 消费金额,格式是XX.XX元
+ */
+ private String amount;
+
+ /**
+ * 第三方一卡通系统返回正常扣费的时间点 统一为yyyy-MM-dd HH:mm:ss
+ */
+ private String recDate;
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
index 478f3da97..66154ccd9 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
@@ -104,6 +104,17 @@
com.bsd
pjcloud-common-seata
+
+ commons-codec
+ commons-codec
+ 1.15
+
+
+
+ io.jsonwebtoken
+ jjwt
+ 0.9.1
+
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java
index 06c702cba..465cc3bef 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java
@@ -22,4 +22,10 @@ public class ZyConfig {
private String selfAppSecret;
+ private Long selfExpiresIn;
+
+ private String selfTokenKey;
+
+ private String selfTokenSecret;
+
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ZySelfController.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ZySelfController.java
new file mode 100644
index 000000000..47e457afd
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/zy/ZySelfController.java
@@ -0,0 +1,55 @@
+package com.bsd.pjcloud.thirdparty.controller.zy;
+
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto;
+import com.bsd.pjcloud.thirdparty.service.impl.ZySelfService;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfPayVo;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.security.SecurityRequirement;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.Map;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/third/zy")
+@Tag(description = "thirdPartyDept", name = "正元接口对接")
+@SecurityRequirement(name = HttpHeaders.AUTHORIZATION)
+public class ZySelfController {
+
+ private final ZySelfService zySelfService;
+
+ @GetMapping("/checkSystemStatus")
+ @Operation(summary = "第三方url健康探测", description = "第三方url健康探测")
+ public Map checkSystemStatus() {
+ return zySelfService.checkSystemStatus();
+ }
+
+ @GetMapping("/getToken")
+ @Operation(summary = "第三方提供获取token", description = "第三方提供获取token")
+ public ZySelfGetTokenVo getToken(ZySelfGetTokenDto params) {
+ return zySelfService.getToken(params);
+ }
+
+
+ @PostMapping("/correct")
+ @Operation(summary = "第三方一卡通系统提供冲正接口", description = "第三方一卡通系统提供冲正接口")
+ public ZySelfCorrectVo correct(@RequestBody ZySelfCorrectDto params, @RequestParam(value = "access_token", required = false) String accessToken) {
+ return zySelfService.correct(params, accessToken);
+ }
+
+ @PostMapping("/getToken")
+ @Operation(summary = "第三方一卡通系统提供扣费接口", description = "第三方一卡通系统提供扣费接口")
+ public ZySelfPayVo pay(@RequestBody ZySelfPayDto params, @RequestParam(value = "access_token", required = false) String accessToken) {
+ return zySelfService.pay(params, accessToken);
+ }
+
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ZyDoForeignService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ZyDoForeignService.java
new file mode 100644
index 000000000..2a98a9509
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ZyDoForeignService.java
@@ -0,0 +1,8 @@
+package com.bsd.pjcloud.thirdparty.service;
+
+public interface ZyDoForeignService {
+
+ // 本地一卡通交易数据同步
+ void syncNativeCardTradeInfo();
+
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyForeignService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyForeignService.java
index 88644de6a..bea06710e 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyForeignService.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyForeignService.java
@@ -15,6 +15,6 @@ public interface ZyForeignService {
/**
* 获取区域编码
*/
- ZyForeignGetRegionIdByTokenVo getRegionIdByToken(ZyForeignGetRegionIdByTokenDto dto);
+ ZyForeignGetRegionIdByTokenVo.VoData getRegionIdByToken();
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyMerService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyMerService.java
index 44f2111f1..dc4cba674 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyMerService.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZyMerService.java
@@ -6,12 +6,14 @@ import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto;
import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto;
import com.bsd.pjcloud.thirdparty.vo.zy.mer.*;
+import java.util.List;
+
public interface ZyMerService {
/**
* 商户信息同步
*/
- ZyMerSyncDealerInfoVo syncDealerInfoApi(ZyMerSyncDealerInfoDto dto);
+ ZyMerSyncDealerInfoVo syncDealerInfoApi(List dto);
/**
* 记账单位同步
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZySelfService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZySelfService.java
index 013f5c6b7..036ada6e9 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZySelfService.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/ZySelfService.java
@@ -1,4 +1,33 @@
package com.bsd.pjcloud.thirdparty.service.impl;
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfCorrectDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfGetTokenDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.self.ZySelfPayDto;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfCorrectVo;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfGetTokenVo;
+import com.bsd.pjcloud.thirdparty.vo.zy.self.ZySelfPayVo;
+
+import java.util.Map;
+
public interface ZySelfService {
+
+ /**
+ * 第三方url健康探测
+ */
+ Map checkSystemStatus();
+
+ /**
+ * 第三方提供获取token
+ */
+ ZySelfGetTokenVo getToken(ZySelfGetTokenDto params);
+
+ /**
+ * 第三方一卡通系统提供冲正接口
+ */
+ ZySelfCorrectVo correct(ZySelfCorrectDto params, String accessToken);
+
+ /**
+ * 第三方一卡通系统提供扣费接口
+ */
+ ZySelfPayVo pay(ZySelfPayDto params, String accessToken);
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyDoForeignServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyDoForeignServiceImpl.java
new file mode 100644
index 000000000..3a7c909c0
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyDoForeignServiceImpl.java
@@ -0,0 +1,30 @@
+package com.bsd.pjcloud.thirdparty.service.impl.zy;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInfoDto;
+import com.bsd.pjcloud.thirdparty.service.ZyDoForeignService;
+import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+@Service
+@Validated
+@Slf4j
+@RequiredArgsConstructor
+public class ZyDoForeignServiceImpl implements ZyDoForeignService {
+
+ private final ZyForeignServiceImpl zyForeignServiceImpl;
+
+ @Override
+ public void syncNativeCardTradeInfo() {
+ ZyForeignGetRegionIdByTokenVo.VoData region = zyForeignServiceImpl.getRegionIdByToken();
+ if (ObjectUtil.isEmpty(region)) {
+ return;
+ }
+ ZyForeignSyncNativeCardTradeInfoDto asyncDto = new ZyForeignSyncNativeCardTradeInfoDto();
+ asyncDto.setRegionCode(region.getRegionCode());
+ zyForeignServiceImpl.syncNativeCardTradeInfoApi(asyncDto);
+ }
+}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyForeignServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyForeignServiceImpl.java
index 70eb8eef5..e8775f4b3 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyForeignServiceImpl.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyForeignServiceImpl.java
@@ -1,5 +1,6 @@
package com.bsd.pjcloud.thirdparty.service.impl.zy;
+import cn.hutool.core.codec.Base64;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
@@ -9,6 +10,7 @@ import com.bsd.pjcloud.thirdparty.dto.zy.foreign.ZyForeignSyncNativeCardTradeInf
import com.bsd.pjcloud.thirdparty.service.impl.ZyForeignService;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApiTool;
+import com.bsd.pjcloud.thirdparty.vo.zy.ZyBaseEncryptVo;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignGetRegionIdByTokenVo;
import com.bsd.pjcloud.thirdparty.vo.zy.foreign.ZyForeignSyncNativeCardTradeInfoVo;
import lombok.RequiredArgsConstructor;
@@ -64,24 +66,23 @@ public class ZyForeignServiceImpl implements ZyForeignService {
* 获取区域编码
*/
@Override
- public ZyForeignGetRegionIdByTokenVo getRegionIdByToken(ZyForeignGetRegionIdByTokenDto dto) {
+ public ZyForeignGetRegionIdByTokenVo.VoData getRegionIdByToken() {
String url = zyConfig.getBaseUrl() + ZyApi.Foreign.GET_REGION_ID_BY_TOKEN;
try {
url = String.format(url, zyApiTool.getToken());
- Map encryptionBody = new HashMap<>();
- encryptionBody.put("accClasses", dto);
- String body = zyApiTool.getEncryptionDto(encryptionBody);
- String res = HttpRequest.post(url)
- .body(body)
- .execute()
- .body();
+ String res = HttpRequest.get(url).execute().body();
if (ObjectUtil.isEmpty(res)) {
throw new RuntimeException("response is empty");
}
- ZyForeignGetRegionIdByTokenVo vo = JSONUtil.toBean(res, ZyForeignGetRegionIdByTokenVo.class);
- if (!vo.isSuccess()) {
- throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, url, body));
+ ZyBaseEncryptVo baseEncryptVo = JSONUtil.toBean(res, ZyBaseEncryptVo.class);
+ if (ObjectUtil.isEmpty(baseEncryptVo)) {
+ throw new RuntimeException(String.format("解密错误res|%s|url|%s|res|%s|", res, url, baseEncryptVo));
}
+ if (!baseEncryptVo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|", res, url));
+ }
+ String json = Base64.decodeStr(baseEncryptVo.getData());
+ ZyForeignGetRegionIdByTokenVo.VoData vo = JSONUtil.toBean(json, ZyForeignGetRegionIdByTokenVo.VoData.class);
return vo;
} catch (Exception e) {
log.error("|{}||getRegionIdByToken|意外的错误error|{}|", TAG, e.getMessage());
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyMerServiceImpl.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyMerServiceImpl.java
index eb40c5867..6b84d1524 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyMerServiceImpl.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/impl/zy/ZyMerServiceImpl.java
@@ -1,5 +1,6 @@
package com.bsd.pjcloud.thirdparty.service.impl.zy;
+import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.json.JSONUtil;
@@ -17,7 +18,9 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
@Service
@@ -36,14 +39,23 @@ public class ZyMerServiceImpl implements ZyMerService {
* 商户信息同步
*/
@Override
- public ZyMerSyncDealerInfoVo syncDealerInfoApi(ZyMerSyncDealerInfoDto dto) {
+ public ZyMerSyncDealerInfoVo syncDealerInfoApi(List dto) {
+ if (ObjectUtil.isEmpty(dto)) {
+ return null;
+ }
+ List