Merge branch 'master' of https://gitea.zianxin.com/zax/biz-api-cloud
This commit is contained in:
commit
0925f01b54
25 files changed
+334
-168
No files matched your search
+1
@@ -15,6 +15,7 @@ public enum AppMenuPlatformEnum {
|
||||
|
||||
WECHAT("10", "微信小程序"),
|
||||
ZZD("30", "浙政钉"),
|
||||
SHPJ("40", "诗画浦江"),
|
||||
;
|
||||
|
||||
private final String type;
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
+3
-3
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
+3
-3
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
server:
|
||||
port: 8848
|
||||
port: 18848
|
||||
tomcat:
|
||||
basedir: logs
|
||||
error:
|
||||
include-message: always
|
||||
db:
|
||||
num: 1
|
||||
user: ${MYSQL_USER:root}
|
||||
password: ${MYSQL_PWD:bsd.1799}
|
||||
user: ${MYSQL_USER:pjcloudx}
|
||||
password: :Bsd#1799}
|
||||
url:
|
||||
0: jdbc:mysql://${MYSQL_HOST:pjcloud-mysql}:${MYSQL_PORT:2881}/${MYSQL_DB:pjcloudx_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
|
||||
0: jdbc:mysql://${MYSQL_HOST:rm-1fyg92tzhbt23g9hw.mysql.rds.inner.jhszwy.net}:${MYSQL_PORT:3306}/${MYSQL_DB:pjcloudx_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
|
||||
pool:
|
||||
config:
|
||||
connectionTimeout: 30000
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
server:
|
||||
port: 18848
|
||||
tomcat:
|
||||
basedir: logs
|
||||
error:
|
||||
include-message: always
|
||||
db:
|
||||
num: 1
|
||||
user: ${MYSQL_USER:pjcloudx_config}
|
||||
password: ${MYSQL_PWD:Bsd#1799}
|
||||
url:
|
||||
0: jdbc:mysql://${MYSQL_HOST:rm-1fyg92tzhbt23g9hw.mysql.rds.inner.jhszwy.net}:${MYSQL_PORT:3306}/${MYSQL_DB:pjcloudx_config}?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true
|
||||
pool:
|
||||
config:
|
||||
connectionTimeout: 30000
|
||||
validationTimeout: 10000
|
||||
|
||||
nacos:
|
||||
core:
|
||||
auth:
|
||||
server:
|
||||
identity:
|
||||
key: serverIdentity
|
||||
value: security
|
||||
system.type: nacos
|
||||
plugin.nacos.token.secret.key: SecretKey012345678901234567890123456789012345678901234567890123456789
|
||||
security:
|
||||
ignore:
|
||||
urls: /actuator/**,/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
web:
|
||||
exposure:
|
||||
include: '*'
|
||||
metrics:
|
||||
export:
|
||||
influx:
|
||||
enabled: false
|
||||
elastic:
|
||||
enabled: false
|
||||
@@ -1,5 +1,5 @@
|
||||
server:
|
||||
port: 8848
|
||||
port: 18848
|
||||
tomcat:
|
||||
basedir: logs
|
||||
error:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ import lombok.Data;
|
||||
|
||||
/**
|
||||
* 第三方 SSO 在本服务内的统一用户视图(非开放平台原始报文体)。
|
||||
* 浙政钉:由 {@code dingtalk_app_user} 等适配层填入;诗画:由网关用户信息接口填入。
|
||||
* 浙政钉:由 {@code dingtalk_app_user} 等适配层填入;诗画:由本系统直连诗画开放接口填入。
|
||||
* 后续业务(发 token、短信绑定快照等)只依赖本结构,与走网关还是走开放平台无关。
|
||||
*/
|
||||
@Data
|
||||
|
||||
+1
-6
@@ -24,12 +24,7 @@ public class OAuth2ClientConfig {
|
||||
|
||||
|
||||
/**
|
||||
* 诗画江南的token接口
|
||||
*/
|
||||
private String shjnTokenUrl;
|
||||
|
||||
/**
|
||||
* 诗画江南 uabaseToken 换用户信息(网关 GET ?token=)
|
||||
* 诗画江南 uabaseToken 换用户信息(诗画已直连,保留字段兼容旧配置)
|
||||
*/
|
||||
private String zzdShUserInfoUrl;
|
||||
|
||||
|
||||
+25
-107
@@ -24,6 +24,8 @@ 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.shpj.ShpjOpenapiUser;
|
||||
import com.bsd.pjcloud.thirdparty.shpj.ShpjUserClient;
|
||||
import com.bsd.pjcloud.thirdparty.vo.ZzdJsapiConfigVO;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -34,7 +36,6 @@ import org.springframework.http.*;
|
||||
import org.springframework.scheduling.annotation.Async;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
import org.springframework.util.DigestUtils;
|
||||
import org.springframework.util.LinkedMultiValueMap;
|
||||
import org.springframework.util.MultiValueMap;
|
||||
import org.springframework.util.StringUtils;
|
||||
@@ -42,7 +43,6 @@ import org.springframework.web.client.HttpStatusCodeException;
|
||||
import org.springframework.web.client.ResourceAccessException;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@@ -85,6 +85,8 @@ public class ThirdPartyOAuth2Service {
|
||||
|
||||
private final ZzdOpenPlatformExecutableClientHolder zzdExecutableClientHolder;
|
||||
|
||||
private final ShpjUserClient shpjUserClient;
|
||||
|
||||
|
||||
public TokenDTO getAccessToken() {
|
||||
TokenDTO cachedToken = tokenCache.get("access_token");
|
||||
@@ -736,102 +738,6 @@ public class ThirdPartyOAuth2Service {
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 诗画江南的请求token
|
||||
* @param accountId
|
||||
* @param sessionId
|
||||
* @return
|
||||
*/
|
||||
|
||||
public String getSHJNToken(String accountId,String sessionId){
|
||||
// 构建请求URL
|
||||
String url = baseUrl + config.getShjnTokenUrl()+"?accountId=" + accountId + "&sessionId=" + sessionId;
|
||||
|
||||
ResponseEntity<ApiResponse<String>> response = restTemplate.exchange(
|
||||
url, HttpMethod.POST, null, new ParameterizedTypeReference<ApiResponse<String>>() {}
|
||||
);
|
||||
return response.getBody().getData();
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public String getUserDetails(String accountId, String sessionId, String connectNo, String appkey, String appsecret) {
|
||||
String timestamp = System.currentTimeMillis() + "";
|
||||
String noncestr = timestamp;
|
||||
|
||||
// 构造请求参数
|
||||
Map<String, String> params = new HashMap<>();
|
||||
params.put("connectNo", connectNo);
|
||||
params.put("sessionId", sessionId);
|
||||
// 签名生成
|
||||
String signature = generateSignature(timestamp, appkey, appsecret, noncestr, params);
|
||||
params.put("signature", signature);
|
||||
params.put("timestamp", timestamp);
|
||||
params.put("appkey", appkey);
|
||||
params.put("noncestr", noncestr);
|
||||
|
||||
// 构造 URL
|
||||
String url = String.format("https://vcms.tmuyun.com/openapi/v2/%s/detail?%s", accountId, mapToUrl(params));
|
||||
|
||||
// 构造请求头
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Content-Type", "application/json");
|
||||
|
||||
// 构造请求实体
|
||||
HttpEntity<String> entity = new HttpEntity<>(headers);
|
||||
|
||||
// 发起请求
|
||||
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
|
||||
|
||||
// 返回响应体
|
||||
return response.getBody();
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成签名
|
||||
*/
|
||||
private String generateSignature(String timestamp, String appkey, String appsecret, String noncestr, Map<String, String> params) {
|
||||
// 移除不需要参与签名的字段
|
||||
params.remove("appkey");
|
||||
params.remove("timestamp");
|
||||
params.remove("noncestr");
|
||||
params.remove("signature");
|
||||
|
||||
// 参数名按照ASCII码表升序排序
|
||||
String[] keys = params.keySet().toArray(new String[0]);
|
||||
Arrays.sort(keys);
|
||||
|
||||
// 按照排序拼接参数值
|
||||
StringBuilder paramBuffer = new StringBuilder();
|
||||
for (String key : keys) {
|
||||
String value = params.get(key);
|
||||
if (StringUtils.hasLength(value) && !"0".equals(value)) {
|
||||
paramBuffer.append("&&").append(value);
|
||||
}
|
||||
}
|
||||
|
||||
// 拼接最终签名串
|
||||
String rawSignature = String.format("%s&&%s&&%s&&%s", timestamp, appkey, appsecret, noncestr) + paramBuffer.toString();
|
||||
return DigestUtils.md5DigestAsHex(rawSignature.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
/**
|
||||
* 将Map转换为URL参数字符串
|
||||
*/
|
||||
private String mapToUrl(Map<String, String> map) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for (Map.Entry<String, String> entry : map.entrySet()) {
|
||||
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
|
||||
}
|
||||
if (sb.length() > 0) {
|
||||
sb.deleteCharAt(sb.length() - 1);
|
||||
}
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 政务钉钉 H5 JSAPI 鉴权:前端 {@code dd.authConfig({ ticket, jsApiList })}。
|
||||
* 官方 SDK:{@code IntelligentGetClient /get_jsapi_token.json},请求体带应用 {@code accessToken},解析 {@code content.data.accessToken} 为 ticket。
|
||||
@@ -891,17 +797,29 @@ public class ThirdPartyOAuth2Service {
|
||||
}
|
||||
|
||||
/**
|
||||
* 诗画
|
||||
* @param accountId
|
||||
* @param sessionId
|
||||
* @return
|
||||
* 诗画浦江单点:直连诗画开放接口获取用户,不再经对方 /login/shpj 中转
|
||||
*/
|
||||
public ZZDUserDTO shjnsso(String accountId, String sessionId) {
|
||||
String shjnToken = getSHJNToken(accountId, sessionId);
|
||||
if (StringUtils.isEmpty(shjnToken)){
|
||||
throw new RuntimeException("获取诗画江南token失败");
|
||||
ShpjOpenapiUser openapiUser = shpjUserClient.getUserInfo(accountId, sessionId);
|
||||
if (openapiUser == null || openapiUser.getIsLogin() != 1) {
|
||||
throw new ThirdPartyException("请先登录诗画客户端", "SHPJ_NOT_LOGIN");
|
||||
}
|
||||
ZZDUserDTO zzdUserDTO = getZZDUserInfo(shjnToken, UserTypeEnum.SH.getType());
|
||||
return zzdUserDTO;
|
||||
if (!StringUtils.hasText(openapiUser.getMobile())) {
|
||||
throw new ThirdPartyException("诗画用户手机号为空", "SHPJ_MOBILE_EMPTY");
|
||||
}
|
||||
return mapShpjOpenapiUserToZzdDto(openapiUser);
|
||||
}
|
||||
|
||||
private static ZZDUserDTO mapShpjOpenapiUserToZzdDto(ShpjOpenapiUser user) {
|
||||
ZZDUserDTO dto = new ZZDUserDTO();
|
||||
dto.setUsername(user.getNickName());
|
||||
dto.setNickName(user.getNickName());
|
||||
dto.setMobile(user.getMobile());
|
||||
ZZDUserDTO.Ext ext = dto.new Ext();
|
||||
ext.setNickNameCn(user.getNickName());
|
||||
ext.setMobile(user.getMobile());
|
||||
ext.setHeadImgUrl(user.getHeadImgUrl());
|
||||
dto.setExt(ext);
|
||||
return dto;
|
||||
}
|
||||
}
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
package com.bsd.pjcloud.thirdparty.shpj;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class ShpjApiWrapper<T> {
|
||||
|
||||
private int code;
|
||||
|
||||
private T data;
|
||||
|
||||
private String message;
|
||||
|
||||
public boolean isSuccessful() {
|
||||
return code == 0;
|
||||
}
|
||||
}
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
package com.bsd.pjcloud.thirdparty.shpj;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* 诗画浦江开放接口用户信息(对齐对方 OpenapiUser)
|
||||
*/
|
||||
@Data
|
||||
@JsonIgnoreProperties(ignoreUnknown = true)
|
||||
public class ShpjOpenapiUser {
|
||||
|
||||
private int is_faceVerify;
|
||||
|
||||
private String city;
|
||||
|
||||
private String nickName;
|
||||
|
||||
private boolean forbidden;
|
||||
|
||||
private String mobile;
|
||||
|
||||
private String deviceId;
|
||||
|
||||
private boolean freezed;
|
||||
|
||||
private String accountId;
|
||||
|
||||
private int isLogin;
|
||||
|
||||
private String createdAt;
|
||||
|
||||
private String headImgUrl;
|
||||
|
||||
private String clientCode;
|
||||
|
||||
private String recentActiveTime;
|
||||
|
||||
private int grade;
|
||||
|
||||
private String refCode;
|
||||
}
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
package com.bsd.pjcloud.thirdparty.shpj;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 诗画浦江开放接口配置(直连 vcms,不经对方中转服务)
|
||||
*/
|
||||
@Data
|
||||
@Component
|
||||
@ConfigurationProperties(prefix = "pjcloud.shpj")
|
||||
public class ShpjProperties {
|
||||
|
||||
private String appKey;
|
||||
|
||||
private String appSecret;
|
||||
|
||||
private String connectNo;
|
||||
|
||||
private String baseUrl = "https://vcms.tmuyun.com";
|
||||
|
||||
private int httpTimeoutSeconds = 5;
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
package com.bsd.pjcloud.thirdparty.shpj;
|
||||
|
||||
import org.springframework.util.DigestUtils;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.util.Arrays;
|
||||
import java.util.Map;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* 诗画浦江签名:timestamp&&appkey&&appsecret&&noncestr&¶mValues
|
||||
*/
|
||||
public final class ShpjSignHelper {
|
||||
|
||||
private ShpjSignHelper() {
|
||||
}
|
||||
|
||||
public static String sign(Map<String, String> businessParams, String timestamp, String appKey, String appSecret, String nonce) {
|
||||
String raw = String.format("%s&&%s&&%s&&%s", timestamp, appKey, appSecret, nonce) + extraSign(businessParams);
|
||||
return DigestUtils.md5DigestAsHex(raw.getBytes(StandardCharsets.UTF_8));
|
||||
}
|
||||
|
||||
private static String extraSign(Map<String, String> paramsMap) {
|
||||
SortedMap<String, String> resMap = new TreeMap<>(paramsMap);
|
||||
String[] keys = resMap.keySet().toArray(new String[0]);
|
||||
Arrays.sort(keys);
|
||||
StringBuilder paramBuffer = new StringBuilder();
|
||||
for (String key : keys) {
|
||||
String value = resMap.get(key);
|
||||
if (StringUtils.hasLength(value) && !"0".equals(value)) {
|
||||
paramBuffer.append("&&").append(value);
|
||||
}
|
||||
}
|
||||
return paramBuffer.toString();
|
||||
}
|
||||
}
|
||||
+85
@@ -0,0 +1,85 @@
|
||||
package com.bsd.pjcloud.thirdparty.shpj;
|
||||
|
||||
import cn.hutool.http.HttpRequest;
|
||||
import cn.hutool.http.HttpResponse;
|
||||
import com.bsd.pjcloud.thirdparty.exception.ThirdPartyException;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.util.StringUtils;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* 诗画浦江用户开放接口客户端(直连)
|
||||
*/
|
||||
@Slf4j
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class ShpjUserClient {
|
||||
|
||||
private final ShpjProperties properties;
|
||||
|
||||
private final ObjectMapper objectMapper;
|
||||
|
||||
/**
|
||||
* 按 accountId + sessionId 查询诗画用户详情
|
||||
*/
|
||||
public ShpjOpenapiUser getUserInfo(String accountId, String sessionId) {
|
||||
if (!StringUtils.hasText(accountId) || "-1".equals(accountId)) {
|
||||
throw new ThirdPartyException("请先登录诗画客户端", "SHPJ_NOT_LOGIN");
|
||||
}
|
||||
if (!StringUtils.hasText(sessionId)) {
|
||||
throw new ThirdPartyException("sessionId不能为空", "SHPJ_SESSION_EMPTY");
|
||||
}
|
||||
if (!StringUtils.hasText(properties.getAppKey()) || !StringUtils.hasText(properties.getAppSecret())
|
||||
|| !StringUtils.hasText(properties.getConnectNo())) {
|
||||
throw new ThirdPartyException("诗画浦江开放接口未配置", "SHPJ_CFG");
|
||||
}
|
||||
|
||||
String timestamp = String.valueOf(System.currentTimeMillis());
|
||||
String nonce = timestamp + "shpj";
|
||||
|
||||
Map<String, String> businessParams = new HashMap<>(2);
|
||||
businessParams.put("sessionId", sessionId);
|
||||
businessParams.put("connectNo", properties.getConnectNo());
|
||||
|
||||
Map<String, Object> form = new HashMap<>();
|
||||
form.put("appkey", properties.getAppKey());
|
||||
form.put("noncestr", nonce);
|
||||
form.put("timestamp", timestamp);
|
||||
form.put("signature", ShpjSignHelper.sign(businessParams, timestamp, properties.getAppKey(), properties.getAppSecret(), nonce));
|
||||
form.putAll(businessParams);
|
||||
|
||||
String apiUrl = "/openapi/v2/" + accountId + "/detail";
|
||||
String fullUrl = properties.getBaseUrl() + apiUrl;
|
||||
log.info("调用诗画浦江接口[{}]开始, accountId={}, sessionId={}", apiUrl, accountId, sessionId);
|
||||
|
||||
try (HttpResponse httpResponse = HttpRequest.get(fullUrl)
|
||||
.timeout(properties.getHttpTimeoutSeconds() * 1000)
|
||||
.form(form)
|
||||
.execute()) {
|
||||
String body = httpResponse.body();
|
||||
if (!httpResponse.isOk()) {
|
||||
log.error("诗画浦江接口[{}]HTTP错误:{} - {}", apiUrl, httpResponse.getStatus(), body);
|
||||
throw new ThirdPartyException("诗画浦江接口调用失败", "SHPJ_HTTP");
|
||||
}
|
||||
log.info("诗画浦江接口[{}]完成, 返回:{}", apiUrl, body);
|
||||
|
||||
ShpjApiWrapper<ShpjOpenapiUser> resp = objectMapper.readValue(body,
|
||||
objectMapper.getTypeFactory().constructParametricType(ShpjApiWrapper.class, ShpjOpenapiUser.class));
|
||||
if (!resp.isSuccessful()) {
|
||||
log.error("诗画浦江接口[{}]业务失败: [{}-{}]", apiUrl, resp.getCode(), resp.getMessage());
|
||||
throw new ThirdPartyException("诗画浦江接口调用失败:" + resp.getMessage(), "SHPJ_BIZ_" + resp.getCode());
|
||||
}
|
||||
return resp.getData();
|
||||
} catch (ThirdPartyException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
log.error("诗画浦江接口[{}]异常", apiUrl, e);
|
||||
throw new ThirdPartyException("诗画浦江服务暂时不可用", "SHPJ_ERROR");
|
||||
}
|
||||
}
|
||||
}
|
||||
+18
-13
@@ -6,11 +6,11 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
# server-addr: pjcloud-register:8848
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
@@ -34,11 +34,23 @@ 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
|
||||
# 诗画的获取token的接口
|
||||
shjn_token_url: /prod-api/login/shpj
|
||||
# 诗画江南 uabaseToken 换用户信息(浙政钉单点已改走下方 zzd.open 开放平台,不再使用本 URL)
|
||||
# 诗画江南 uabaseToken 换用户信息(已废弃:诗画改为本系统直连 vcms;浙政钉单点已改走下方 zzd.open)
|
||||
zzd_sh_user_info_url: /prod-api/oauth2/apis/sso/v1/fetch_user_by_uabase_token
|
||||
|
||||
# 诗画浦江开放接口(直连 https://vcms.tmuyun.com,不经对方 /login/shpj)
|
||||
# 浙政钉无手机号时:首次短信核验 + 绑定表 third_party_zzd_phone_bind
|
||||
pjcloud:
|
||||
shpj:
|
||||
app-key: ${SHPJ_APP_KEY:rQZzIvB7beaeZBf2IbQnemYv}
|
||||
app-secret: ${SHPJ_APP_SECRET:4d248cd64bc5653fd2c1d6bb425b2817}
|
||||
connect-no: ${SHPJ_CONNECT_NO:afb7e8fbf5f4eb9f}
|
||||
base-url: ${SHPJ_BASE_URL:https://vcms.tmuyun.com}
|
||||
http-timeout-seconds: 5
|
||||
thirdparty:
|
||||
zzd-sms-bind:
|
||||
enabled: true
|
||||
bind-session-ttl-minutes: 15
|
||||
|
||||
# 浙政钉:H5 authCode → gettoken + dingtalk_app_user(需 app-key / app-secret)
|
||||
zzd:
|
||||
open:
|
||||
@@ -199,10 +211,3 @@ hikvision:
|
||||
# base-url: https://api.mch.weixin.qq.com
|
||||
# ali-pay-config:
|
||||
# app-id:
|
||||
|
||||
# 浙政钉无手机号时:首次短信核验 + 绑定表 third_party_zzd_phone_bind,与本系统用户手机号比对后再发 token(关闭则直接按手机号/员工编码查用户并发 token;新用户务必为 true 才会走短信页)
|
||||
pjcloud:
|
||||
thirdparty:
|
||||
zzd-sms-bind:
|
||||
enabled: true
|
||||
bind-session-ttl-minutes: 15
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
@@ -6,10 +6,10 @@ spring:
|
||||
name: @artifactId@
|
||||
cloud:
|
||||
nacos:
|
||||
username: @nacos.username@
|
||||
password: @nacos.password@
|
||||
username: nacos
|
||||
password: Aa@bsd.321
|
||||
discovery:
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:8848}
|
||||
server-addr: ${NACOS_HOST:pjcloud-register}:${NACOS_PORT:18849}
|
||||
config:
|
||||
server-addr: ${spring.cloud.nacos.discovery.server-addr}
|
||||
config:
|
||||
|
||||
Reference in new issue
Block a user