From 61460ce32f7e24c416f31c95340078609a6c7c46 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Thu, 7 May 2026 22:05:18 +0800 Subject: [PATCH 01/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud/thirdparty/dto/UrlTokenDTO.java | 7 + .../thirdparty/config/OAuth2ClientConfig.java | 5 + .../config/ZzdOpenPlatformProperties.java | 38 ++++ .../controller/ThirdPartyOAth2Cotroller.java | 9 +- .../service/ThirdPartyOAuth2Service.java | 196 +++++++++++++++++- .../src/main/resources/application.yml | 12 ++ 6 files changed, 259 insertions(+), 8 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java index 7e2c48744..eae2c2cc4 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java @@ -5,5 +5,12 @@ import lombok.Data; @Data public class UrlTokenDTO { + /** + * 旧数字政务/第三方网关下发的 uabaseToken(逐步淘汰) + */ private String token; + /** + * 浙政钉 H5 官方 dd.getAuthCode 返回的临时码 + */ + private String authCode; } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java index d2e381b8e..51dbd6290 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java @@ -38,5 +38,10 @@ public class OAuth2ClientConfig { */ private String zzdShUserInfoUrl; + /** + * 浙政钉官方 H5 authCode 换取用户信息(GET ?authCode=),响应体需与 {@code ApiResponse} 一致 + */ + private String zzdAuthCodeUserInfoUrl; + } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java new file mode 100644 index 000000000..459b0901f --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java @@ -0,0 +1,38 @@ +package com.bsd.pjcloud.thirdparty.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; +import org.springframework.util.StringUtils; + +/** + * 浙政钉开放平台(正式:openplatform-pro.ding.zj.gov.cn)企业内应用免登。 + * app-key / app-secret 请放在 Nacos 或环境变量,勿提交仓库。 + */ +@Data +@Component +@ConfigurationProperties(prefix = "zzd.open") +public class ZzdOpenPlatformProperties { + + /** + * 为 false 时不走开放平台直连,仍使用 oauth2.client.zzd-auth-code-user-info-url 等旧网关配置 + */ + private boolean enabled = true; + + private String protocol = "https"; + + private String domain = "openplatform-pro.ding.zj.gov.cn"; + + /** + * 租户 ID(与管理工作台源码中 realmId、前端 corpId 一致,用于核对日志) + */ + private String tenantId = "196729"; + + private String appKey = ""; + + private String appSecret = ""; + + public boolean isAppCredentialConfigured() { + return StringUtils.hasText(appKey) && StringUtils.hasText(appSecret); + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index 193d6a0ba..7f3879d33 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -91,9 +91,10 @@ public class ThirdPartyOAth2Cotroller { @GlobalTransactional @Transactional(rollbackFor = Exception.class) public R zzdsso(@RequestBody UrlTokenDTO urlTokenDTO) { + String authCode = urlTokenDTO.getAuthCode(); String token = urlTokenDTO.getToken(); - if (StringUtils.isBlank(token)){ - return R.failed("token不能为空"); + if (StringUtils.isBlank(authCode) && StringUtils.isBlank(token)) { + return R.failed("token与authCode不能均为空"); } //获取数字政务token通过浙政钉前端获取的token,调试阶段先写死 @@ -123,7 +124,9 @@ public class ThirdPartyOAth2Cotroller { // throw new RuntimeException(e); // } //暂时先注释,模拟一下就行 - ZZDUserDTO zzdUserDTO = thirdPartyOAuth2Service.zzdsso(token); + ZZDUserDTO zzdUserDTO = StringUtils.isNotBlank(authCode) + ? thirdPartyOAuth2Service.zzdssoByAuthCode(authCode) + : thirdPartyOAuth2Service.zzdsso(token); ZZDUserDTO.Ext ext = zzdUserDTO.getExt(); String employeeCode = ext.getEmployeeCode(); String mobile = zzdUserDTO.getMobile(); diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java index 2930afad8..7e40f6d55 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java @@ -3,7 +3,9 @@ package com.bsd.pjcloud.thirdparty.service; import com.alibaba.fastjson.JSON; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.common.core.util.R; +import com.alibaba.fastjson.JSONObject; import com.bsd.pjcloud.thirdparty.config.OAuth2ClientConfig; +import com.bsd.pjcloud.thirdparty.config.ZzdOpenPlatformProperties; import com.bsd.pjcloud.thirdparty.constant.UserTypeEnum; import com.bsd.pjcloud.thirdparty.dto.*; import com.bsd.pjcloud.thirdparty.entity.ThirdPartyDeptEntity; @@ -27,6 +29,7 @@ import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; +import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -40,6 +43,11 @@ public class ThirdPartyOAuth2Service { private static final RestTemplate restTemplate = new RestTemplate(); + private final Object zzdOpenTokenLock = new Object(); + + private volatile String zzdOpenCachedAppAccessToken; + private volatile long zzdOpenCachedAppAccessTokenExpireMs; + @Autowired private OAuth2ClientConfig config; private final String baseUrl = "http://192.168.93.121:8880"; @@ -55,6 +63,8 @@ public class ThirdPartyOAuth2Service { private final ThirdPartyLogService thirdPartyLogService; + private final ZzdOpenPlatformProperties zzdOpenPlatform; + public TokenDTO getAccessToken() { TokenDTO cachedToken = tokenCache.get("access_token"); @@ -368,11 +378,173 @@ public class ThirdPartyOAuth2Service { //使用token获取当前登录人的信息(浙政钉和诗画的在一起) // ZZDUserDTO zzdUser = getZZDUserInfo(zzdToken); - ZZDUserDTO zzdUser = getZZDUserInfo(token,UserTypeEnum.ZZD.getType()); + ZZDUserDTO zzdUser = getZZDUserInfo(token, UserTypeEnum.ZZD.getType(), false); return zzdUser; } + public ZZDUserDTO zzdssoByAuthCode(String authCode) { + if (zzdOpenPlatform.isEnabled() && zzdOpenPlatform.isAppCredentialConfigured()) { + return getZzdUserByOpenPlatformAuthCode(authCode); + } + return getZZDUserInfo(authCode, UserTypeEnum.ZZD.getType(), true); + } + + private String zzdOpenBaseUrl() { + return zzdOpenPlatform.getProtocol() + "://" + zzdOpenPlatform.getDomain(); + } + + /** + * 开放平台文档:POST /gettoken.json,表单 appkey、appsecret;返回 content.data.accessToken + */ + private String getZzdOpenAppAccessToken() { + long now = System.currentTimeMillis(); + if (zzdOpenCachedAppAccessToken != null && now < zzdOpenCachedAppAccessTokenExpireMs - 60_000L) { + return zzdOpenCachedAppAccessToken; + } + synchronized (zzdOpenTokenLock) { + now = System.currentTimeMillis(); + if (zzdOpenCachedAppAccessToken != null && now < zzdOpenCachedAppAccessTokenExpireMs - 60_000L) { + return zzdOpenCachedAppAccessToken; + } + String url = zzdOpenBaseUrl() + "/gettoken.json"; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("appkey", zzdOpenPlatform.getAppKey()); + body.add("appsecret", zzdOpenPlatform.getAppSecret()); + HttpEntity> entity = new HttpEntity<>(body, headers); + ResponseEntity response; + try { + response = restTemplate.postForEntity(url, entity, String.class); + } catch (HttpStatusCodeException e) { + log.error("浙政钉 gettoken HTTP异常 状态:{} 响应:{}", e.getRawStatusCode(), e.getResponseBodyAsString()); + throw new ThirdPartyException("浙政钉获取应用 access_token 失败", "ZZD_OPEN_TOKEN_HTTP"); + } catch (ResourceAccessException e) { + log.error("浙政钉 gettoken 网络异常", e); + throw new ThirdPartyException("浙政钉开放平台暂不可用", "ZZD_OPEN_TOKEN_NET"); + } + String respBody = response.getBody(); + JSONObject data = parseZzdOpenContentData(respBody, url); + String accessToken = data.getString("accessToken"); + if (!StringUtils.hasText(accessToken)) { + throw new ThirdPartyException("浙政钉 gettoken 未返回 accessToken", "ZZD_OPEN_TOKEN_BAD"); + } + int expiresIn = 7100; + try { + Object ex = data.get("expiresIn"); + if (ex != null) { + expiresIn = Integer.parseInt(ex.toString()); + } + } catch (NumberFormatException ignored) { + } + zzdOpenCachedAppAccessToken = accessToken; + zzdOpenCachedAppAccessTokenExpireMs = System.currentTimeMillis() + expiresIn * 1000L; + return accessToken; + } + } + + /** + * POST /rpc/oauth2/dingtalk_app_user.json,表单 access_token、auth_code + */ + private ZZDUserDTO getZzdUserByOpenPlatformAuthCode(String authCode) { + String appToken = getZzdOpenAppAccessToken(); + String url = zzdOpenBaseUrl() + "/rpc/oauth2/dingtalk_app_user.json"; + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + MultiValueMap body = new LinkedMultiValueMap<>(); + body.add("access_token", appToken); + body.add("auth_code", authCode); + HttpEntity> entity = new HttpEntity<>(body, headers); + ResponseEntity response; + try { + response = restTemplate.postForEntity(url, entity, String.class); + } catch (HttpStatusCodeException e) { + log.error("浙政钉 dingtalk_app_user HTTP异常 状态:{} 响应:{}", e.getRawStatusCode(), e.getResponseBodyAsString()); + throw new ThirdPartyException("浙政钉获取用户失败", "ZZD_OPEN_USER_HTTP"); + } catch (ResourceAccessException e) { + log.error("浙政钉 dingtalk_app_user 网络异常", e); + throw new ThirdPartyException("浙政钉开放平台暂不可用", "ZZD_OPEN_USER_NET"); + } + JSONObject data = parseZzdOpenContentData(response.getBody(), url); + ZZDUserDTO dto = mapOpenPlatformUserToZzdDto(data); + if (StringUtils.hasText(zzdOpenPlatform.getTenantId()) && dto.getExt() != null + && StringUtils.hasText(dto.getExt().getRealmId()) + && !zzdOpenPlatform.getTenantId().equals(dto.getExt().getRealmId())) { + log.warn("浙政钉用户 realmId={} 与配置 zzd.open.tenant-id={} 不一致", dto.getExt().getRealmId(), zzdOpenPlatform.getTenantId()); + } + return dto; + } + + private static JSONObject parseZzdOpenContentData(String body, String requestUrl) { + if (!StringUtils.hasText(body)) { + throw new ThirdPartyException("浙政钉接口空响应: " + requestUrl, "ZZD_OPEN_EMPTY"); + } + JSONObject root = JSON.parseObject(body); + if (root == null || !root.getBooleanValue("success")) { + throw new ThirdPartyException("浙政钉接口失败: " + body, "ZZD_OPEN_FAIL"); + } + JSONObject content = root.getJSONObject("content"); + if (content == null) { + throw new ThirdPartyException("浙政钉响应缺少 content: " + body, "ZZD_OPEN_BAD"); + } + if (!content.getBooleanValue("success")) { + throw new ThirdPartyException("浙政钉 content 失败: " + body, "ZZD_OPEN_FAIL"); + } + JSONObject data = content.getJSONObject("data"); + if (data == null) { + throw new ThirdPartyException("浙政钉响应缺少 data: " + body, "ZZD_OPEN_BAD"); + } + return data; + } + + private static ZZDUserDTO mapOpenPlatformUserToZzdDto(JSONObject data) { + ZZDUserDTO dto = new ZZDUserDTO(); + String lastName = data.getString("lastName"); + String nickCn = data.getString("nickNameCn"); + dto.setUsername(lastName != null ? lastName : nickCn); + dto.setNickName(lastName != null ? lastName : nickCn); + dto.setMobile(data.getString("mobile")); + dto.setRegionCode(null); + Object orgId = data.get("organizationId"); + if (orgId instanceof Number) { + dto.setOrganizationId(((Number) orgId).intValue()); + } else { + dto.setOrganizationId(0); + } + Object accountId = data.get("accountId"); + int userId = 0; + if (accountId instanceof Number) { + long lv = ((Number) accountId).longValue(); + if (lv <= Integer.MAX_VALUE && lv >= Integer.MIN_VALUE) { + userId = (int) lv; + } + } else if (accountId != null) { + try { + long lv = Long.parseLong(accountId.toString()); + if (lv <= Integer.MAX_VALUE && lv >= Integer.MIN_VALUE) { + userId = (int) lv; + } + } catch (NumberFormatException ignored) { + } + } + dto.setUserId(userId); + ZZDUserDTO.Ext ext = dto.new Ext(); + String employeeCode = data.getString("employeeCode"); + if (!StringUtils.hasText(employeeCode)) { + employeeCode = data.getString("account"); + } + ext.setEmployeeCode(employeeCode); + ext.setOrganizationCode(data.getString("organizationCode")); + ext.setNickNameCn(nickCn); + ext.setOpenid(data.getString("openid")); + Object realm = data.get("realmId"); + ext.setRealmId(realm == null ? null : realm.toString()); + ext.setMobile(data.getString("mobile")); + dto.setExt(ext); + return dto; + } + public String getZZDToken(String token) { String url = baseUrl+config.getZzdTokenUrl()+token; @@ -392,10 +564,24 @@ public class ThirdPartyOAuth2Service { * @return */ public ZZDUserDTO getZZDUserInfo(String zzdToken,String type) { + return getZZDUserInfo(zzdToken, type, false); + } + + /** + * @param zzdAuthCodeFlow true 时走 oauth2.client.zzd-auth-code-user-info-url,query 为 authCode + */ + public ZZDUserDTO getZZDUserInfo(String credential, String type, boolean zzdAuthCodeFlow) { // 构建请求URL try { - String url = baseUrl + config.getZzdShUserInfoUrl()+"?token=" + zzdToken; + String requestPath = zzdAuthCodeFlow ? config.getZzdAuthCodeUserInfoUrl() : config.getZzdShUserInfoUrl(); + if (zzdAuthCodeFlow && !StringUtils.hasText(requestPath)) { + throw new ThirdPartyException("未配置浙政钉 authCode 换取用户:请设置 zzd.open.app-key/app-secret(开放平台)或 oauth2.client.zzd-auth-code-user-info-url(网关)", "ZZD_AUTH_CODE_CONFIG"); + } + String param = zzdAuthCodeFlow ? "authCode" : "token"; + String url = zzdAuthCodeFlow + ? baseUrl + requestPath + "?" + param + "=" + URLEncoder.encode(credential, StandardCharsets.UTF_8) + : baseUrl + requestPath + "?" + param + "=" + credential; // 获取 Bearer Token String accessToken = getAccessToken().getAccess_token(); @@ -414,7 +600,7 @@ public class ThirdPartyOAuth2Service { if (response.getBody().getCode().equals("-1")){ log.error("获取浙政钉/诗画用户信息失败"); - log.error("token",zzdToken); + log.error("token",credential); log.error("response",JSON.toJSONString(response.getBody())); ThirdPartyLogEntity thirdPartyLogEntity = new ThirdPartyLogEntity(); if (type.equals(UserTypeEnum.ZZD.getType())){ @@ -423,8 +609,8 @@ public class ThirdPartyOAuth2Service { thirdPartyLogEntity.setApiName(UserTypeEnum.SH.getDescription()); } // thirdPartyLogEntity.setApiName("获取浙政钉/诗画用户信息失败"); - thirdPartyLogEntity.setRequestUrl( baseUrl + config.getZzdShUserInfoUrl()); - thirdPartyLogEntity.setRequestParameter(zzdToken); + thirdPartyLogEntity.setRequestUrl( baseUrl + requestPath); + thirdPartyLogEntity.setRequestParameter(credential); thirdPartyLogEntity.setResponseBody(JSON.toJSONString(response.getBody())); thirdPartyLogEntity.setErrorCode(response.getBody().getCode()); thirdPartyLogEntity.setErrorMsg(response.getBody().getDescription()); 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 a1250c208..3ac1e85ff 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -40,6 +40,18 @@ oauth2: shjn_token_url: /prod-api/login/shpj # 浙证钉和诗画公用的获取用户信息接口 zzd_sh_user_info_url: /prod-api/oauth2/apis/sso/v1/fetch_user_by_uabase_token + # 浙政钉官方免登:前端 authCode 换用户信息(按实际网关/开放平台对接后填写,留空则 authCode 登录会报错) + # zzd_auth_code_user_info_url: /prod-api/... + +# 浙政钉开放平台直连(配置 app-key/app-secret 后 authCode 走 gettoken + dingtalk_app_user,无需 zzd_auth_code_user_info_url) +zzd: + open: + enabled: true + protocol: https + domain: openplatform-pro.ding.zj.gov.cn + tenant-id: "196729" + app-key: ${ZZD_OPEN_APP_KEY:pjx_zhhqyth-wt2VrVa0olcqEBBJJb} + app-secret: ${ZZD_OPEN_APP_SECRET:rT5zbpHO0L7raRHJtvlIs26N8hn53JDv1K1SNa7X} # 正元智慧 # 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 From a0be0ebc0c0b464a47ee829ddab645ec2b559a8a Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Thu, 7 May 2026 23:38:26 +0800 Subject: [PATCH 02/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud-thirdparty-biz/pom.xml | 14 ++ .../src/lib/zwdd-sdk-java-1.2.0.jar | Bin 0 -> 402128 bytes ...ZzdOpenPlatformExecutableClientHolder.java | 41 +++ .../config/ZzdOpenPlatformProperties.java | 5 + .../controller/ThirdPartyOAth2Cotroller.java | 13 + .../service/ThirdPartyOAuth2Service.java | 237 ++++++++++++------ .../thirdparty/vo/ZzdJsapiConfigVO.java | 17 ++ .../src/main/resources/application.yml | 2 + 8 files changed, 255 insertions(+), 74 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/lib/zwdd-sdk-java-1.2.0.jar create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformExecutableClientHolder.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/vo/ZzdJsapiConfigVO.java diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml index cb431bbcf..81f09a7fa 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/pom.xml @@ -155,6 +155,19 @@ 5.7.0 compile + + + com.alibaba.xxpt + zwdd-sdk-java + 1.2.0 + system + ${project.basedir}/src/lib/zwdd-sdk-java-1.2.0.jar + + + joda-time + joda-time + 2.10 + @@ -190,6 +203,7 @@ CLASSIC + true diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/lib/zwdd-sdk-java-1.2.0.jar b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/lib/zwdd-sdk-java-1.2.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..4979406660c4d1de905673823a4203b16f45b541 GIT binary patch literal 402128 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

k~AMWNL45IH_*AeJk-Kr^4D6(KYU7c7Yk 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 z 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 V$HO9Tm2Xu>>Q&)zTY;5u{s-a1`b_`; literal 0 HcmV?d00001 diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformExecutableClientHolder.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformExecutableClientHolder.java new file mode 100644 index 000000000..dbe3a8726 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformExecutableClientHolder.java @@ -0,0 +1,41 @@ +package com.bsd.pjcloud.thirdparty.config; + +import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient; +import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +/** + * 政务钉钉开放平台 {@link ExecutableClient} 单例初始化(与官方 SDK 文档一致,全局只 init 一次)。 + */ +@Component +@RequiredArgsConstructor +public class ZzdOpenPlatformExecutableClientHolder { + + private final ZzdOpenPlatformProperties zzdOpenPlatform; + + private final Object initLock = new Object(); + + private volatile boolean initialized; + + public ExecutableClient client() { + if (!zzdOpenPlatform.isEnabled() || !zzdOpenPlatform.isAppCredentialConfigured()) { + throw new ThirdPartyException("浙政钉开放平台未启用或未配置 appKey/appSecret", "ZZD_OPEN_SDK_CFG"); + } + if (!initialized) { + synchronized (initLock) { + if (!initialized) { + ExecutableClient c = ExecutableClient.getInstance(); + c.setDomainName(zzdOpenPlatform.getDomain()); + c.setProtocal(zzdOpenPlatform.getProtocol()); + c.setAccessKey(zzdOpenPlatform.getAppKey()); + c.setSecretKey(zzdOpenPlatform.getAppSecret()); + c.setValidateAfterInactivity(60_000); + c.init(); + initialized = true; + } + } + } + return ExecutableClient.getInstance(); + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java index 459b0901f..530eb1914 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java @@ -32,6 +32,11 @@ public class ZzdOpenPlatformProperties { private String appSecret = ""; + /** + * H5 微应用 JSAPI 鉴权用 AgentId(管理后台应用详情,非 appKey) + */ + private String jsapiAgentId = ""; + public boolean isAppCredentialConfigured() { return StringUtils.hasText(appKey) && StringUtils.hasText(appSecret); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index db7de5420..d6cc79d4b 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -17,6 +17,8 @@ import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.thirdparty.dto.*; import com.bsd.pjcloud.thirdparty.service.SmsService; +import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException; +import com.bsd.pjcloud.thirdparty.vo.ZzdJsapiConfigVO; import com.bsd.pjcloud.thirdparty.service.ThirdPartyOAuth2Service; import com.bsd.pjcloud.thirdparty.service.ThirdPartyUserService; import com.bsd.pjcloud.thirdparty.utils.SmsCodeUtil; @@ -87,6 +89,17 @@ public class ThirdPartyOAth2Cotroller { * @param token 浙政钉前端获取的token * @return */ + @GetMapping("/zzdJsapiConfig") + @Operation(summary = "政务钉钉H5 JSAPI鉴权(dd.authConfig 所需 ticket)") + @Inner(value = false) + public R zzdJsapiConfig() { + try { + return R.ok(thirdPartyOAuth2Service.buildZzdJsapiConfigForH5()); + } catch (ThirdPartyException e) { + return R.failed(e.getMessage()); + } + } + @PostMapping("/zzdsso") @Operation(summary = "浙政钉单点登录") @SysLog("浙政钉单点登录") diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java index 7e40f6d55..853a4992f 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java @@ -4,7 +4,19 @@ import com.alibaba.fastjson.JSON; import com.bsd.pjcloud.admin.api.entity.SysUser; import com.bsd.pjcloud.common.core.util.R; import com.alibaba.fastjson.JSONObject; +import com.alibaba.xxpt.gateway.shared.api.request.OapiGetJsapiTokenJsonRequest; +import com.alibaba.xxpt.gateway.shared.api.request.OapiGettokenJsonRequest; +import com.alibaba.xxpt.gateway.shared.api.request.OapiRpcOauth2DingtalkAppUserJsonRequest; +import com.alibaba.xxpt.gateway.shared.api.response.OapiGetJsapiTokenJsonResponse; +import com.alibaba.xxpt.gateway.shared.api.response.OapiGettokenJsonResponse; +import com.alibaba.xxpt.gateway.shared.api.response.OapiRpcOauth2DingtalkAppUserJsonResponse; +import com.alibaba.xxpt.gateway.shared.client.http.ExecutableClient; +import com.alibaba.xxpt.gateway.shared.client.http.IntelligentGetClient; +import com.alibaba.xxpt.gateway.shared.client.http.IntelligentPostClient; +import com.alibaba.xxpt.gateway.shared.client.http.api.OapiResponse; +import com.alibaba.xxpt.gateway.shared.client.http.api.OapiSpResultContent; import com.bsd.pjcloud.thirdparty.config.OAuth2ClientConfig; +import com.bsd.pjcloud.thirdparty.config.ZzdOpenPlatformExecutableClientHolder; import com.bsd.pjcloud.thirdparty.config.ZzdOpenPlatformProperties; import com.bsd.pjcloud.thirdparty.constant.UserTypeEnum; import com.bsd.pjcloud.thirdparty.dto.*; @@ -12,6 +24,7 @@ import com.bsd.pjcloud.thirdparty.entity.ThirdPartyDeptEntity; import com.bsd.pjcloud.thirdparty.entity.ThirdPartyLogEntity; import com.bsd.pjcloud.thirdparty.entity.ThirdPartyUserEntity; import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException; +import com.bsd.pjcloud.thirdparty.vo.ZzdJsapiConfigVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; @@ -48,6 +61,12 @@ public class ThirdPartyOAuth2Service { private volatile String zzdOpenCachedAppAccessToken; private volatile long zzdOpenCachedAppAccessTokenExpireMs; + private final Object zzdJsapiTicketLock = new Object(); + + private volatile String zzdOpenCachedJsapiTicket; + + private volatile long zzdOpenCachedJsapiTicketExpireMs; + @Autowired private OAuth2ClientConfig config; private final String baseUrl = "http://192.168.93.121:8880"; @@ -65,6 +84,8 @@ public class ThirdPartyOAuth2Service { private final ZzdOpenPlatformProperties zzdOpenPlatform; + private final ZzdOpenPlatformExecutableClientHolder zzdExecutableClientHolder; + public TokenDTO getAccessToken() { TokenDTO cachedToken = tokenCache.get("access_token"); @@ -390,12 +411,8 @@ public class ThirdPartyOAuth2Service { return getZZDUserInfo(authCode, UserTypeEnum.ZZD.getType(), true); } - private String zzdOpenBaseUrl() { - return zzdOpenPlatform.getProtocol() + "://" + zzdOpenPlatform.getDomain(); - } - /** - * 开放平台文档:POST /gettoken.json,表单 appkey、appsecret;返回 content.data.accessToken + * 开放平台:官方 SDK {@code IntelligentGetClient /gettoken.json},解析 content.data 中 accessToken */ private String getZzdOpenAppAccessToken() { long now = System.currentTimeMillis(); @@ -407,97 +424,111 @@ public class ThirdPartyOAuth2Service { if (zzdOpenCachedAppAccessToken != null && now < zzdOpenCachedAppAccessTokenExpireMs - 60_000L) { return zzdOpenCachedAppAccessToken; } - String url = zzdOpenBaseUrl() + "/gettoken.json"; - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("appkey", zzdOpenPlatform.getAppKey()); - body.add("appsecret", zzdOpenPlatform.getAppSecret()); - HttpEntity> entity = new HttpEntity<>(body, headers); - ResponseEntity response; try { - response = restTemplate.postForEntity(url, entity, String.class); - } catch (HttpStatusCodeException e) { - log.error("浙政钉 gettoken HTTP异常 状态:{} 响应:{}", e.getRawStatusCode(), e.getResponseBodyAsString()); - throw new ThirdPartyException("浙政钉获取应用 access_token 失败", "ZZD_OPEN_TOKEN_HTTP"); - } catch (ResourceAccessException e) { - log.error("浙政钉 gettoken 网络异常", e); - throw new ThirdPartyException("浙政钉开放平台暂不可用", "ZZD_OPEN_TOKEN_NET"); - } - String respBody = response.getBody(); - JSONObject data = parseZzdOpenContentData(respBody, url); - String accessToken = data.getString("accessToken"); - if (!StringUtils.hasText(accessToken)) { - throw new ThirdPartyException("浙政钉 gettoken 未返回 accessToken", "ZZD_OPEN_TOKEN_BAD"); - } - int expiresIn = 7100; - try { - Object ex = data.get("expiresIn"); - if (ex != null) { - expiresIn = Integer.parseInt(ex.toString()); + ExecutableClient ec = zzdExecutableClientHolder.client(); + IntelligentGetClient getClient = ec.newIntelligentGetClient("/gettoken.json"); + OapiGettokenJsonRequest req = new OapiGettokenJsonRequest(); + req.setAppkey(zzdOpenPlatform.getAppKey()); + req.setAppsecret(zzdOpenPlatform.getAppSecret()); + OapiGettokenJsonResponse resp = getClient.get(req); + zzdAssertSdkTopSuccess(resp, "gettoken"); + JSONObject data = zzdSdkSpResultData(resp.getContent(), "gettoken"); + String accessToken = data.getString("accessToken"); + if (!StringUtils.hasText(accessToken)) { + throw new ThirdPartyException("浙政钉 gettoken 未返回 accessToken", "ZZD_OPEN_TOKEN_BAD"); } - } catch (NumberFormatException ignored) { + int expiresIn = 7100; + try { + Object ex = data.get("expiresIn"); + if (ex != null) { + expiresIn = Integer.parseInt(ex.toString()); + } + } catch (NumberFormatException ignored) { + } + zzdOpenCachedAppAccessToken = accessToken; + zzdOpenCachedAppAccessTokenExpireMs = System.currentTimeMillis() + expiresIn * 1000L; + return accessToken; + } catch (ThirdPartyException e) { + throw e; + } catch (Exception e) { + log.error("浙政钉 gettoken SDK 调用异常", e); + throw new ThirdPartyException("浙政钉获取应用 access_token 失败", "ZZD_OPEN_TOKEN_SDK"); } - zzdOpenCachedAppAccessToken = accessToken; - zzdOpenCachedAppAccessTokenExpireMs = System.currentTimeMillis() + expiresIn * 1000L; - return accessToken; } } /** - * POST /rpc/oauth2/dingtalk_app_user.json,表单 access_token、auth_code + * 官方 SDK {@code IntelligentPostClient /rpc/oauth2/dingtalk_app_user.json} */ private ZZDUserDTO getZzdUserByOpenPlatformAuthCode(String authCode) { - String appToken = getZzdOpenAppAccessToken(); - String url = zzdOpenBaseUrl() + "/rpc/oauth2/dingtalk_app_user.json"; - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("access_token", appToken); - body.add("auth_code", authCode); - HttpEntity> entity = new HttpEntity<>(body, headers); - ResponseEntity response; try { - response = restTemplate.postForEntity(url, entity, String.class); - } catch (HttpStatusCodeException e) { - log.error("浙政钉 dingtalk_app_user HTTP异常 状态:{} 响应:{}", e.getRawStatusCode(), e.getResponseBodyAsString()); - throw new ThirdPartyException("浙政钉获取用户失败", "ZZD_OPEN_USER_HTTP"); - } catch (ResourceAccessException e) { - log.error("浙政钉 dingtalk_app_user 网络异常", e); - throw new ThirdPartyException("浙政钉开放平台暂不可用", "ZZD_OPEN_USER_NET"); + String appToken = getZzdOpenAppAccessToken(); + ExecutableClient ec = zzdExecutableClientHolder.client(); + IntelligentPostClient postClient = ec.newIntelligentPostClient("/rpc/oauth2/dingtalk_app_user.json"); + OapiRpcOauth2DingtalkAppUserJsonRequest req = new OapiRpcOauth2DingtalkAppUserJsonRequest(); + req.setAccess_token(appToken); + req.setAuth_code(authCode); + OapiRpcOauth2DingtalkAppUserJsonResponse resp = postClient.post(req); + zzdAssertSdkTopSuccess(resp, "dingtalk_app_user"); + JSONObject data = zzdSdkDingtalkAppUserContentData(resp.getContent()); + ZZDUserDTO dto = mapOpenPlatformUserToZzdDto(data); + if (StringUtils.hasText(zzdOpenPlatform.getTenantId()) && dto.getExt() != null + && StringUtils.hasText(dto.getExt().getRealmId()) + && !zzdOpenPlatform.getTenantId().equals(dto.getExt().getRealmId())) { + log.warn("浙政钉用户 realmId={} 与配置 zzd.open.tenant-id={} 不一致", dto.getExt().getRealmId(), zzdOpenPlatform.getTenantId()); + } + return dto; + } catch (ThirdPartyException e) { + throw e; + } catch (Exception e) { + log.error("浙政钉 dingtalk_app_user SDK 调用异常", e); + throw new ThirdPartyException("浙政钉获取用户失败", "ZZD_OPEN_USER_SDK"); } - JSONObject data = parseZzdOpenContentData(response.getBody(), url); - ZZDUserDTO dto = mapOpenPlatformUserToZzdDto(data); - if (StringUtils.hasText(zzdOpenPlatform.getTenantId()) && dto.getExt() != null - && StringUtils.hasText(dto.getExt().getRealmId()) - && !zzdOpenPlatform.getTenantId().equals(dto.getExt().getRealmId())) { - log.warn("浙政钉用户 realmId={} 与配置 zzd.open.tenant-id={} 不一致", dto.getExt().getRealmId(), zzdOpenPlatform.getTenantId()); - } - return dto; } - private static JSONObject parseZzdOpenContentData(String body, String requestUrl) { - if (!StringUtils.hasText(body)) { - throw new ThirdPartyException("浙政钉接口空响应: " + requestUrl, "ZZD_OPEN_EMPTY"); + private static void zzdAssertSdkTopSuccess(OapiResponse resp, String apiLabel) { + if (resp == null || !Boolean.TRUE.equals(resp.getSuccess())) { + String msg = resp != null && StringUtils.hasText(resp.getMessage()) ? resp.getMessage() : "success!=true"; + throw new ThirdPartyException("浙政钉 " + apiLabel + " 网关失败: " + msg, "ZZD_OPEN_FAIL"); } - JSONObject root = JSON.parseObject(body); - if (root == null || !root.getBooleanValue("success")) { - throw new ThirdPartyException("浙政钉接口失败: " + body, "ZZD_OPEN_FAIL"); - } - JSONObject content = root.getJSONObject("content"); + } + + private static JSONObject zzdSdkSpResultData(OapiSpResultContent content, String apiLabel) { if (content == null) { - throw new ThirdPartyException("浙政钉响应缺少 content: " + body, "ZZD_OPEN_BAD"); + throw new ThirdPartyException("浙政钉 " + apiLabel + " 响应无 content", "ZZD_OPEN_BAD"); } - if (!content.getBooleanValue("success")) { - throw new ThirdPartyException("浙政钉 content 失败: " + body, "ZZD_OPEN_FAIL"); + if (content.getSuccess() != null && !content.getSuccess()) { + throw new ThirdPartyException("浙政钉 " + apiLabel + " 业务失败: " + content.getResponseCode() + " " + content.getResponseMessage(), "ZZD_OPEN_FAIL"); } - JSONObject data = content.getJSONObject("data"); + String dataStr = content.getData(); + if (!StringUtils.hasText(dataStr)) { + throw new ThirdPartyException("浙政钉 " + apiLabel + " 响应无 data", "ZZD_OPEN_BAD"); + } + JSONObject data = JSON.parseObject(dataStr); if (data == null) { - throw new ThirdPartyException("浙政钉响应缺少 data: " + body, "ZZD_OPEN_BAD"); + throw new ThirdPartyException("浙政钉 " + apiLabel + " data 非 JSON", "ZZD_OPEN_BAD"); } return data; } + private static JSONObject zzdSdkDingtalkAppUserContentData(String contentStr) { + if (!StringUtils.hasText(contentStr)) { + throw new ThirdPartyException("浙政钉 dingtalk_app_user 响应无 content body", "ZZD_OPEN_BAD"); + } + JSONObject content = JSON.parseObject(contentStr); + if (content == null) { + throw new ThirdPartyException("浙政钉 dingtalk_app_user content 非 JSON", "ZZD_OPEN_BAD"); + } + if (content.containsKey("success") && !content.getBooleanValue("success")) { + throw new ThirdPartyException("浙政钉 dingtalk_app_user 业务失败: " + content.getString("responseCode") + " " + content.getString("responseMessage"), "ZZD_OPEN_FAIL"); + } + JSONObject data = content.getJSONObject("data"); + if (data != null) { + return data; + } + return content; + } + private static ZZDUserDTO mapOpenPlatformUserToZzdDto(JSONObject data) { ZZDUserDTO dto = new ZZDUserDTO(); String lastName = data.getString("lastName"); @@ -728,6 +759,64 @@ public class ThirdPartyOAuth2Service { } + /** + * 政务钉钉 H5 JSAPI 鉴权:前端 {@code dd.authConfig({ ticket, jsApiList })}。 + * 官方 SDK:{@code IntelligentGetClient /get_jsapi_token.json},请求体带应用 {@code accessToken},解析 {@code content.data.accessToken} 为 ticket。 + */ + public ZzdJsapiConfigVO buildZzdJsapiConfigForH5() { + if (!zzdOpenPlatform.isEnabled() || !zzdOpenPlatform.isAppCredentialConfigured()) { + throw new ThirdPartyException("浙政钉开放平台未启用或未配置 appKey/appSecret", "ZZD_JSAPI_CFG"); + } + String ticket = getZzdOpenJsapiTokenTicket(); + ZzdJsapiConfigVO vo = new ZzdJsapiConfigVO(); + vo.setTicket(ticket); + vo.setJsApiList(Arrays.asList("getAuthCode", "runtime.permission.requestAuthCode")); + return vo; + } + + private String getZzdOpenJsapiTokenTicket() { + long now = System.currentTimeMillis(); + if (StringUtils.hasText(zzdOpenCachedJsapiTicket) && now < zzdOpenCachedJsapiTicketExpireMs - 120_000L) { + return zzdOpenCachedJsapiTicket; + } + synchronized (zzdJsapiTicketLock) { + now = System.currentTimeMillis(); + if (StringUtils.hasText(zzdOpenCachedJsapiTicket) && now < zzdOpenCachedJsapiTicketExpireMs - 120_000L) { + return zzdOpenCachedJsapiTicket; + } + String appToken = getZzdOpenAppAccessToken(); + try { + ExecutableClient ec = zzdExecutableClientHolder.client(); + IntelligentGetClient getClient = ec.newIntelligentGetClient("/get_jsapi_token.json"); + OapiGetJsapiTokenJsonRequest req = new OapiGetJsapiTokenJsonRequest(); + req.setAccessToken(appToken); + OapiGetJsapiTokenJsonResponse resp = getClient.get(req); + zzdAssertSdkTopSuccess(resp, "get_jsapi_token"); + JSONObject data = zzdSdkSpResultData(resp.getContent(), "get_jsapi_token"); + String ticket = data.getString("accessToken"); + if (!StringUtils.hasText(ticket)) { + throw new ThirdPartyException("浙政钉 get_jsapi_token 响应无 data.accessToken", "ZZD_JSAPI_TK_BAD"); + } + int ttl = 7100; + try { + Object ex = data.get("expiresIn"); + if (ex != null) { + ttl = Integer.parseInt(ex.toString()); + } + } catch (NumberFormatException ignored) { + } + zzdOpenCachedJsapiTicket = ticket; + zzdOpenCachedJsapiTicketExpireMs = System.currentTimeMillis() + ttl * 1000L; + return ticket; + } catch (ThirdPartyException e) { + throw e; + } catch (Exception e) { + log.error("浙政钉 get_jsapi_token SDK 调用异常", e); + throw new ThirdPartyException("浙政钉获取 JSAPI ticket 失败", "ZZD_JSAPI_TK_SDK"); + } + } + } + /** * 诗画 * @param accountId diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/vo/ZzdJsapiConfigVO.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/vo/ZzdJsapiConfigVO.java new file mode 100644 index 000000000..1301b4030 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/vo/ZzdJsapiConfigVO.java @@ -0,0 +1,17 @@ +package com.bsd.pjcloud.thirdparty.vo; + +import lombok.Data; + +import java.util.List; + +/** + * 政务钉钉 / 专有钉钉 H5:{@code dd.authConfig} 参数。 + * ticket 来自开放平台 {@code POST /get_jsapi_token.json} 返回的 {@code content.data.accessToken}(文档称鉴权 ticket)。 + */ +@Data +public class ZzdJsapiConfigVO { + + private String ticket; + + private List jsApiList; +} 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 f0b36d3ac..390f36294 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -52,6 +52,8 @@ zzd: tenant-id: "196729" app-key: ${ZZD_OPEN_APP_KEY:pjx_zhhqyth-wt2VrVa0olcqEBBJJb} app-secret: ${ZZD_OPEN_APP_SECRET:rT5zbpHO0L7raRHJtvlIs26N8hn53JDv1K1SNa7X} + # H5 使用 dd.authConfig 时仅需 ak/sk;jsapi-agent-id 为旧版 dd.config 方案保留,可不配 + # jsapi-agent-id: # 正元智慧 # 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 From fe3cdd8e55856f4924c1ef5524cdc3cacb40aeb8 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 13:11:58 +0800 Subject: [PATCH 03/10] =?UTF-8?q?user=E6=80=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pjcloud-thirdparty-biz/src/main/resources/application.yml | 1 + .../main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java | 3 +++ 2 files changed, 4 insertions(+) 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 390f36294..8dcec131c 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -49,6 +49,7 @@ zzd: enabled: true protocol: https domain: openplatform-pro.ding.zj.gov.cn +# domain: openplatform.dg-work.cn tenant-id: "196729" app-key: ${ZZD_OPEN_APP_KEY:pjx_zhhqyth-wt2VrVa0olcqEBBJJb} app-secret: ${ZZD_OPEN_APP_SECRET:rT5zbpHO0L7raRHJtvlIs26N8hn53JDv1K1SNa7X} diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java index 822a31e0c..60373b7ae 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java @@ -264,4 +264,7 @@ public class SysUser extends Model implements Serializable { */ @Schema(description = "编制类型") private String staffingType; + + @Schema(description = "性别") + private Integer gender; } From 957641393cddae50459942b1453c311ca1f504bc Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 19:54:26 +0800 Subject: [PATCH 04/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AppUserAutoLoginController.java | 106 +-------- .../controller/NoticeController.java | 40 ++++ .../controller/SysBannerController.java | 35 ++- .../feign/RemoterThirdPartyAuthService.java | 9 +- .../pjcloud/thirdparty/dto/UrlTokenDTO.java | 2 +- .../pjcloud/thirdparty/dto/ZZDUserDTO.java | 5 + .../thirdparty/dto/ZzdPhoneConfirmDTO.java | 16 ++ .../thirdparty/dto/ZzdUserSnapshot.java | 47 ++++ .../bsd/pjcloud/thirdparty/ThirdPartyApp.java | 3 + .../thirdparty/config/OAuth2ClientConfig.java | 12 +- .../ThirdPartyZzdSmsBindProperties.java | 22 ++ .../config/ZzdOpenPlatformProperties.java | 2 +- .../controller/ThirdPartyOAth2Cotroller.java | 209 +++++++++--------- .../entity/ThirdPartyZzdPhoneBindEntity.java | 63 ++++++ .../mapper/ThirdPartyZzdPhoneBindMapper.java | 9 + .../service/ThirdPartyOAuth2Service.java | 56 +---- .../service/ThirdPartyZzdSmsBindService.java | 104 +++++++++ .../src/main/resources/application.yml | 15 +- .../bsd/pjcloud/admin/api/entity/SysUser.java | 1 + 19 files changed, 473 insertions(+), 283 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdPhoneConfirmDTO.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdUserSnapshot.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdPartyZzdPhoneBindEntity.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdPartyZzdPhoneBindMapper.java create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java index 589d0e7db..a3c22af2c 100644 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppUserAutoLoginController.java @@ -38,10 +38,9 @@ import com.bsd.pjcloud.common.log.annotation.SysLog; import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.thirdparty.api.feign.RemoterThirdPartyAuthService; import com.bsd.pjcloud.thirdparty.dto.SHJNSSODTO; +import com.bsd.pjcloud.thirdparty.dto.UrlTokenDTO; import com.bsd.pjcloud.thirdparty.dto.ZZDUserDTO; import com.bsd.pjcloud.thirdparty.entity.ThirdPartyUserEntity; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; @@ -90,111 +89,18 @@ public class AppUserAutoLoginController { private final RemoteOnlineCanteenSpuService remoteOnlineCanteenSpuService; private final RemoteDailyMenuService remoteDailyMenuService; - /* - * - * @param token 浙政钉前端获取的token - * @return + /** + * 路径参数历史命名为 token,实为浙政钉 H5 {@code authCode},转发 thirdParty 统一单点(含短信核验等逻辑)。 */ @GetMapping("/zzdsso/{token}") @Operation(summary = "浙政钉单点登录") @Inner(value = false) @GlobalTransactional @Transactional(rollbackFor = Exception.class) - //todo 引入seata分布式事务 public R zzdsso(@PathVariable(name = "token") String token) { - - //获取数字政务token通过浙政钉前端获取的token,调试阶段先写死 - String json = "{" + - "\"username\": \"李宗相\"," + - "\"organizationId\": 2," + - "\"userId\": 1340," + - "\"nickName\": \"李宗相\"," + - "\"mobile\": \"18576496089\"," + - "\"regionCode\": null," + - "\"ext\": {" + - "\"employeeCode\": \"GE_ae12bdf21598498eb48bf2cf2c45a3e1\"," + - "\"organizationCode\": \"GO_63e77077d5e041789bbbe1d0d20bcf41\"," + - "\"nickNameCn\": \"李宗相\"," + - "\"openid\": \"1b51f0e11fc73b8adddcbaf7982daab6\"," + - "\"realmId\": \"196729\"," + - "\"mobile\": null" + - "}" + - "}"; - - - ObjectMapper objectMapper = new ObjectMapper(); - ZZDUserDTO zzdUserDTO; - try { - zzdUserDTO = objectMapper.readValue(json, ZZDUserDTO.class); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); - } - //暂时先注释,模拟一下就行 -// R zzdsso = remoterThirdPartyAuthService.zzdsso(token); -// ZZDUserDTO zzdUserDTO = (ZZDUserDTO) zzdsso.getData(); - ZZDUserDTO.Ext ext = zzdUserDTO.getExt(); - String employeeCode = ext.getEmployeeCode(); - String mobile = zzdUserDTO.getMobile(); - - //两种方式,手机号+员工钉钉号,查到相同就视为同一个人,然后登录 - //先系统表里面查看是否有,在第三方数据库表里面看下是否有 - - //1.根据手机号或者钉钉号先查询是否有这个人 - R> userByMobileOrEmployeeCode = remoteUserService.getUserByMobileOrEmployeeCode(employeeCode, mobile); - List sysUserList = userByMobileOrEmployeeCode.getData(); - - if(!CollectionUtils.isEmpty(sysUserList)){ - //登录成功生成token - UserTokenDTO userTokenDTO = new UserTokenDTO(); - userTokenDTO.setSysUser(sysUserList.get(0)); - remoteTokenService.generateToken(userTokenDTO); - } - //2.根据浙政钉的员工钉钉号查询是否有这个人 - R> thirdPartyUserEntityR=remoterThirdPartyAuthService.getUserByEmployeeCode(employeeCode); - List thirdPartyUserEntityList = thirdPartyUserEntityR.getData(); - - UserDTO userDTO = new UserDTO(); - //写死,新加入到部门表的全部归类到其他部门里面,不按照浙政钉的部门 - userDTO.setDeptId(1865990541445263361L); - userDTO.setUsername(zzdUserDTO.getUsername()); - userDTO.setName(zzdUserDTO.getUsername()); - userDTO.setNickname(zzdUserDTO.getUsername()); - //浙里办用户 - userDTO.setSystemType("1"); - //取上面的手机号 - userDTO.setPhone(mobile); - userDTO.setDingtalkEmployeeCode(employeeCode); - //随便写死给个密码 - userDTO.setPassword("pj"+mobile); -/* if(!CollectionUtils.isEmpty(thirdPartyUserEntityList)){ - //todo 这一步现在是没用的,这个最终要考虑是否通过浙政钉里面的人员来限制移动端的使用用户来决定 - //第三方数据库里面有 - //这里只在第三方库里查到,所以要对系统用户表进行新增当前用户,插入一条信息进去 - R booleanR = remoteUserService.registerUser(userDTO); - //通过唯一手机号查询到刚注册的用户信息,生成token - R> userByMobile=remoteUserService.getUserByMobile(mobile); - SysUser sysUser = userByMobile.getData().get(0); - UserTokenDTO userTokenDTO = new UserTokenDTO(); - userTokenDTO.setSysUser(sysUser); - //登录成功,根据新注册的用户信息返回token - remoteTokenService.generateToken(userTokenDTO); - } - else { - //两个表都没查到人员不能够使用移动端的系统 - }*/ - -// log.info("用户不存在,尝试创建用户"); - - R booleanR = remoteUserService.registerUser(userDTO); - //通过唯一手机号查询到刚注册的用户信息,生成token - - R> userByMobile=remoteUserService.getUserByMobile(mobile); - SysUser sysUser = userByMobile.getData().get(0); - int i=8/0; - UserTokenDTO userTokenDTO = new UserTokenDTO(); - userTokenDTO.setSysUser(sysUser); - //登录成功,根据新注册的用户信息返回token - return remoteTokenService.generateToken(userTokenDTO); + UrlTokenDTO body = new UrlTokenDTO(); + body.setAuthCode(token); + return remoterThirdPartyAuthService.zzdsso(body); } diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/NoticeController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/NoticeController.java index 880e68e20..3d6811c82 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/NoticeController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/NoticeController.java @@ -171,6 +171,46 @@ public class NoticeController { return R.ok(notice); } + /** + * IRS / 纯静态托管 H5:与 {@link #getAppNoticePage} 数据一致,凭 X-App-Id、X-App-Secret({@code pjcloud.external-app})访问,不依赖用户 OAuth2 Token。 + */ + @Operation(summary = "开放-公告分页", description = "凭应用凭证访问,供无法携带登录 Token 的 H5") + @GetMapping("/open/page") + @Inner(value = false) + public R getOpenNoticePage( + @RequestHeader(value = "X-App-Id", required = false) String appId, + @RequestHeader(value = "X-App-Secret", required = false) String appSecret, + @ParameterObject Page page, + @RequestParam(required = false) String title) { + if (!isValidAppCredentials(appId, appSecret)) { + return R.failed("无效的应用ID或密钥"); + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(); + wrapper.eq(NoticeEntity::getStatus, "0"); + wrapper.like(StrUtil.isNotBlank(title), NoticeEntity::getTitle, title); + wrapper.and(w -> w.isNull(NoticeEntity::getExpireTime) + .or() + .gt(NoticeEntity::getExpireTime, LocalDateTime.now())); + wrapper.orderByDesc(NoticeEntity::getIsTop, NoticeEntity::getCreateTime); + return R.ok(noticeService.page(page, wrapper)); + } + + /** + * IRS / 纯静态托管 H5:与 {@link #getAppNoticeDetail} 一致,凭应用凭证访问。 + */ + @Operation(summary = "开放-公告详情", description = "凭应用凭证访问") + @GetMapping("/open/{id}") + @Inner(value = false) + public R getOpenNoticeDetail( + @RequestHeader(value = "X-App-Id", required = false) String appId, + @RequestHeader(value = "X-App-Secret", required = false) String appSecret, + @PathVariable("id") Long id) { + if (!isValidAppCredentials(appId, appSecret)) { + return R.failed("无效的应用ID或密钥"); + } + return getAppNoticeDetail(id); + } + /** * App公告浏览量+1 * @param id 公告ID diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/SysBannerController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/SysBannerController.java index 5f084ce2f..79762b736 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/SysBannerController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/SysBannerController.java @@ -136,15 +136,43 @@ public class SysBannerController { return R.failed("无效的应用ID或密钥"); } + return R.ok(buildAppBannerVoList()); + } + + /** + * H5 / 浙政钉工作台(zzdhome)轮播:与 {@link #appList} 数据一致,无需 X-App-Id/Secret,便于前端直接拉取。 + * 若需对外收口鉴权,可在网关按路径单独配置。 + */ + @Operation(summary = "H5/App轮播图列表", description = "上架且在有效期内,字段同外部 app 接口;图片 URL 规则与 /app/list 一致") + @GetMapping("/app/slides") + @Inner(value = false) + public R> appSlides() { + return R.ok(buildAppBannerVoList()); + } + + /** + * IRS / 无法携带用户 Token 的 H5:与 {@link #appList} 相同鉴权与数据,路径便于与公告 {@code /notice/open/*} 一并加入网关放行。 + */ + @Operation(summary = "开放-轮播图列表", description = "凭 X-App-Id、X-App-Secret 访问,同 /app/list") + @GetMapping("/open/slides") + @Inner(value = false) + public R> openSlides( + @RequestHeader(value = "X-App-Id", required = false) String appId, + @RequestHeader(value = "X-App-Secret", required = false) String appSecret) { + if (!isValidAppCredentials(appId, appSecret)) { + return R.failed("无效的应用ID或密钥"); + } + return R.ok(buildAppBannerVoList()); + } + + private List buildAppBannerVoList() { String imageBaseUrl = bannerAppConfig.getImageBaseUrl(); boolean needPrefix = StrUtil.isNotBlank(imageBaseUrl); String baseUrl = needPrefix ? imageBaseUrl.trim() : ""; - List list = sysBannerService.listAppBanners(); - List voList = list.stream() + return list.stream() .map(e -> { SysBannerAppVo vo = BeanUtils.toBean(e, SysBannerAppVo.class); - // imageUrl 前拼接统一基础路径 if (needPrefix && StrUtil.isNotBlank(e.getImageUrl())) { String path = e.getImageUrl().trim(); if (!path.startsWith("http://") && !path.startsWith("https://")) { @@ -159,7 +187,6 @@ public class SysBannerController { return vo; }) .collect(Collectors.toList()); - return R.ok(voList); } /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdPartyAuthService.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdPartyAuthService.java index c4f00fb7f..61187b414 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdPartyAuthService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/api/feign/RemoterThirdPartyAuthService.java @@ -21,6 +21,7 @@ package com.bsd.pjcloud.thirdparty.api.feign; import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.feign.annotation.NoToken; +import com.bsd.pjcloud.thirdparty.dto.UrlTokenDTO; import com.bsd.pjcloud.thirdparty.entity.ThirdPartyUserEntity; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -35,13 +36,11 @@ import java.util.List; public interface RemoterThirdPartyAuthService { /** - * zzd单点 - * @param token - * @return + * 浙政钉单点(与 thirdPartyOAth2/zzdsso 一致,body.authCode 为 H5 免登码) */ @NoToken - @GetMapping("/thirdPartyOAth2/zzd/sso") - R zzdsso(@RequestParam("token") String token); + @PostMapping("/thirdPartyOAth2/zzdsso") + R zzdsso(@RequestBody UrlTokenDTO body); @NoToken diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java index eae2c2cc4..88a81ef4a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/UrlTokenDTO.java @@ -6,7 +6,7 @@ import lombok.Data; @Data public class UrlTokenDTO { /** - * 旧数字政务/第三方网关下发的 uabaseToken(逐步淘汰) + * 已废弃:浙政钉单点仅使用 authCode,不再传网关 uabaseToken */ private String token; /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZZDUserDTO.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZZDUserDTO.java index 3d849dc2c..489b08250 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZZDUserDTO.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZZDUserDTO.java @@ -2,6 +2,11 @@ package com.bsd.pjcloud.thirdparty.dto; import lombok.Data; +/** + * 第三方 SSO 在本服务内的统一用户视图(非开放平台原始报文体)。 + * 浙政钉:由 {@code dingtalk_app_user} 等适配层填入;诗画:由网关用户信息接口填入。 + * 后续业务(发 token、短信绑定快照等)只依赖本结构,与走网关还是走开放平台无关。 + */ @Data public class ZZDUserDTO { private String username; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdPhoneConfirmDTO.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdPhoneConfirmDTO.java new file mode 100644 index 000000000..210db4b20 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdPhoneConfirmDTO.java @@ -0,0 +1,16 @@ +package com.bsd.pjcloud.thirdparty.dto; + +import lombok.Data; + +@Data +public class ZzdPhoneConfirmDTO { + + /** + * /zzdsso 返回的 bindSessionId + */ + private String bindSessionId; + + private String mobilePhone; + + private String smsCode; +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdUserSnapshot.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdUserSnapshot.java new file mode 100644 index 000000000..42d3df9a9 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdUserSnapshot.java @@ -0,0 +1,47 @@ +package com.bsd.pjcloud.thirdparty.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 浙政钉会话快照(可 JSON 序列化入 Redis),避免 ZZDUserDTO 内部类反序列化问题。 + */ +@Data +public class ZzdUserSnapshot implements Serializable { + + private static final long serialVersionUID = 1L; + + private String username; + + private String nickName; + + /** 浙政钉接口若返回的顶层手机号 */ + private String zzdMobile; + + private String employeeCode; + + private String openid; + + private String organizationCode; + + private String realmId; + + public static ZzdUserSnapshot from(ZZDUserDTO dto) { + ZzdUserSnapshot s = new ZzdUserSnapshot(); + if (dto == null) { + return s; + } + s.setUsername(dto.getUsername()); + s.setNickName(dto.getNickName()); + s.setZzdMobile(dto.getMobile()); + ZZDUserDTO.Ext ext = dto.getExt(); + if (ext != null) { + s.setEmployeeCode(ext.getEmployeeCode()); + s.setOpenid(ext.getOpenid()); + s.setOrganizationCode(ext.getOrganizationCode()); + s.setRealmId(ext.getRealmId()); + } + return s; + } +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java index 4c92e0396..88f0a2699 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/ThirdPartyApp.java @@ -3,8 +3,10 @@ package com.bsd.pjcloud.thirdparty; import com.bsd.pjcloud.common.feign.annotation.EnablePjcloudFeignClients; import com.bsd.pjcloud.common.security.annotation.EnablePjcloudResourceServer; import com.bsd.pjcloud.common.swagger.annotation.EnableOpenApi; +import com.bsd.pjcloud.thirdparty.config.ThirdPartyZzdSmsBindProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** @@ -16,6 +18,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient; @EnablePjcloudFeignClients @EnableDiscoveryClient @EnablePjcloudResourceServer +@EnableConfigurationProperties(ThirdPartyZzdSmsBindProperties.class) @SpringBootApplication public class ThirdPartyApp { public static void main(String[] args) { diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java index 51dbd6290..c45e61a9a 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/OAuth2ClientConfig.java @@ -23,25 +23,15 @@ public class OAuth2ClientConfig { private String userDetailUrl; - /** - * 浙政钉获取token的接口 - */ - private String zzdTokenUrl; - /** * 诗画江南的token接口 */ private String shjnTokenUrl; /** - * 浙政钉跟诗画的获取用户信息的url + * 诗画江南 uabaseToken 换用户信息(网关 GET ?token=) */ private String zzdShUserInfoUrl; - /** - * 浙政钉官方 H5 authCode 换取用户信息(GET ?authCode=),响应体需与 {@code ApiResponse} 一致 - */ - private String zzdAuthCodeUserInfoUrl; - } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java new file mode 100644 index 000000000..9e2df8ccf --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java @@ -0,0 +1,22 @@ +package com.bsd.pjcloud.thirdparty.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * 浙政钉无手机号时:首次短信核验 + 与本系统用户手机号比对后再发 token。 + */ +@Data +@ConfigurationProperties(prefix = "pjcloud.thirdparty.zzd-sms-bind") +public class ThirdPartyZzdSmsBindProperties { + + /** + * 是否开启(关闭时 /zzdsso 在拿到浙政钉用户后直接按手机号+员工编码查用户并发 token) + */ + private boolean enabled = false; + + /** + * 绑定会话在 Redis 中的有效时间(分钟) + */ + private int bindSessionTtlMinutes = 15; +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java index 530eb1914..cab441374 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ZzdOpenPlatformProperties.java @@ -15,7 +15,7 @@ import org.springframework.util.StringUtils; public class ZzdOpenPlatformProperties { /** - * 为 false 时不走开放平台直连,仍使用 oauth2.client.zzd-auth-code-user-info-url 等旧网关配置 + * 为 false 时禁用开放平台 SDK;浙政钉 authCode 单点不可用(需为 true 且配置 appKey/appSecret) */ private boolean enabled = true; diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index d6cc79d4b..aca574839 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -21,13 +21,17 @@ import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException; import com.bsd.pjcloud.thirdparty.vo.ZzdJsapiConfigVO; import com.bsd.pjcloud.thirdparty.service.ThirdPartyOAuth2Service; import com.bsd.pjcloud.thirdparty.service.ThirdPartyUserService; +import com.bsd.pjcloud.thirdparty.service.ThirdPartyZzdSmsBindService; +import com.fasterxml.jackson.core.JsonProcessingException; import com.bsd.pjcloud.thirdparty.utils.SmsCodeUtil; +import com.alibaba.fastjson.JSON; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.seata.spring.annotation.GlobalTransactional; import org.springframework.beans.factory.annotation.Autowired; @@ -43,6 +47,7 @@ import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.TimeUnit; +@Slf4j @RestController @RequiredArgsConstructor @RequestMapping("/thirdPartyOAth2") @@ -70,12 +75,7 @@ public class ThirdPartyOAth2Cotroller { private final RemoteUserTrustedDeviceService remoteUserTrustedDeviceService; -// @Operation(summary = "浙政钉token" ) -// @GetMapping("/zzd/sso" ) -// public R getThirdPartyzzdsso(@RequestParam("token")String token) { -// return R.ok(thirdPartyOAuth2Service.getZZDUserInfo(token)); -// -// } + private final ThirdPartyZzdSmsBindService thirdPartyZzdSmsBindService; @Operation(summary = "诗画token") @GetMapping("/sh/sso") @@ -84,11 +84,6 @@ public class ThirdPartyOAth2Cotroller { } - /* - * - * @param token 浙政钉前端获取的token - * @return - */ @GetMapping("/zzdJsapiConfig") @Operation(summary = "政务钉钉H5 JSAPI鉴权(dd.authConfig 所需 ticket)") @Inner(value = false) @@ -107,111 +102,113 @@ public class ThirdPartyOAth2Cotroller { @GlobalTransactional @Transactional(rollbackFor = Exception.class) public R zzdsso(@RequestBody UrlTokenDTO urlTokenDTO) { - String authCode = urlTokenDTO.getAuthCode(); - String token = urlTokenDTO.getToken(); - if (StringUtils.isBlank(authCode) && StringUtils.isBlank(token)) { - return R.failed("token与authCode不能均为空"); + String authCode = urlTokenDTO != null ? urlTokenDTO.getAuthCode() : null; + if (StringUtils.isBlank(authCode)) { + return R.failed("请传入浙政钉 authCode(H5 免登临时码)"); } - //获取数字政务token通过浙政钉前端获取的token,调试阶段先写死 -// String json = "{" + -// "\"username\": \"李宗相\"," + -// "\"organizationId\": 2," + -// "\"userId\": 1340," + -// "\"nickName\": \"李宗相\"," + -// "\"mobile\": \"18576496089\"," + -// "\"regionCode\": null," + -// "\"ext\": {" + -// "\"employeeCode\": \"GE_ae12bdf21598498eb48bf2cf2c45a3e1\"," + -// "\"organizationCode\": \"GO_63e77077d5e041789bbbe1d0d20bcf41\"," + -// "\"nickNameCn\": \"李宗相\"," + -// "\"openid\": \"1b51f0e11fc73b8adddcbaf7982daab6\"," + -// "\"realmId\": \"196729\"," + -// "\"mobile\": null" + -// "}" + -// "}"; -// -// -// ObjectMapper objectMapper = new ObjectMapper(); -// ZZDUserDTO zzdUserDTO; -// try { -// zzdUserDTO = objectMapper.readValue(json, ZZDUserDTO.class); -// } catch (JsonProcessingException e) { -// throw new RuntimeException(e); -// } - //暂时先注释,模拟一下就行 - ZZDUserDTO zzdUserDTO = StringUtils.isNotBlank(authCode) - ? thirdPartyOAuth2Service.zzdssoByAuthCode(authCode) - : thirdPartyOAuth2Service.zzdsso(token); + ZZDUserDTO zzdUserDTO = thirdPartyOAuth2Service.zzdssoByAuthCode(authCode.trim()); + log.warn("[zzdsso][ZZDUserDTO_JSON] 浙政钉开放平台映射后的对象,可整段复制做本地写死调试(含姓名手机号等敏感信息,调试完建议关日志或删此行) body={}", JSON.toJSONString(zzdUserDTO)); ZZDUserDTO.Ext ext = zzdUserDTO.getExt(); - String employeeCode = ext.getEmployeeCode(); + String employeeCode = ext != null ? ext.getEmployeeCode() : null; String mobile = zzdUserDTO.getMobile(); - //两种方式,手机号+员工钉钉号,查到相同就视为同一个人,然后登录 - //先系统表里面查看是否有,在第三方数据库表里面看下是否有 - - R r; - //1.根据手机号或者钉钉号先查询是否有这个人 - R> userByMobileOrEmployeeCode = remoteUserService.getUserByMobileOrEmployeeCode(employeeCode, mobile); - List sysUserList = userByMobileOrEmployeeCode.getData(); - if(!CollectionUtils.isEmpty(sysUserList)){ - //登录成功生成token - UserTokenDTO userTokenDTO = new UserTokenDTO(); - userTokenDTO.setSysUser(sysUserList.get(0)); - r = remoteTokenService.generateToken(userTokenDTO); - }else { - //2.根据浙政钉的员工钉钉号查询是否有这个人 -// List thirdPartyUserEntityList = thirdPartyUserService.getUserByEmployeeCode(employeeCode); -// UserDTO userDTO = new UserDTO(); -// //写死,新加入到部门表的全部归类到其他部门里面,不按照浙政钉的部门 -// userDTO.setDeptId(1865990541445263361L); -// userDTO.setUsername(zzdUserDTO.getUsername()); -// userDTO.setName(zzdUserDTO.getUsername()); -// userDTO.setNickname(zzdUserDTO.getUsername()); -// //浙里办用户 -// userDTO.setSystemType("1"); -// //取上面的手机号 -// userDTO.setPhone(mobile); -// userDTO.setDingtalkEmployeeCode(employeeCode); -// //随便写死给个密码 -// userDTO.setPassword("pj"+mobile); -// if(!CollectionUtils.isEmpty(thirdPartyUserEntityList)){ -// //todo 这一步现在是没用的,这个最终要考虑是否通过浙政钉里面的人员来限制移动端的使用用户来决定 -// //第三方数据库里面有 -// //这里只在第三方库里查到,所以要对系统用户表进行新增当前用户,插入一条信息进去 -// R booleanR = remoteUserService.registerUser(userDTO); -// //通过唯一手机号查询到刚注册的用户信息,生成token -// R> userByMobile=remoteUserService.getUserByMobile(mobile); -// SysUser sysUser = userByMobile.getData().get(0); -// UserTokenDTO userTokenDTO = new UserTokenDTO(); -// userTokenDTO.setSysUser(sysUser); -// //登录成功,根据新注册的用户信息返回token -// r=remoteTokenService.generateToken(userTokenDTO); -// }else { -// return R.failed("没有找到当前用户信息,无法访问!"); -// } - return R.failed("系统中没有当前用户信息,请联系管理员进行申请!"); + if (thirdPartyZzdSmsBindService.isEnabled()) { + if (StringUtils.isBlank(employeeCode)) { + return R.failed("浙政钉未返回员工编码,无法登录"); + } + var boundOpt = thirdPartyZzdSmsBindService.findByEmployeeCode(employeeCode); + if (boundOpt.isPresent()) { + return buildZzdSsoTokenResult(employeeCode, boundOpt.get().getVerifiedPhone()); + } + try { + ZzdUserSnapshot snap = ThirdPartyZzdSmsBindService.snapshotOf(zzdUserDTO); + if (StringUtils.isBlank(snap.getEmployeeCode())) { + return R.failed("浙政钉未返回员工编码,无法登录"); + } + String bindSessionId = thirdPartyZzdSmsBindService.createBindSession(snap); + HashMap need = new HashMap<>(); + need.put("needSmsVerify", Boolean.TRUE); + need.put("bindSessionId", bindSessionId); + need.put("displayName", StringUtils.defaultIfBlank(zzdUserDTO.getNickName(), zzdUserDTO.getUsername())); + return R.ok(need); + } + catch (JsonProcessingException e) { + return R.failed("创建绑定会话失败"); + } } - //两个表都没查到人员不能够使用移动端的系统 + return buildZzdSsoTokenResult(employeeCode, mobile); + } -// log.info("用户不存在,尝试创建用户"); + /** + * 浙政钉短信核验:校验验证码、写入绑定表、与本系统用户手机号+员工编码比对后返回 token。 + */ + @PostMapping("/zzdsso/confirmPhone") + @Operation(summary = "浙政钉单点-短信核验手机号") + @SysLog("浙政钉单点短信核验") + @Inner(value = false) + @Transactional(rollbackFor = Exception.class) + public R confirmZzdPhoneBind(@RequestBody ZzdPhoneConfirmDTO dto) { + if (dto == null || StringUtils.isAnyBlank(dto.getBindSessionId(), dto.getMobilePhone(), dto.getSmsCode())) { + return R.failed("参数不完整"); + } + try { + ZzdUserSnapshot snap = thirdPartyZzdSmsBindService.getBindSession(dto.getBindSessionId()); + if (snap == null) { + return R.failed("绑定会话已过期,请重新登录"); + } + if (StringUtils.isBlank(snap.getEmployeeCode())) { + return R.failed("会话数据异常"); + } + String redisKey = CacheConstants.SMS_CODE_KEY + dto.getMobilePhone(); + String storedCode = (String) redisTemplate.opsForValue().get(redisKey); + if (!dto.getSmsCode().equals(storedCode)) { + return R.failed("验证码错误"); + } + redisTemplate.delete(redisKey); -// R booleanR = remoteUserService.registerUser(userDTO); -// //通过唯一手机号查询到刚注册的用户信息,生成token -// -// R> userByMobile=remoteUserService.getUserByMobile(mobile); -// SysUser sysUser = userByMobile.getData().get(0); -//// int i=8/0; -// UserTokenDTO userTokenDTO = new UserTokenDTO(); -// userTokenDTO.setSysUser(sysUser); -// //登录成功,根据新注册的用户信息返回token -// R r = remoteTokenService.generateToken(userTokenDTO); + R> byPhone = remoteUserService.getUserByMobile(dto.getMobilePhone()); + List users = byPhone.getData(); + if (CollectionUtils.isEmpty(users)) { + return R.failed("本系统不存在该手机号用户"); + } + SysUser sysUser = users.get(0); + if (StringUtils.isNotBlank(sysUser.getDingtalkEmployeeCode()) + && !sysUser.getDingtalkEmployeeCode().equals(snap.getEmployeeCode())) { + return R.failed("浙政钉账号与本系统用户不一致"); + } + + thirdPartyZzdSmsBindService.recordVerifiedBind(snap, dto.getMobilePhone()); + thirdPartyZzdSmsBindService.removeBindSession(dto.getBindSessionId()); + + UserTokenDTO userTokenDTO = new UserTokenDTO(); + userTokenDTO.setSysUser(sysUser); + R r = remoteTokenService.generateToken(userTokenDTO); + HashMap out = new HashMap<>(); + out.put("refreshToken", r.getData().get("refreshToken")); + out.put("accessToken", r.getData().get("accessToken")); + return R.ok(out); + } + catch (JsonProcessingException e) { + return R.failed("保存绑定信息失败"); + } + } + + private R buildZzdSsoTokenResult(String employeeCode, String mobileForLookup) { + R> userByMobileOrEmployeeCode = remoteUserService.getUserByMobileOrEmployeeCode( + StringUtils.defaultString(employeeCode), + StringUtils.defaultString(mobileForLookup)); + List sysUserList = userByMobileOrEmployeeCode.getData(); + if (CollectionUtils.isEmpty(sysUserList)) { + return R.failed("系统中没有当前用户信息,请联系管理员进行申请!"); + } + UserTokenDTO userTokenDTO = new UserTokenDTO(); + userTokenDTO.setSysUser(sysUserList.get(0)); + R r = remoteTokenService.generateToken(userTokenDTO); HashMap objectObjectHashMap = new HashMap<>(); - Object accessToken = r.getData().get("accessToken"); - Object refreshToken = r.getData().get("refreshToken"); - objectObjectHashMap.put("refreshToken",refreshToken); - objectObjectHashMap.put("accessToken",accessToken); + objectObjectHashMap.put("refreshToken", r.getData().get("refreshToken")); + objectObjectHashMap.put("accessToken", r.getData().get("accessToken")); return R.ok(objectObjectHashMap); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdPartyZzdPhoneBindEntity.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdPartyZzdPhoneBindEntity.java new file mode 100644 index 000000000..4bd75fe6f --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/entity/ThirdPartyZzdPhoneBindEntity.java @@ -0,0 +1,63 @@ +package com.bsd.pjcloud.thirdparty.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import com.bsd.pjcloud.common.core.util.TenantTable; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; + +/** + * 浙政钉用户短信核验手机号绑定 + */ +@Data +@TenantTable +@TableName("third_party_zzd_phone_bind") +@EqualsAndHashCode(callSuper = true) +@Schema(description = "浙政钉短信核验手机号绑定") +public class ThirdPartyZzdPhoneBindEntity extends Model { + + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private Long id; + + @Schema(description = "租户ID") + private Long tenantId; + + @Schema(description = "浙政钉员工编码") + private String employeeCode; + + @Schema(description = "openid") + private String openId; + + @Schema(description = "核验手机号") + private String verifiedPhone; + + @Schema(description = "浙政钉信息快照JSON") + private String zzdProfileJson; + + @Schema(description = "删除标记") + private String delFlag; + + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建人") + private String createBy; + + @TableField(fill = FieldFill.INSERT) + @Schema(description = "创建时间") + private LocalDateTime createTime; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新人") + private String updateBy; + + @TableField(fill = FieldFill.INSERT_UPDATE) + @Schema(description = "更新时间") + private LocalDateTime updateTime; +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdPartyZzdPhoneBindMapper.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdPartyZzdPhoneBindMapper.java new file mode 100644 index 000000000..8665ac532 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/mapper/ThirdPartyZzdPhoneBindMapper.java @@ -0,0 +1,9 @@ +package com.bsd.pjcloud.thirdparty.mapper; + +import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper; +import com.bsd.pjcloud.thirdparty.entity.ThirdPartyZzdPhoneBindEntity; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ThirdPartyZzdPhoneBindMapper extends PjcloudBaseMapper { +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java index 853a4992f..8b8849c69 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java @@ -42,7 +42,6 @@ import org.springframework.web.client.HttpStatusCodeException; import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; -import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -388,27 +387,13 @@ public class ThirdPartyOAuth2Service { /** - * 获取浙政钉的token - * @param token - * @return + * 浙政钉 H5:仅通过开放平台 authCode + dingtalk_app_user 换用户信息(已移除旧网关 uabaseToken / 网关 authCode 接口)。 */ - public ZZDUserDTO zzdsso(String token) { -// String zzdToken = getZZDToken(token); - - //todo 根据是诗画还是浙政钉分别去获取不同的token - - //使用token获取当前登录人的信息(浙政钉和诗画的在一起) -// ZZDUserDTO zzdUser = getZZDUserInfo(zzdToken); - ZZDUserDTO zzdUser = getZZDUserInfo(token, UserTypeEnum.ZZD.getType(), false); - - return zzdUser; - } - public ZZDUserDTO zzdssoByAuthCode(String authCode) { if (zzdOpenPlatform.isEnabled() && zzdOpenPlatform.isAppCredentialConfigured()) { return getZzdUserByOpenPlatformAuthCode(authCode); } - return getZZDUserInfo(authCode, UserTypeEnum.ZZD.getType(), true); + throw new ThirdPartyException("浙政钉单点需配置 zzd.open.enabled 与 app-key/app-secret(开放平台企业内应用)", "ZZD_OPEN_CONFIG"); } /** @@ -577,42 +562,15 @@ public class ThirdPartyOAuth2Service { } - public String getZZDToken(String token) { - String url = baseUrl+config.getZzdTokenUrl()+token; - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity requestEntity = new HttpEntity<>(null, headers); - ResponseEntity response = restTemplate.exchange( - url, HttpMethod.POST, requestEntity, ZZDResponse.class - ); - String zzdToken = response.getBody().getData(); - return zzdToken; - } - /** - * 浙证钉和诗画工用 - * @param zzdToken - * @return + * 诗画江南 token 换用户信息(与浙政钉共用网关 {@code oauth2.client.zzd-sh-user-info-url})。 */ - public ZZDUserDTO getZZDUserInfo(String zzdToken,String type) { - return getZZDUserInfo(zzdToken, type, false); - } - - /** - * @param zzdAuthCodeFlow true 时走 oauth2.client.zzd-auth-code-user-info-url,query 为 authCode - */ - public ZZDUserDTO getZZDUserInfo(String credential, String type, boolean zzdAuthCodeFlow) { + public ZZDUserDTO getZZDUserInfo(String credential, String type) { // 构建请求URL try { - String requestPath = zzdAuthCodeFlow ? config.getZzdAuthCodeUserInfoUrl() : config.getZzdShUserInfoUrl(); - if (zzdAuthCodeFlow && !StringUtils.hasText(requestPath)) { - throw new ThirdPartyException("未配置浙政钉 authCode 换取用户:请设置 zzd.open.app-key/app-secret(开放平台)或 oauth2.client.zzd-auth-code-user-info-url(网关)", "ZZD_AUTH_CODE_CONFIG"); - } - String param = zzdAuthCodeFlow ? "authCode" : "token"; - String url = zzdAuthCodeFlow - ? baseUrl + requestPath + "?" + param + "=" + URLEncoder.encode(credential, StandardCharsets.UTF_8) - : baseUrl + requestPath + "?" + param + "=" + credential; + String requestPath = config.getZzdShUserInfoUrl(); + String url = baseUrl + requestPath + "?token=" + credential; // 获取 Bearer Token String accessToken = getAccessToken().getAccess_token(); @@ -828,7 +786,7 @@ public class ThirdPartyOAuth2Service { if (StringUtils.isEmpty(shjnToken)){ throw new RuntimeException("获取诗画江南token失败"); } - ZZDUserDTO zzdUserDTO = getZZDUserInfo(shjnToken,UserTypeEnum.SH.getType()); + ZZDUserDTO zzdUserDTO = getZZDUserInfo(shjnToken, UserTypeEnum.SH.getType()); return zzdUserDTO; } } \ No newline at end of file diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java new file mode 100644 index 000000000..016bb158d --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java @@ -0,0 +1,104 @@ +package com.bsd.pjcloud.thirdparty.service; + +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.bsd.pjcloud.thirdparty.config.ThirdPartyZzdSmsBindProperties; +import com.bsd.pjcloud.thirdparty.dto.ZZDUserDTO; +import com.bsd.pjcloud.thirdparty.dto.ZzdUserSnapshot; +import com.bsd.pjcloud.thirdparty.entity.ThirdPartyZzdPhoneBindEntity; +import com.bsd.pjcloud.thirdparty.mapper.ThirdPartyZzdPhoneBindMapper; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + +@Service +@RequiredArgsConstructor +public class ThirdPartyZzdSmsBindService { + + public static final String REDIS_BIND_SESSION_PREFIX = "thirdparty:zzd:bind:session:"; + + private final ThirdPartyZzdSmsBindProperties properties; + + private final StringRedisTemplate stringRedisTemplate; + + private final ThirdPartyZzdPhoneBindMapper thirdPartyZzdPhoneBindMapper; + + private final ObjectMapper objectMapper; + + public boolean isEnabled() { + return properties.isEnabled(); + } + + public Optional findByEmployeeCode(String employeeCode) { + if (StringUtils.isBlank(employeeCode)) { + return Optional.empty(); + } + ThirdPartyZzdPhoneBindEntity one = thirdPartyZzdPhoneBindMapper.selectOne(Wrappers.lambdaQuery() + .eq(ThirdPartyZzdPhoneBindEntity::getEmployeeCode, employeeCode) + .eq(ThirdPartyZzdPhoneBindEntity::getDelFlag, "0") + .last("limit 1")); + return Optional.ofNullable(one); + } + + public String createBindSession(ZzdUserSnapshot snapshot) throws JsonProcessingException { + String id = UUID.randomUUID().toString().replace("-", ""); + String key = REDIS_BIND_SESSION_PREFIX + id; + stringRedisTemplate.opsForValue() + .set(key, objectMapper.writeValueAsString(snapshot), properties.getBindSessionTtlMinutes(), TimeUnit.MINUTES); + return id; + } + + public ZzdUserSnapshot getBindSession(String bindSessionId) throws JsonProcessingException { + if (StringUtils.isBlank(bindSessionId)) { + return null; + } + String json = stringRedisTemplate.opsForValue().get(REDIS_BIND_SESSION_PREFIX + bindSessionId); + if (StringUtils.isBlank(json)) { + return null; + } + return objectMapper.readValue(json, ZzdUserSnapshot.class); + } + + public void removeBindSession(String bindSessionId) { + if (StringUtils.isBlank(bindSessionId)) { + return; + } + stringRedisTemplate.delete(REDIS_BIND_SESSION_PREFIX + bindSessionId); + } + + public void recordVerifiedBind(ZzdUserSnapshot snapshot, String verifiedPhone) throws JsonProcessingException { + upsertBindRecord(snapshot, verifiedPhone, objectMapper.writeValueAsString(snapshot)); + } + + public void upsertBindRecord(ZzdUserSnapshot snapshot, String verifiedPhone, String profileJson) { + ThirdPartyZzdPhoneBindEntity exist = thirdPartyZzdPhoneBindMapper.selectOne(Wrappers.lambdaQuery() + .eq(ThirdPartyZzdPhoneBindEntity::getEmployeeCode, snapshot.getEmployeeCode()) + .eq(ThirdPartyZzdPhoneBindEntity::getDelFlag, "0") + .last("limit 1")); + if (exist == null) { + ThirdPartyZzdPhoneBindEntity e = new ThirdPartyZzdPhoneBindEntity(); + e.setEmployeeCode(snapshot.getEmployeeCode()); + e.setOpenId(snapshot.getOpenid()); + e.setVerifiedPhone(verifiedPhone); + e.setZzdProfileJson(profileJson); + e.setDelFlag("0"); + thirdPartyZzdPhoneBindMapper.insert(e); + } + else { + exist.setVerifiedPhone(verifiedPhone); + exist.setOpenId(snapshot.getOpenid()); + exist.setZzdProfileJson(profileJson); + thirdPartyZzdPhoneBindMapper.updateById(exist); + } + } + + public static ZzdUserSnapshot snapshotOf(ZZDUserDTO dto) { + return ZzdUserSnapshot.from(dto); + } +} 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 8dcec131c..943125ef0 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -34,16 +34,12 @@ oauth2: dept-url: /prod-api/oauth2/apis/orguser/v1/list_sub_depts dept-users-url: /prod-api/oauth2/apis/orguser/v1/list_dept_users user_detail-url: /prod-api/oauth2/apis/orguser/v1/user_detail - # 数字政务单点接口 - zzd_token_url: /prod-api/login/szzw/ # 诗画的获取token的接口 shjn_token_url: /prod-api/login/shpj - # 浙证钉和诗画公用的获取用户信息接口 + # 诗画江南 uabaseToken 换用户信息(浙政钉单点已改走下方 zzd.open 开放平台,不再使用本 URL) zzd_sh_user_info_url: /prod-api/oauth2/apis/sso/v1/fetch_user_by_uabase_token - # 浙政钉官方免登:前端 authCode 换用户信息(按实际网关/开放平台对接后填写,留空则 authCode 登录会报错) - # zzd_auth_code_user_info_url: /prod-api/... -# 浙政钉开放平台直连(配置 app-key/app-secret 后 authCode 走 gettoken + dingtalk_app_user,无需 zzd_auth_code_user_info_url) +# 浙政钉:H5 authCode → gettoken + dingtalk_app_user(需 app-key / app-secret) zzd: open: enabled: true @@ -203,3 +199,10 @@ hikvision: # base-url: https://api.mch.weixin.qq.com # ali-pay-config: # app-id: + +# 浙政钉无手机号时:首次短信核验 + 绑定表 third_party_zzd_phone_bind,与本系统用户手机号比对后再发 token(关闭则直接按手机号/员工编码查用户并发 token) +pjcloud: + thirdparty: + zzd-sms-bind: + enabled: false + bind-session-ttl-minutes: 15 diff --git a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java index 60373b7ae..f51ef4d5a 100644 --- a/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java +++ b/pjcloud-upms/pjcloud-upms-api/src/main/java/com/bsd/pjcloud/admin/api/entity/SysUser.java @@ -267,4 +267,5 @@ public class SysUser extends Model implements Serializable { @Schema(description = "性别") private Integer gender; + } From 2636c9e0c33f4cf97ca349e61864bd17c340c584 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 20:54:20 +0800 Subject: [PATCH 05/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...mework.cloud.openfeign.FeignClient.imports | 1 + .../app/controller/AppMenuController.java | 16 +++- .../pjcloud-integrated-biz/pom.xml | 5 ++ .../controller/AppMenuOpenController.java | 73 +++++++++++++++++++ 4 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports b/pjcloud-app-server/pjcloud-app-server-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports index 2c1b7d427..dd3586702 100644 --- a/pjcloud-app-server/pjcloud-app-server-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/resources/META-INF/spring/org.springframework.cloud.openfeign.FeignClient.imports @@ -1 +1,2 @@ com.bsd.pjcloud.app.api.feign.RemoteAppUserService +com.bsd.pjcloud.app.api.feign.RemoteAppMenuService diff --git a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppMenuController.java b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppMenuController.java index cc276df23..a66f201d8 100755 --- a/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppMenuController.java +++ b/pjcloud-app-server/pjcloud-app-server-biz/src/main/java/com/bsd/pjcloud/app/controller/AppMenuController.java @@ -13,6 +13,7 @@ import com.bsd.pjcloud.app.api.entity.AppMenuEntity; import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum; import com.bsd.pjcloud.common.core.util.R; import com.bsd.pjcloud.common.log.annotation.SysLog; +import com.bsd.pjcloud.common.security.annotation.Inner; import com.bsd.pjcloud.app.service.AppMenuService; import org.springframework.security.access.prepost.PreAuthorize; import com.bsd.pjcloud.common.excel.annotation.ResponseExcel; @@ -25,7 +26,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; -import java.util.Objects; /** * 菜单管理 @@ -47,6 +47,20 @@ public class AppMenuController { @Operation(summary = "分页查询", description = "分页查询") @GetMapping("/app/list") public R> appList(@ParameterObject AppMenuDto dto) { + return listVisibleAppMenus(dto); + } + + /** + * 服务间调用:与 {@link #appList} 数据一致,需 Feign 携带内部调用头(见 {@code @NoToken} 与 {@link Inner})。 + */ + @Inner(value = true) + @Operation(summary = "内部-App菜单列表", description = "供 integrated 等经 Feign 拉取,与 /app-menu/app/list 一致") + @GetMapping("/inner/app/list") + public R> innerAppList(@ParameterObject AppMenuDto dto) { + return listVisibleAppMenus(dto); + } + + private R> listVisibleAppMenus(AppMenuDto dto) { dto.setVisible(YesNoEnum.YES.getCode()); if (ObjectUtil.isNotEmpty(dto.getPlatformEnum())) { dto.setPlatform(dto.getPlatformEnum().getType()); diff --git a/pjcloud-integrated/pjcloud-integrated-biz/pom.xml b/pjcloud-integrated/pjcloud-integrated-biz/pom.xml index c64626fdd..35a41449b 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/pom.xml +++ b/pjcloud-integrated/pjcloud-integrated-biz/pom.xml @@ -91,6 +91,11 @@ pjcloud-thirdparty-api 5.7.0 + + com.bsd + pjcloud-app-server-api + 5.7.0 + com.bsd diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java new file mode 100644 index 000000000..5148dbadd --- /dev/null +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java @@ -0,0 +1,73 @@ +package com.bsd.pjcloud.integrated.controller; + +import cn.hutool.core.util.StrUtil; +import com.bsd.pjcloud.app.api.constant.menu.AppMenuPlatformEnum; +import com.bsd.pjcloud.app.api.constant.menu.AppMenuTypeEnum; +import com.bsd.pjcloud.app.api.entity.AppMenuEntity; +import com.bsd.pjcloud.app.api.feign.RemoteAppMenuService; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.security.annotation.Inner; +import com.bsd.pjcloud.integrated.config.ExternalAppConfig; +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.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * App 端菜单:开放路径凭 X-App-Id/Secret;已登录路径与 {@code /app-menu/app/list} 数据一致,经 Feign 调 app-server(租户头随 Feign 传递)。 + */ +@RestController +@RequiredArgsConstructor +@RequestMapping("/appMenu") +@Tag(description = "appMenuOpen", name = "开放-App菜单") +@SecurityRequirement(name = HttpHeaders.AUTHORIZATION) +public class AppMenuOpenController { + + private final ExternalAppConfig externalAppConfig; + private final RemoteAppMenuService remoteAppMenuService; + + /** + * 已登录(Bearer):与 app-server GET /app-menu/app/list 一致,走 integrated 统一前缀。 + */ + @Operation(summary = "App菜单列表", description = "需登录,转发 app-server 内部菜单接口") + @GetMapping("/app/list") + public R> appList( + @RequestParam(value = "typeEnum", required = false) AppMenuTypeEnum typeEnum, + @RequestParam(value = "platformEnum", required = false) AppMenuPlatformEnum platformEnum) { + return remoteAppMenuService.innerAppList(typeEnum, platformEnum); + } + + @Operation(summary = "开放-App菜单列表", description = "凭应用凭证访问,与 app-server /app-menu/app/list 数据一致") + @GetMapping("/open/app/list") + @Inner(value = false) + public R> openAppList( + @RequestHeader(value = "X-App-Id", required = false) String appId, + @RequestHeader(value = "X-App-Secret", required = false) String appSecret, + @RequestParam(value = "typeEnum", required = false) AppMenuTypeEnum typeEnum, + @RequestParam(value = "platformEnum", required = false) AppMenuPlatformEnum platformEnum) { + if (!isValidAppCredentials(appId, appSecret)) { + return R.failed("无效的应用ID或密钥"); + } + return remoteAppMenuService.innerAppList(typeEnum, platformEnum); + } + + private boolean isValidAppCredentials(String appId, String appSecret) { + if (StrUtil.isBlank(appId) || StrUtil.isBlank(appSecret)) { + return false; + } + if (externalAppConfig.getApps() != null) { + return externalAppConfig.getApps().stream() + .filter(ExternalAppConfig.AppCredential::getEnabled) + .anyMatch(app -> appId.equals(app.getAppId()) && appSecret.equals(app.getAppSecret())); + } + return false; + } +} From 765a37f82e1455d8d17240bbbc90608474e002ff Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 21:01:08 +0800 Subject: [PATCH 06/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/api/feign/RemoteAppMenuService.java | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppMenuService.java diff --git a/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppMenuService.java b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppMenuService.java new file mode 100644 index 000000000..7b4b00d1b --- /dev/null +++ b/pjcloud-app-server/pjcloud-app-server-api/src/main/java/com/bsd/pjcloud/app/api/feign/RemoteAppMenuService.java @@ -0,0 +1,45 @@ +/* + * + * Copyright (c) 2018-2025, pjcloud All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: pjcloud + * + */ + +package com.bsd.pjcloud.app.api.feign; + +import com.bsd.pjcloud.app.api.constant.menu.AppMenuPlatformEnum; +import com.bsd.pjcloud.app.api.constant.menu.AppMenuTypeEnum; +import com.bsd.pjcloud.app.api.entity.AppMenuEntity; +import com.bsd.pjcloud.common.core.constant.ServiceNameConstants; +import com.bsd.pjcloud.common.core.util.R; +import com.bsd.pjcloud.common.feign.annotation.NoToken; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +@FeignClient(contextId = "remoteAppMenuService", value = ServiceNameConstants.APP_SERVER) +public interface RemoteAppMenuService { + + /** + * 与 AppMenuController GET /app-menu/app/list 一致,内部调用 + */ + @NoToken + @GetMapping("/app-menu/inner/app/list") + R> innerAppList( + @RequestParam(value = "typeEnum", required = false) AppMenuTypeEnum typeEnum, + @RequestParam(value = "platformEnum", required = false) AppMenuPlatformEnum platformEnum); +} From e7d9e25f5702987a6f47c82c954a1fbef5dc184f Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 23:35:43 +0800 Subject: [PATCH 07/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/bsd/pjcloud/common/core/util/R.java | 7 ++++++ .../controller/AppMenuOpenController.java | 1 + .../constant/ThirdPartyZzdBizCodes.java | 13 +++++++++++ .../controller/ThirdPartyOAth2Cotroller.java | 20 +++++++++++------ .../service/ThirdPartyZzdSmsBindService.java | 22 +++++++++++++++++++ 5 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdPartyZzdBizCodes.java diff --git a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/R.java b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/R.java index e728b7029..b743ed9da 100644 --- a/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/R.java +++ b/pjcloud-common/pjcloud-common-core/src/main/java/com/bsd/pjcloud/common/core/util/R.java @@ -81,6 +81,13 @@ public class R implements Serializable { return restResult(null, CommonConstants.FAIL, msg); } + /** + * 失败并指定业务码(非 0),便于前端区分提示(如浙政钉绑定后无系统用户)。 + */ + public static R failed(int code, String msg) { + return restResult(null, code, msg); + } + public static R failed(T data) { return restResult(data, CommonConstants.FAIL, null); } diff --git a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java index 5148dbadd..68bcd0586 100644 --- a/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java +++ b/pjcloud-integrated/pjcloud-integrated-biz/src/main/java/com/bsd/pjcloud/integrated/controller/AppMenuOpenController.java @@ -32,6 +32,7 @@ import java.util.List; public class AppMenuOpenController { private final ExternalAppConfig externalAppConfig; + private final RemoteAppMenuService remoteAppMenuService; /** diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdPartyZzdBizCodes.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdPartyZzdBizCodes.java new file mode 100644 index 000000000..fdee32a99 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/constant/ThirdPartyZzdBizCodes.java @@ -0,0 +1,13 @@ +package com.bsd.pjcloud.thirdparty.constant; + +/** + * 浙政钉单点 / 短信绑定相关前端可识别业务码(与 {@link com.bsd.pjcloud.common.core.util.R#code} 一致)。 + */ +public final class ThirdPartyZzdBizCodes { + + private ThirdPartyZzdBizCodes() { + } + + /** 短信核验通过,但 sys_user 中不存在该手机号用户 */ + public static final int SYS_USER_NOT_FOUND_FOR_ZZD_BIND = 46001; +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java index aca574839..6dec3e9fb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/controller/ThirdPartyOAth2Cotroller.java @@ -19,6 +19,8 @@ import com.bsd.pjcloud.thirdparty.dto.*; import com.bsd.pjcloud.thirdparty.service.SmsService; import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException; import com.bsd.pjcloud.thirdparty.vo.ZzdJsapiConfigVO; +import com.bsd.pjcloud.thirdparty.constant.ThirdPartyZzdBizCodes; +import com.bsd.pjcloud.thirdparty.entity.ThirdPartyZzdPhoneBindEntity; import com.bsd.pjcloud.thirdparty.service.ThirdPartyOAuth2Service; import com.bsd.pjcloud.thirdparty.service.ThirdPartyUserService; import com.bsd.pjcloud.thirdparty.service.ThirdPartyZzdSmsBindService; @@ -111,20 +113,22 @@ public class ThirdPartyOAth2Cotroller { log.warn("[zzdsso][ZZDUserDTO_JSON] 浙政钉开放平台映射后的对象,可整段复制做本地写死调试(含姓名手机号等敏感信息,调试完建议关日志或删此行) body={}", JSON.toJSONString(zzdUserDTO)); ZZDUserDTO.Ext ext = zzdUserDTO.getExt(); String employeeCode = ext != null ? ext.getEmployeeCode() : null; + String zzdOpenId = ext != null ? ext.getOpenid() : null; String mobile = zzdUserDTO.getMobile(); if (thirdPartyZzdSmsBindService.isEnabled()) { - if (StringUtils.isBlank(employeeCode)) { - return R.failed("浙政钉未返回员工编码,无法登录"); - } - var boundOpt = thirdPartyZzdSmsBindService.findByEmployeeCode(employeeCode); + var boundOpt = thirdPartyZzdSmsBindService.findBound(employeeCode, zzdOpenId); if (boundOpt.isPresent()) { - return buildZzdSsoTokenResult(employeeCode, boundOpt.get().getVerifiedPhone()); + ThirdPartyZzdPhoneBindEntity bound = boundOpt.get(); + return buildZzdSsoTokenResult(bound.getEmployeeCode(), bound.getVerifiedPhone()); } try { ZzdUserSnapshot snap = ThirdPartyZzdSmsBindService.snapshotOf(zzdUserDTO); + if (StringUtils.isBlank(snap.getEmployeeCode()) && StringUtils.isBlank(snap.getOpenid())) { + return R.failed("浙政钉未返回员工编码或 openid,无法绑定登录"); + } if (StringUtils.isBlank(snap.getEmployeeCode())) { - return R.failed("浙政钉未返回员工编码,无法登录"); + return R.failed("浙政钉未返回员工编码,无法完成首次手机号绑定,请在开放平台核对应用权限或联系管理员。"); } String bindSessionId = thirdPartyZzdSmsBindService.createBindSession(snap); HashMap need = new HashMap<>(); @@ -171,10 +175,12 @@ public class ThirdPartyOAth2Cotroller { R> byPhone = remoteUserService.getUserByMobile(dto.getMobilePhone()); List users = byPhone.getData(); if (CollectionUtils.isEmpty(users)) { - return R.failed("本系统不存在该手机号用户"); + return R.failed(ThirdPartyZzdBizCodes.SYS_USER_NOT_FOUND_FOR_ZZD_BIND, + "本系统暂无该手机号对应的用户,请联系管理员申请开通账号后再完成绑定。"); } SysUser sysUser = users.get(0); if (StringUtils.isNotBlank(sysUser.getDingtalkEmployeeCode()) + && StringUtils.isNotBlank(snap.getEmployeeCode()) && !sysUser.getDingtalkEmployeeCode().equals(snap.getEmployeeCode())) { return R.failed("浙政钉账号与本系统用户不一致"); } diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java index 016bb158d..2bc14be94 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyZzdSmsBindService.java @@ -46,6 +46,28 @@ public class ThirdPartyZzdSmsBindService { return Optional.ofNullable(one); } + public Optional findByOpenId(String openId) { + if (StringUtils.isBlank(openId)) { + return Optional.empty(); + } + ThirdPartyZzdPhoneBindEntity one = thirdPartyZzdPhoneBindMapper.selectOne(Wrappers.lambdaQuery() + .eq(ThirdPartyZzdPhoneBindEntity::getOpenId, openId) + .eq(ThirdPartyZzdPhoneBindEntity::getDelFlag, "0") + .last("limit 1")); + return Optional.ofNullable(one); + } + + /** + * 已绑定记录:优先员工编码(与库 uk 一致),再按 openid(浙政钉侧稳定标识)。 + */ + public Optional findBound(String employeeCode, String openId) { + Optional byEmp = findByEmployeeCode(employeeCode); + if (byEmp.isPresent()) { + return byEmp; + } + return findByOpenId(openId); + } + public String createBindSession(ZzdUserSnapshot snapshot) throws JsonProcessingException { String id = UUID.randomUUID().toString().replace("-", ""); String key = REDIS_BIND_SESSION_PREFIX + id; From d22f483ef83f42cf4af520dfa4221e4ccb34d394 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Fri, 8 May 2026 23:56:27 +0800 Subject: [PATCH 08/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thirdparty/config/ThirdPartyZzdSmsBindProperties.java | 4 ++-- .../pjcloud-thirdparty-biz/src/main/resources/application.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java index 9e2df8ccf..bae3018f2 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/config/ThirdPartyZzdSmsBindProperties.java @@ -11,9 +11,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties; public class ThirdPartyZzdSmsBindProperties { /** - * 是否开启(关闭时 /zzdsso 在拿到浙政钉用户后直接按手机号+员工编码查用户并发 token) + * 是否开启(关闭时 /zzdsso 在拿到浙政钉用户后直接按手机号+员工编码查用户并发 token;无手机号的新用户应开启) */ - private boolean enabled = false; + private boolean enabled = true; /** * 绑定会话在 Redis 中的有效时间(分钟) 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 943125ef0..4eb06a1d0 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/resources/application.yml @@ -200,9 +200,9 @@ hikvision: # ali-pay-config: # app-id: -# 浙政钉无手机号时:首次短信核验 + 绑定表 third_party_zzd_phone_bind,与本系统用户手机号比对后再发 token(关闭则直接按手机号/员工编码查用户并发 token) +# 浙政钉无手机号时:首次短信核验 + 绑定表 third_party_zzd_phone_bind,与本系统用户手机号比对后再发 token(关闭则直接按手机号/员工编码查用户并发 token;新用户务必为 true 才会走短信页) pjcloud: thirdparty: zzd-sms-bind: - enabled: false + enabled: true bind-session-ttl-minutes: 15 From 99944dbad3812d101a08ea6e3bf3562777b4b41b Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sat, 9 May 2026 00:14:33 +0800 Subject: [PATCH 09/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thirdparty/dto/ZzdDingtalkAppUserRaw.java | 36 ++++ .../service/ThirdPartyOAuth2Service.java | 160 +++++++++++++++--- 2 files changed, 168 insertions(+), 28 deletions(-) create mode 100644 pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdDingtalkAppUserRaw.java diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdDingtalkAppUserRaw.java b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdDingtalkAppUserRaw.java new file mode 100644 index 000000000..d9faf6137 --- /dev/null +++ b/pjcloud-thirdparty/pjcloud-thirdparty-api/src/main/java/com/bsd/pjcloud/thirdparty/dto/ZzdDingtalkAppUserRaw.java @@ -0,0 +1,36 @@ +package com.bsd.pjcloud.thirdparty.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 浙政钉开放平台 {@code /rpc/oauth2/dingtalk_app_user.json} 返回的 data 段(文档字段名与线上实际 key 可能为驼峰或下划线)。 + *

+ * 由业务层从开放平台 JSON 解析填入,再统一映射为 {@link ZZDUserDTO}。 + */ +@Data +public class ZzdDingtalkAppUserRaw implements Serializable { + + private static final long serialVersionUID = 1L; + + private String lastName; + + private String nickNameCn; + + private String mobile; + + private Integer organizationId; + + private Long accountId; + + private String account; + + private String employeeCode; + + private String openid; + + private String realmId; + + private String organizationCode; +} diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java index 8b8849c69..578f5e954 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java @@ -455,7 +455,12 @@ public class ThirdPartyOAuth2Service { req.setAuth_code(authCode); OapiRpcOauth2DingtalkAppUserJsonResponse resp = postClient.post(req); zzdAssertSdkTopSuccess(resp, "dingtalk_app_user"); - JSONObject data = zzdSdkDingtalkAppUserContentData(resp.getContent()); + String rawContent = resp.getContent(); + log.info("浙政钉 dingtalk_app_user 原始响应 content={}", rawContent); + JSONObject bodyData = zzdSdkDingtalkAppUserContentData(rawContent); + log.info("浙政钉 dingtalk_app_user 解析后(展开嵌套前) data={}", bodyData != null ? bodyData.toJSONString() : "null"); + JSONObject data = zzdUnwrapAppUserPayload(bodyData); + log.info("浙政钉 dingtalk_app_user 展开嵌套后用户 JSON={}", data != null ? data.toJSONString() : "null"); ZZDUserDTO dto = mapOpenPlatformUserToZzdDto(data); if (StringUtils.hasText(zzdOpenPlatform.getTenantId()) && dto.getExt() != null && StringUtils.hasText(dto.getExt().getRealmId()) @@ -514,49 +519,148 @@ public class ThirdPartyOAuth2Service { return content; } + /** + * 部分网关/版本将用户信息放在 {@code user} 或 {@code result} 下,与文档顶层字段不一致时先展开。 + */ + private static JSONObject zzdUnwrapAppUserPayload(JSONObject root) { + if (root == null) { + return null; + } + String[] nestedKeys = {"user", "result", "data", "body"}; + for (String nk : nestedKeys) { + Object inner = root.get(nk); + if (inner instanceof JSONObject) { + JSONObject jo = (JSONObject) inner; + if (!jo.isEmpty()) { + return jo; + } + } + } + return root; + } + + private static String zzdPickString(JSONObject o, String... keys) { + if (o == null || keys == null) { + return null; + } + for (String k : keys) { + if (k == null || !o.containsKey(k)) { + continue; + } + Object val = o.get(k); + if (val == null) { + continue; + } + if (val instanceof String) { + String s = ((String) val).trim(); + if (StringUtils.hasText(s)) { + return s; + } + } else { + String s = val.toString().trim(); + if (StringUtils.hasText(s)) { + return s; + } + } + } + return null; + } + + private static Integer zzdPickIntObject(JSONObject o, String... keys) { + if (o == null) { + return null; + } + for (String k : keys) { + if (!o.containsKey(k)) { + continue; + } + Object v = o.get(k); + if (v instanceof Number) { + return ((Number) v).intValue(); + } + if (v != null) { + try { + return Integer.parseInt(v.toString().trim()); + } catch (NumberFormatException ignored) { + } + } + } + return null; + } + + private static Long zzdPickLongObject(JSONObject o, String... keys) { + if (o == null) { + return null; + } + for (String k : keys) { + if (!o.containsKey(k)) { + continue; + } + Object v = o.get(k); + if (v instanceof Number) { + return ((Number) v).longValue(); + } + if (v != null) { + try { + return Long.parseLong(v.toString().trim()); + } catch (NumberFormatException ignored) { + } + } + } + return null; + } + + /** + * 将开放平台 data JSON 解析为实体,兼容驼峰/下划线及常见别名,再映射为 {@link ZZDUserDTO}。 + */ + private static ZzdDingtalkAppUserRaw parseZzdDingtalkAppUserRaw(JSONObject data) { + ZzdDingtalkAppUserRaw raw = new ZzdDingtalkAppUserRaw(); + raw.setLastName(zzdPickString(data, "lastName", "last_name")); + raw.setNickNameCn(zzdPickString(data, "nickNameCn", "nick_name_cn", "nickName", "nick_name")); + raw.setMobile(zzdPickString(data, "mobile", "phone", "telephone")); + raw.setOrganizationId(zzdPickIntObject(data, "organizationId", "organization_id", "orgId")); + raw.setAccountId(zzdPickLongObject(data, "accountId", "account_id", "tenantUserId", "tenant_user_id")); + raw.setAccount(zzdPickString(data, "account", "loginId", "login_id", "loginid")); + String employeeCode = zzdPickString(data, "employeeCode", "employee_code", "empId", "emp_id", "jobNumber", "job_number", "staffId", "staff_id"); + if (!StringUtils.hasText(employeeCode)) { + employeeCode = raw.getAccount(); + } + raw.setEmployeeCode(employeeCode); + raw.setOpenid(zzdPickString(data, "openid", "openId", "open_id", "id")); + raw.setRealmId(zzdPickString(data, "realmId", "realm_id")); + raw.setOrganizationCode(zzdPickString(data, "organizationCode", "organization_code", "orgCode", "org_code")); + return raw; + } + private static ZZDUserDTO mapOpenPlatformUserToZzdDto(JSONObject data) { + ZzdDingtalkAppUserRaw raw = parseZzdDingtalkAppUserRaw(data); ZZDUserDTO dto = new ZZDUserDTO(); - String lastName = data.getString("lastName"); - String nickCn = data.getString("nickNameCn"); + String lastName = raw.getLastName(); + String nickCn = raw.getNickNameCn(); dto.setUsername(lastName != null ? lastName : nickCn); dto.setNickName(lastName != null ? lastName : nickCn); - dto.setMobile(data.getString("mobile")); + dto.setMobile(raw.getMobile()); dto.setRegionCode(null); - Object orgId = data.get("organizationId"); - if (orgId instanceof Number) { - dto.setOrganizationId(((Number) orgId).intValue()); + if (raw.getOrganizationId() != null) { + dto.setOrganizationId(raw.getOrganizationId()); } else { dto.setOrganizationId(0); } - Object accountId = data.get("accountId"); int userId = 0; - if (accountId instanceof Number) { - long lv = ((Number) accountId).longValue(); + if (raw.getAccountId() != null) { + long lv = raw.getAccountId(); if (lv <= Integer.MAX_VALUE && lv >= Integer.MIN_VALUE) { userId = (int) lv; } - } else if (accountId != null) { - try { - long lv = Long.parseLong(accountId.toString()); - if (lv <= Integer.MAX_VALUE && lv >= Integer.MIN_VALUE) { - userId = (int) lv; - } - } catch (NumberFormatException ignored) { - } } dto.setUserId(userId); ZZDUserDTO.Ext ext = dto.new Ext(); - String employeeCode = data.getString("employeeCode"); - if (!StringUtils.hasText(employeeCode)) { - employeeCode = data.getString("account"); - } - ext.setEmployeeCode(employeeCode); - ext.setOrganizationCode(data.getString("organizationCode")); + ext.setEmployeeCode(raw.getEmployeeCode()); + ext.setOrganizationCode(raw.getOrganizationCode()); ext.setNickNameCn(nickCn); - ext.setOpenid(data.getString("openid")); - Object realm = data.get("realmId"); - ext.setRealmId(realm == null ? null : realm.toString()); - ext.setMobile(data.getString("mobile")); + ext.setOpenid(raw.getOpenid()); + ext.setRealmId(raw.getRealmId()); + ext.setMobile(raw.getMobile()); dto.setExt(ext); return dto; } From deb6a1d888623b46c8401011971c8076055004d6 Mon Sep 17 00:00:00 2001 From: zjf <1799650030@qq.com> Date: Sat, 9 May 2026 00:24:37 +0800 Subject: [PATCH 10/10] =?UTF-8?q?=E6=B5=99=E6=94=BF=E9=92=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/ThirdPartyOAuth2Service.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java index 578f5e954..9bbf043cb 100644 --- a/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java +++ b/pjcloud-thirdparty/pjcloud-thirdparty-biz/src/main/java/com/bsd/pjcloud/thirdparty/service/ThirdPartyOAuth2Service.java @@ -505,18 +505,29 @@ public class ThirdPartyOAuth2Service { if (!StringUtils.hasText(contentStr)) { throw new ThirdPartyException("浙政钉 dingtalk_app_user 响应无 content body", "ZZD_OPEN_BAD"); } - JSONObject content = JSON.parseObject(contentStr); - if (content == null) { + JSONObject root = JSON.parseObject(contentStr); + if (root == null) { throw new ThirdPartyException("浙政钉 dingtalk_app_user content 非 JSON", "ZZD_OPEN_BAD"); } - if (content.containsKey("success") && !content.getBooleanValue("success")) { - throw new ThirdPartyException("浙政钉 dingtalk_app_user 业务失败: " + content.getString("responseCode") + " " + content.getString("responseMessage"), "ZZD_OPEN_FAIL"); + if (root.containsKey("success") && !root.getBooleanValue("success")) { + throw new ThirdPartyException("浙政钉 dingtalk_app_user 业务失败: " + root.getString("responseCode") + " " + root.getString("responseMessage"), "ZZD_OPEN_FAIL"); } - JSONObject data = content.getJSONObject("data"); - if (data != null) { + JSONObject data = root.getJSONObject("data"); + if (data != null && !data.isEmpty()) { return data; } - return content; + JSONObject wrapped = root.getJSONObject("content"); + if (wrapped != null) { + if (wrapped.containsKey("success") && !wrapped.getBooleanValue("success")) { + throw new ThirdPartyException("浙政钉 dingtalk_app_user 业务失败: " + wrapped.getString("responseCode") + " " + wrapped.getString("responseMessage"), "ZZD_OPEN_FAIL"); + } + JSONObject inner = wrapped.getJSONObject("data"); + if (inner != null && !inner.isEmpty()) { + return inner; + } + return wrapped; + } + return root; } /** @@ -618,7 +629,7 @@ public class ThirdPartyOAuth2Service { raw.setLastName(zzdPickString(data, "lastName", "last_name")); raw.setNickNameCn(zzdPickString(data, "nickNameCn", "nick_name_cn", "nickName", "nick_name")); raw.setMobile(zzdPickString(data, "mobile", "phone", "telephone")); - raw.setOrganizationId(zzdPickIntObject(data, "organizationId", "organization_id", "orgId")); + raw.setOrganizationId(zzdPickIntObject(data, "organizationId", "organization_id", "orgId", "tenantId", "tenant_id")); raw.setAccountId(zzdPickLongObject(data, "accountId", "account_id", "tenantUserId", "tenant_user_id")); raw.setAccount(zzdPickString(data, "account", "loginId", "login_id", "loginid")); String employeeCode = zzdPickString(data, "employeeCode", "employee_code", "empId", "emp_id", "jobNumber", "job_number", "staffId", "staff_id");