签名是通过将多个参数按特定顺序拼接后进行MD5加密生成的,具体规则如下:
String reqInfo = transactionId + requestTime + APP_ID + param + SECURITY_CODE;
String sign = md5(reqInfo);
参数名 | 来源 | 说明 |
---|---|---|
transactionId | HTTP Header中的TRANSACTION-ID | 交易流水号 |
requestTime | HTTP Header中的REQ-TIME | 请求时间 |
APP_ID | 系统配置(MappingCacheFactory.getValue("APP_ID")) | 应用ID |
param | 请求参数 | GET请求时为URL中?后的参数,POST请求时为请求体内容 |
SECURITY_CODE | 系统配置(MappingCacheFactory.getValue("SECURITY_CODE")) | 安全码 |
GET请求签名生成
// GET请求示例
String url = "http://example.com/api?param1=value1¶m2=value2";
String tempGetParam = "";
if (url.indexOf("?") > 0) {
tempGetParam = url.substring(url.indexOf("?") + 1); // 获取?后的参数字符串
}
String sign = generatorSign(
httpHeaders.get(SystemConstant.HTTP_TRANSACTION_ID).get(0), // TRANSACTION-ID
httpHeaders.get(SystemConstant.HTTP_REQ_TIME).get(0), // REQ-TIME
tempGetParam // URL参数
);
POST请求签名生成
// POST请求示例
String requestBody = "{\"key1\":\"value1\",\"key2\":\"value2\"}";
String sign = generatorSign(
httpHeaders.get(SystemConstant.HTTP_TRANSACTION_ID).get(0), // TRANSACTION-ID
httpHeaders.get(SystemConstant.HTTP_REQ_TIME).get(0), // REQ-TIME
requestBody // 请求体内容
);
签名功能可通过SIGN_FLAG配置项开关("ON"开启,"OFF"关闭)
当签名功能关闭时,generatorSign方法返回空字符串
所有参数拼接时需确保顺序正确
MD5加密结果应为32位小写字符串
请求时必须包含TRANSACTION-ID和REQ-TIME这两个HTTP Header
假设:
TRANSACTION-ID = "123456"
REQ-TIME = "20230701120000"
APP_ID = "APP123"
SECURITY_CODE = "SECRET123"
GET参数 = "name=test&age=20"
则签名生成过程:
reqInfo = "123456" + "20230701120000" + "APP123" + "name=test&age=20" + "SECRET123"
= "12345620230701120000APP123name=test&age=20SECRET123"
sign = md5("12345620230701120000APP123name=test&age=20SECRET123")
最终签名值为MD5加密后的32位小写字符串。