mirror of
https://gitee.com/durcframework/SOP.git
synced 2025-08-12 07:02:14 +08:00
优化服务端返回签名
This commit is contained in:
@@ -42,5 +42,8 @@ public class ParamNames {
|
|||||||
/** */
|
/** */
|
||||||
public static String TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
public static String TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
|
/** 返回sign名称 */
|
||||||
|
public static String RESPONSE_SIGN_NAME = "sign";
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -182,7 +182,7 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String merge(T exchange, JSONObject responseData) {
|
public String merge(T exchange, JSONObject responseData) {
|
||||||
JSONObject finalData = new JSONObject();
|
JSONObject finalData = new JSONObject(true);
|
||||||
Map<String, Object> params = this.getApiParam(exchange);
|
Map<String, Object> params = this.getApiParam(exchange);
|
||||||
String name = this.getParamValue(params, ParamNames.API_NAME, ERROR_METHOD);
|
String name = this.getParamValue(params, ParamNames.API_NAME, ERROR_METHOD);
|
||||||
ApiConfig apiConfig = ApiConfig.getInstance();
|
ApiConfig apiConfig = ApiConfig.getInstance();
|
||||||
@@ -200,9 +200,10 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
|||||||
if (apiConfig.isShowReturnSign() && !CollectionUtils.isEmpty(params)) {
|
if (apiConfig.isShowReturnSign() && !CollectionUtils.isEmpty(params)) {
|
||||||
// 添加try...catch,生成sign出错不影响结果正常返回
|
// 添加try...catch,生成sign出错不影响结果正常返回
|
||||||
try {
|
try {
|
||||||
String sign = this.createResponseSign(apiConfig, params, responseData.toJSONString());
|
String responseSignContent = this.buildResponseSignContent(responseDataNodeName, finalData);
|
||||||
|
String sign = this.createResponseSign(apiConfig, params, responseSignContent);
|
||||||
if (StringUtils.hasLength(sign)) {
|
if (StringUtils.hasLength(sign)) {
|
||||||
finalData.put(ParamNames.SIGN_NAME, sign);
|
finalData.put(ParamNames.RESPONSE_SIGN_NAME, sign);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("生成平台签名失败, params: {}, serviceResult:{}", JSON.toJSONString(params), responseData, e);
|
log.error("生成平台签名失败, params: {}, serviceResult:{}", JSON.toJSONString(params), responseData, e);
|
||||||
@@ -211,6 +212,24 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
|||||||
return finalData.toJSONString();
|
return finalData.toJSONString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取待签名内容
|
||||||
|
*
|
||||||
|
* @param rootNodeName 业务数据节点
|
||||||
|
* @param finalData 最终结果
|
||||||
|
* @return 返回待签名内容
|
||||||
|
*/
|
||||||
|
protected String buildResponseSignContent(String rootNodeName, JSONObject finalData) {
|
||||||
|
String body = finalData.toJSONString();
|
||||||
|
int indexOfRootNode = body.indexOf(rootNodeName);
|
||||||
|
if (indexOfRootNode > 0) {
|
||||||
|
int signDataStartIndex = indexOfRootNode + rootNodeName.length() + 2;
|
||||||
|
int length = body.length() - 1;
|
||||||
|
return body.substring(signDataStartIndex, length);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
protected String getParamValue(Map<String, Object> apiParam, String key, String defaultValue) {
|
protected String getParamValue(Map<String, Object> apiParam, String key, String defaultValue) {
|
||||||
return CollectionUtils.isEmpty(apiParam) ? defaultValue : (String) apiParam.getOrDefault(key, defaultValue);
|
return CollectionUtils.isEmpty(apiParam) ? defaultValue : (String) apiParam.getOrDefault(key, defaultValue);
|
||||||
}
|
}
|
||||||
@@ -221,10 +240,13 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
|||||||
*
|
*
|
||||||
* @param apiConfig 配置
|
* @param apiConfig 配置
|
||||||
* @param params 请求参数
|
* @param params 请求参数
|
||||||
* @param serviceResult 业务返回结果
|
* @param responseSignContent 待签名内容
|
||||||
* @return 返回平台生成的签名
|
* @return 返回平台生成的签名
|
||||||
*/
|
*/
|
||||||
protected String createResponseSign(ApiConfig apiConfig, Map<String, Object> params, String serviceResult) {
|
protected String createResponseSign(ApiConfig apiConfig, Map<String, Object> params, String responseSignContent) {
|
||||||
|
if (StringUtils.isEmpty(responseSignContent)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
IsvManager isvManager = apiConfig.getIsvManager();
|
IsvManager isvManager = apiConfig.getIsvManager();
|
||||||
// 根据appId获取秘钥
|
// 根据appId获取秘钥
|
||||||
String appKey = this.getParamValue(params, ParamNames.APP_KEY_NAME, "");
|
String appKey = this.getParamValue(params, ParamNames.APP_KEY_NAME, "");
|
||||||
@@ -240,7 +262,7 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
|||||||
.map(String::valueOf)
|
.map(String::valueOf)
|
||||||
.orElse(SopConstants.UTF8);
|
.orElse(SopConstants.UTF8);
|
||||||
String signType = getParamValue(params, ParamNames.SIGN_TYPE_NAME, AlipayConstants.SIGN_TYPE_RSA2);
|
String signType = getParamValue(params, ParamNames.SIGN_TYPE_NAME, AlipayConstants.SIGN_TYPE_RSA2);
|
||||||
return AlipaySignature.rsaSign(serviceResult, privateKeyPlatform, charset, signType);
|
return AlipaySignature.rsaSign(responseSignContent, privateKeyPlatform, charset, signType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
|
Reference in New Issue
Block a user