From c87b797fa3cc827c4ccd22ad3156e6da27bed252 Mon Sep 17 00:00:00 2001 From: tanghc Date: Tue, 9 Jul 2019 16:50:56 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=9C=8D=E5=8A=A1=E7=AB=AF?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=AD=BE=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sop/gatewaycommon/param/ParamNames.java | 3 ++ .../result/BaseExecutorAdapter.java | 38 +++++++++++++++---- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/param/ParamNames.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/param/ParamNames.java index 5d5e0928..5167423e 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/param/ParamNames.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/param/ParamNames.java @@ -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"; + } diff --git a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java index bc4b22f7..c2340712 100644 --- a/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java +++ b/sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/result/BaseExecutorAdapter.java @@ -182,7 +182,7 @@ public abstract class BaseExecutorAdapter implements ResultExecutor } public String merge(T exchange, JSONObject responseData) { - JSONObject finalData = new JSONObject(); + JSONObject finalData = new JSONObject(true); Map 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 implements ResultExecutor 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 implements ResultExecutor 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 apiParam, String key, String defaultValue) { return CollectionUtils.isEmpty(apiParam) ? defaultValue : (String) apiParam.getOrDefault(key, defaultValue); } @@ -219,12 +238,15 @@ public abstract class BaseExecutorAdapter implements ResultExecutor /** * 这里需要使用平台的私钥生成一个sign,需要配置两套公私钥。 * - * @param apiConfig 配置 - * @param params 请求参数 - * @param serviceResult 业务返回结果 + * @param apiConfig 配置 + * @param params 请求参数 + * @param responseSignContent 待签名内容 * @return 返回平台生成的签名 */ - protected String createResponseSign(ApiConfig apiConfig, Map params, String serviceResult) { + protected String createResponseSign(ApiConfig apiConfig, Map 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 implements ResultExecutor .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