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";
|
||||
|
||||
/** 返回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) {
|
||||
JSONObject finalData = new JSONObject();
|
||||
JSONObject finalData = new JSONObject(true);
|
||||
Map<String, Object> params = this.getApiParam(exchange);
|
||||
String name = this.getParamValue(params, ParamNames.API_NAME, ERROR_METHOD);
|
||||
ApiConfig apiConfig = ApiConfig.getInstance();
|
||||
@@ -200,9 +200,10 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
||||
if (apiConfig.isShowReturnSign() && !CollectionUtils.isEmpty(params)) {
|
||||
// 添加try...catch,生成sign出错不影响结果正常返回
|
||||
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)) {
|
||||
finalData.put(ParamNames.SIGN_NAME, sign);
|
||||
finalData.put(ParamNames.RESPONSE_SIGN_NAME, sign);
|
||||
}
|
||||
} catch (Exception 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();
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取待签名内容
|
||||
*
|
||||
* @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) {
|
||||
return CollectionUtils.isEmpty(apiParam) ? defaultValue : (String) apiParam.getOrDefault(key, defaultValue);
|
||||
}
|
||||
@@ -219,12 +238,15 @@ public abstract class BaseExecutorAdapter<T, R> implements ResultExecutor<T, R>
|
||||
/**
|
||||
* 这里需要使用平台的私钥生成一个sign,需要配置两套公私钥。
|
||||
*
|
||||
* @param apiConfig 配置
|
||||
* @param params 请求参数
|
||||
* @param serviceResult 业务返回结果
|
||||
* @param apiConfig 配置
|
||||
* @param params 请求参数
|
||||
* @param responseSignContent 待签名内容
|
||||
* @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();
|
||||
// 根据appId获取秘钥
|
||||
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)
|
||||
.orElse(SopConstants.UTF8);
|
||||
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
|
||||
|
Reference in New Issue
Block a user