From cd99c104c328fd3b29a8afd84a54304a61d5521f Mon Sep 17 00:00:00 2001
From: dzc <2388224167@qq.com>
Date: Fri, 28 Feb 2025 20:09:49 +0800
Subject: [PATCH] =?UTF-8?q?feat:=E6=AD=A3=E5=85=83=E5=95=86=E6=88=B7?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../common/core/constant/CacheConstants.java | 6 +
.../pjcloud-thirdparty-api/pom.xml | 2 +-
.../dto/zy/mer/ZyMerSyncDealerInfoDto.java | 8 +-
.../zy/mer/ZyMerSyncEnterpriseInfoDto.java | 6 +
.../pjcloud/thirdparty/vo/zy/ZyBaseVo.java | 7 +
.../pjcloud-thirdparty-biz/pom.xml | 15 +-
.../pjcloud/thirdparty/config/ZyConfig.java | 19 ++
.../thirdparty/service/impl/ZyMerService.java | 32 +++
.../service/impl/zy/ZyMerServiceImpl.java | 200 ++++++++++++++++++
.../thirdparty/utils/zy/api/ZyApi.java | 38 ++--
.../src/main/resources/application.yml | 15 +-
.../java/com/bsd/pjcloud/admin/ZyTest.java | 148 +++++++++++++
12 files changed, 461 insertions(+), 35 deletions(-)
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java
create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java
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 3bb34fe97..95ecb3d15 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
@@ -133,4 +133,10 @@ public interface CacheConstants {
String WALLET_SETTING_DETAIL = "wallet:detail:setting";
/* ************************************* end 钱包相关 end ************************************* */
+
+ /* ************************************* start 第三方对接相关 start ************************************* */
+
+ String THIRDPARTY_ZY_MER_TOKEN = "thirdparty:zy:mer_token";
+
+ /* ************************************* end 第三方对接相关 end ************************************* */
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml
index 93f903039..e1fa6f100 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/pom.xml
@@ -42,5 +42,5 @@
com.bsd
pjcloud-common-excel
-
+
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 af90c697e..5343dbe2c 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
@@ -1,11 +1,17 @@
package com.bsd.pjcloud.thirdparty.dto.zy.mer;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* 商户信息同步
*/
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
@Data
public class ZyMerSyncDealerInfoDto {
/**
@@ -21,7 +27,7 @@ public class ZyMerSyncDealerInfoDto {
/**
* 商户是否有效0:禁用 1:有效
*/
- private String IsValid;
+ private Integer IsValid;
/**
* 所属记账单位编号
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncEnterpriseInfoDto.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncEnterpriseInfoDto.java
index 8b3a76b7b..5898e0e92 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncEnterpriseInfoDto.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/zy/mer/ZyMerSyncEnterpriseInfoDto.java
@@ -1,10 +1,16 @@
package com.bsd.pjcloud.thirdparty.dto.zy.mer;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
/**
* 记账单位同步
*/
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
@Data
public class ZyMerSyncEnterpriseInfoDto {
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 4017d5b49..6b00ddec4 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,12 +1,19 @@
package com.bsd.pjcloud.thirdparty.vo.zy;
+import cn.hutool.core.util.ObjectUtil;
import lombok.Data;
@Data
public class ZyBaseVo {
+ public static String successCode = "0";
+
private Integer code;
private String msg;
+ public boolean isSuccess() {
+ return ObjectUtil.equal(code, ZyBaseVo.successCode);
+ }
+
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
index 6ae45b447..478f3da97 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml
@@ -76,13 +76,13 @@
com.baomidou
- mybatis-plus-spring-boot3-starter
-
+ mybatis-plus-spring-boot3-starter
+
com.alibaba
- druid-spring-boot-3-starter
-
+ druid-spring-boot-3-starter
+
com.mysql
@@ -97,8 +97,9 @@
org.springframework.boot
spring-boot-starter-test
+ test
-
+
com.bsd
pjcloud-common-seata
@@ -115,7 +116,7 @@
org.springframework.boot
spring-boot-maven-plugin
-
+
repackage
@@ -125,7 +126,7 @@
-
+
io.fabric8
docker-maven-plugin
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
new file mode 100644
index 000000000..f7e1a9805
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZyConfig.java
@@ -0,0 +1,19 @@
+package com.bsd.pjcloud.thirdparty.config;
+
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+@Component
+@ConfigurationProperties(prefix = "zy")
+@Data
+public class ZyConfig {
+
+ private String baseUrl;
+
+ private String appId;
+
+ private String appSecret;
+
+}
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 8b37c36fc..a4f58c4a9 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
@@ -1,4 +1,36 @@
package com.bsd.pjcloud.thirdparty.service.impl;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
+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.*;
+
public interface ZyMerService {
+
+ /**
+ * 获取token
+ */
+ ZyMerGetTokenVo getTokenApi();
+
+ /**
+ * 商户信息同步
+ */
+ ZyMerSyncDealerInfoVo syncDealerInfoApi(ZyMerSyncDealerInfoDto dto);
+
+ /**
+ * 记账单位同步
+ */
+ ZyMerSyncEnterpriseInfoVo syncEnterpriseInfoApi(ZyMerSyncEnterpriseInfoDto dto);
+
+ /**
+ * 账户信息同步
+ */
+ ZyMerSyncAccountInfoVo syncAccountInfoApi(ZyMerSyncAccountInfoDto dto);
+
+ /**
+ * 身份信息同步
+ */
+ ZyMerSyncAccClassInfoVo syncAccClassInfo(ZyMerSyncAccClassInfoDto dto);
+
}
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 05b2d6271..5e80c2875 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,14 +1,214 @@
package com.bsd.pjcloud.thirdparty.service.impl.zy;
+import cn.hutool.core.lang.Pair;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.json.JSONUtil;
+import com.bsd.pjcloud.common.core.constant.CacheConstants;
+import com.bsd.pjcloud.thirdparty.config.ZyConfig;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto;
import com.bsd.pjcloud.thirdparty.service.impl.ZyMerService;
+import com.bsd.pjcloud.thirdparty.utils.zy.api.ZyApi;
+import com.bsd.pjcloud.thirdparty.vo.zy.mer.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.commons.codec.digest.DigestUtils.md5Hex;
+
@Service
@Validated
@Slf4j
@RequiredArgsConstructor
public class ZyMerServiceImpl implements ZyMerService {
+
+ private final String TAG = "ZyMerServiceImpl";
+
+ private final ZyConfig zyConfig;
+
+ private final StringRedisTemplate redisTemplate;
+
+ /**
+ * 获取token
+ *
+ * @return
+ */
+ @Override
+ public ZyMerGetTokenVo getTokenApi() {
+ String url = zyConfig.getBaseUrl() + ZyApi.Mer.GET_TOKEN;
+ url = String.format(url, zyConfig.getAppId(), zyConfig.getAppSecret());
+ try {
+ String res = HttpRequest.get(url)
+ .contentType("application/x-www-form-urlencoded")
+ .execute()
+ .body();
+ if (ObjectUtil.isEmpty(res)) {
+ throw new RuntimeException("response is empty");
+ }
+ ZyMerGetTokenVo vo = JSONUtil.toBean(res, ZyMerGetTokenVo.class);
+ if (!vo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|", res, url));
+ }
+ return vo;
+ } catch (Exception e) {
+ log.error("|{}||getTokenApi|意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * 商户信息同步
+ */
+ @Override
+ public ZyMerSyncDealerInfoVo syncDealerInfoApi(ZyMerSyncDealerInfoDto dto) {
+ String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_DEALER_INFO;
+ try {
+ url = String.format(url, getToken());
+ Map encryptionBody = new HashMap<>();
+ encryptionBody.put("dealers", dto);
+ String body = getEncryptionDto(encryptionBody);
+ String res = HttpRequest.post(url)
+ .body(body)
+ .execute()
+ .body();
+ if (ObjectUtil.isEmpty(res)) {
+ throw new RuntimeException("response is empty");
+ }
+ ZyMerSyncDealerInfoVo vo = JSONUtil.toBean(res, ZyMerSyncDealerInfoVo.class);
+ if (!vo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, url, body));
+ }
+ return vo;
+ } catch (Exception e) {
+ log.error("|{}||syncDealerInfo|意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * 记账单位同步
+ */
+ @Override
+ public ZyMerSyncEnterpriseInfoVo syncEnterpriseInfoApi(ZyMerSyncEnterpriseInfoDto dto) {
+ String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ENTERPRISE_INFO;
+ try {
+ url = String.format(url, getToken());
+ Map encryptionBody = new HashMap<>();
+ encryptionBody.put("enterprises", dto);
+ String body = getEncryptionDto(encryptionBody);
+ String res = HttpRequest.post(url)
+ .body(body)
+ .execute()
+ .body();
+ if (ObjectUtil.isEmpty(res)) {
+ throw new RuntimeException("response is empty");
+ }
+ ZyMerSyncEnterpriseInfoVo vo = JSONUtil.toBean(res, ZyMerSyncEnterpriseInfoVo.class);
+ if (!vo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, url, body));
+ }
+ return vo;
+ } catch (Exception e) {
+ log.error("|{}||syncEnterpriseInfo|意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * 账户信息同步
+ */
+ @Override
+ public ZyMerSyncAccountInfoVo syncAccountInfoApi(ZyMerSyncAccountInfoDto dto) {
+ String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ACCOUNT_INFO;
+ try {
+ url = String.format(url, getToken());
+ Map encryptionBody = new HashMap<>();
+ encryptionBody.put("accounts", dto);
+ String body = getEncryptionDto(encryptionBody);
+ String res = HttpRequest.post(url)
+ .body(body)
+ .execute()
+ .body();
+ if (ObjectUtil.isEmpty(res)) {
+ throw new RuntimeException("response is empty");
+ }
+ ZyMerSyncAccountInfoVo vo = JSONUtil.toBean(res, ZyMerSyncAccountInfoVo.class);
+ if (!vo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, url, body));
+ }
+ return vo;
+ } catch (Exception e) {
+ log.error("|{}||syncAccountInfo|意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ /**
+ * 身份信息同步
+ */
+ @Override
+ public ZyMerSyncAccClassInfoVo syncAccClassInfo(ZyMerSyncAccClassInfoDto dto) {
+ String url = zyConfig.getBaseUrl() + ZyApi.Mer.SYNC_ACC_CLASS_INFO;
+ try {
+ url = String.format(url, getToken());
+ Map encryptionBody = new HashMap<>();
+ encryptionBody.put("accClasses", dto);
+ String body = getEncryptionDto(encryptionBody);
+ String res = HttpRequest.post(url)
+ .body(body)
+ .execute()
+ .body();
+ if (ObjectUtil.isEmpty(res)) {
+ throw new RuntimeException("response is empty");
+ }
+ ZyMerSyncAccClassInfoVo vo = JSONUtil.toBean(res, ZyMerSyncAccClassInfoVo.class);
+ if (!vo.isSuccess()) {
+ throw new RuntimeException(String.format("请求错误res|%s|url|%s|body|%s|", res, url, body));
+ }
+ return vo;
+ }catch (Exception e){
+ log.error("|{}||syncAccClassInfo|意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ private String getToken() {
+ try {
+ String redisKey = CacheConstants.THIRDPARTY_ZY_MER_TOKEN;
+ String token = redisTemplate.opsForValue().get(redisKey);
+ if (ObjectUtil.isEmpty(token)) {
+ ZyMerGetTokenVo vo = getTokenApi();
+ if (ObjectUtil.isNotEmpty(vo)) {
+ String accessToken = vo.getAccess_token();
+ redisTemplate.opsForValue().set(redisKey, accessToken);
+ return accessToken;
+ }
+ }
+ return token;
+ } catch (Exception e) {
+ log.error("|{}|token获取错误无法进行,意外的错误error", e.getMessage());
+ }
+ return null;
+ }
+
+ private String getEncryptionDto(T params) {
+ String json = JSONUtil.toJsonStr(params);
+ String encodedData = Base64.getEncoder().encodeToString(json.getBytes(StandardCharsets.UTF_8));
+ String stringToSign = String.format("data=%s&key=%s", json, zyConfig.getAppId());
+ String sign = md5Hex(stringToSign);
+ Map body = new HashMap<>();
+ body.put("data", encodedData);
+ body.put("sign", sign);
+ return JSONUtil.toJsonStr(body);
+ }
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApi.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApi.java
index 24d42f464..c37f9e508 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApi.java
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/utils/zy/api/ZyApi.java
@@ -5,48 +5,50 @@ import lombok.experimental.UtilityClass;
@UtilityClass
public class ZyApi {
+
+
// 商户信息同步
- class Mer {
+ public static class Mer {
// 获取token
- static final String GET_TOKEN = "/getToken?appId={appid}&appSecret={appsecret}";
+ public static final String GET_TOKEN = "/api/getToken?appId=%s&appSecret=%s";
// 商户信息同步
- static final String SYNC_DEALER_INFO = "/syncDealerInfo?access_token={access_token}";
+ public static final String SYNC_DEALER_INFO = "/api/syncDealerInfo?access_token=%s";
// 记账单位同步
- static final String SYNC_ENTERPRISE_INFO = "/syncEnterpriseInfo?access_token={access_token}";
+ public static final String SYNC_ENTERPRISE_INFO = "/api/syncEnterpriseInfo?access_token=%s";
// 账户信息同步
- static final String SYNC_ACCOUNT_INFO = "/syncAccountInfo?access_token={access_token}";
+ public static final String SYNC_ACCOUNT_INFO = "/api/syncAccountInfo?access_token=%s";
// 身份信息同步
- static final String SYNC_ACC_CLASS_INFO = "/syncAccClassInfo?access_token={access_token}";
+ public static final String SYNC_ACC_CLASS_INFO = "/api/syncAccClassInfo?access_token=%s";
}
// 统一身份验证功能
- class Stride {
+ public class Stride {
// 统一身份验证功能
- static final String AUTHENTICATION = "/authentication?access_token={access_token}";
+ public static final String AUTHENTICATION = "/authentication?access_token={access_token}";
// 智慧园区通刷平台提供消费接口
- static final String CONSUMPTION = "/consumption?access_token={access_token}";
+ public static final String CONSUMPTION = "/consumption?access_token={access_token}";
// 智慧园区通刷平台提供冲正接口
- static final String CORRECT = "/correct?access_token={access_token}";
+ public static final String CORRECT = "/correct?access_token={access_token}";
}
// 本地一卡通交易数据同步
- class Foreign {
+ public static class Foreign {
// 本地一卡通交易数据同步
- static final String SYNC_NATIVE_CARD_TRADE_INFO = "/getToken/syncNativeCardTradeInfo?access_token={access_token}";
+ public static final String SYNC_NATIVE_CARD_TRADE_INFO = "/getToken/syncNativeCardTradeInfo?access_token={access_token}";
// 获取区域编码
- static final String GET_REGION_ID_BY_TOKEN = "/getRegionIdByToken?access_token={access_token}";
+ public static final String GET_REGION_ID_BY_TOKEN = "/getRegionIdByToken?access_token={access_token}";
}
// 第三方需提供的接口
- class Self {
+ public static class Self {
// 第三方url健康探测
- static final String CHECK_SYSTEM_STATUS = "/checkSystemStatus";
+ public static final String CHECK_SYSTEM_STATUS = "/checkSystemStatus";
// 第三方一卡通系统提供冲正接口
- static final String CORRECT = "/correct?access_token={access_token}";
+ public static final String CORRECT = "/correct?access_token={access_token}";
// 第三方一卡通系统提供扣费接口
- static final String PAY = "/pay?access_token={access_token}";
+ public static final String PAY = "/pay?access_token={access_token}";
// 第三方提供获取token
- static final String GET_TOKEN = "/getToken?appId={appid}&appSecret={appsecret}_1730169197889";
+ public static final String GET_TOKEN = "/getToken?appId={appid}&appSecret={appsecret}_1730169197889";
}
}
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
index d2ed93d4c..041447b11 100644
--- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml
@@ -40,11 +40,10 @@ oauth2:
shjn_token_url: /prod-api/login/shpj
# 浙证钉和诗画公用的获取用户信息接口
zzd_sh_user_info_url: /prod-api/oauth2/apis/sso/v1/fetch_user_by_uabase_token
-# datasource:
-# type: com.alibaba.druid.pool.DruidDataSource
-# druid:
-# driver-class-name: com.mysql.cj.jdbc.Driver
-# username: root
-# password: root
-# # url: jdbc:mysql://pjcloud-mysql:3306/pjcloudx_thirdparty?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true
-# url: jdbc:mysql://${MYSQL_HOST:pjcloud-mysql}:${MYSQL_PORT:3306}/${MYSQL_DB:pjcloudx_thirdparty}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&allowMultiQueries=true
\ No newline at end of file
+
+# 正元智慧
+# https://gwyc.zj.gov.cn/API/%E7%9C%81%E5%B9%B3%E5%8F%B0API%E5%AF%B9%E6%8E%A5%E6%8E%A5%E5%8F%A3.html
+zy:
+ base-url: http://60.191.37.212:18079
+ app-id: 03D9608D1735D424F984733BA71321C6
+ app-secret: 65497A86DB1401B252FEA6DE0A080766
\ No newline at end of file
diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java
new file mode 100644
index 000000000..79b9d3fc8
--- /dev/null
+++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/test/java/com/bsd/pjcloud/admin/ZyTest.java
@@ -0,0 +1,148 @@
+package com.bsd.pjcloud.admin;
+
+import cn.hutool.json.JSONUtil;
+import com.bsd.pjcloud.thirdparty.ThirdPartyApp;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccClassInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncAccountInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncDealerInfoDto;
+import com.bsd.pjcloud.thirdparty.dto.zy.mer.ZyMerSyncEnterpriseInfoDto;
+import com.bsd.pjcloud.thirdparty.service.impl.ZyMerService;
+import com.bsd.pjcloud.thirdparty.vo.zy.mer.*;
+import jakarta.annotation.Resource;
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+import java.security.MessageDigest;
+import java.util.Base64;
+import java.util.HashMap;
+import java.util.Map;
+
+@SpringBootTest(classes = ThirdPartyApp.class)
+public class ZyTest {
+
+ @Resource
+ private ZyMerService zyMerService;
+
+ /************************** start mer start **************************/
+
+ /**
+ * 获取token
+ */
+ @Test
+ public void merGetTokenApi() {
+ ZyMerGetTokenVo vo = zyMerService.getTokenApi();
+ System.out.println(1);
+ }
+
+ /**
+ * 商户信息同步
+ */
+ @Test
+ public void merSyncDealerInfo() {
+ ZyMerSyncDealerInfoDto dto = ZyMerSyncDealerInfoDto
+ .builder()
+ .DealerKeyObj("123")
+ .DealerName("食堂")
+ .IsValid(1)
+ .EPID("1")
+ .FixId("20190920100101")
+ .build();
+ ZyMerSyncDealerInfoVo vo = zyMerService.syncDealerInfoApi(dto);
+ System.out.println(vo);
+ }
+
+ /**
+ * 记账单位同步
+ */
+ @Test
+ public void merSyncEnterpriseInfo(){
+ ZyMerSyncEnterpriseInfoDto dto = new ZyMerSyncEnterpriseInfoDto();
+ ZyMerSyncEnterpriseInfoVo vo = zyMerService.syncEnterpriseInfoApi(dto);
+ System.out.println(vo);
+ }
+
+ /**
+ * 账户信息同步
+ */
+ @Test
+ public void merSyncAccountInfoApi(){
+ ZyMerSyncAccountInfoDto dto = new ZyMerSyncAccountInfoDto();
+ ZyMerSyncAccountInfoVo vo = zyMerService.syncAccountInfoApi(dto);
+ System.out.println(vo);
+ }
+
+ /**
+ * 身份信息同步
+ */
+ @Test
+ public void merSyncAccClassInfo(){
+ ZyMerSyncAccClassInfoDto dto = new ZyMerSyncAccClassInfoDto();
+ ZyMerSyncAccClassInfoVo vo = zyMerService.syncAccClassInfo(dto);
+ System.out.println(vo);
+ }
+
+ /************************** end mer end **************************/
+
+
+ /************************** start mer start **************************/
+
+
+
+ /************************** end mer end **************************/
+
+
+ @Test
+ public void encryption() {
+ try {
+
+ // 1. 构建业务数据
+ Map dealer = new HashMap<>();
+ dealer.put("EPID", "1");
+ dealer.put("DealerKeyObj", "123");
+ dealer.put("IsValid", 1);
+ dealer.put("DealerName", "食堂");
+ dealer.put("FixId", "20190920100101");
+
+ Map data = new HashMap<>();
+ data.put("dealers", new Object[]{dealer});
+
+ // 2. 生成 data 参数(Base64 编码)
+ String jsonData = JSONUtil.toJsonStr(data);
+ String base64Data = Base64.getEncoder().encodeToString(jsonData.getBytes("UTF-8"));
+
+ // 3. 生成签名
+ String signStr = String.format("data=%s&key=%s", jsonData, "03D9608D1735D424F984733BA71321C6");
+ String sign = md5(signStr).toUpperCase();
+
+ // 4. 构建请求参数
+ Map params = new HashMap<>();
+ params.put("data", base64Data);
+ params.put("sign", sign);
+ System.out.println(params);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ // MD5 加密方法
+ private static String md5(String input) {
+ try {
+ MessageDigest md = MessageDigest.getInstance("MD5");
+ byte[] messageDigest = md.digest(input.getBytes());
+ StringBuilder hexString = new StringBuilder();
+
+ for (byte b : messageDigest) {
+ String hex = Integer.toHexString(0xFF & b);
+ if (hex.length() == 1) {
+ hexString.append('0');
+ }
+ hexString.append(hex);
+ }
+
+ return hexString.toString();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+}