加签原理
- 获取接口传参的所有请求参数,剔除 sign 字段;
- 按照请求参数的第一个字符键值 ASCII 码递增排序(字母升序排序),如果遇到相同字符则按照第二个字符的键值 ASCII 码递增排序,以此类推;
- 将排序后的参数与其对应值,组合成 参数=参数值 的格式,并且把这些参数用 & 字符连接起来,此时生成的字符串为待签名字符串。
- 使用应用创建时生成的私钥对待签名字符串进行私钥签名,生成sign。
- 服务端通过应用的公钥验证sign内容是否合法。
操作指导
1. 请求参数
示例
accessToken=t7n18z0bzp&beginTime=tfw12utz1u&endTime=48yrrznjfb&namespace=xxydsjlb_jbxxb&page=98&size=21&ssjg=tqj4ajef0g&ssry=vmigycbzmt&xtsbh=s99osfw62e
参数说明
配置参数 | 描述 | 示例 |
---|---|---|
accessToken | 应用access_token | 通过获取接口调用授权码获取 |
namespace | 请求的主题库名称 | xxydsjlb_jbxxb |
2. 应用私钥
开发者需通过应用私钥加密,获取方式为:开发平台-开发者后台-应用编辑-查看密钥
3. 字符集
RSA 签名支持字符集 UTF-8
4. 签名方式
使用RSA通过私钥加密
5. 签名生成步骤
1. 获得请求参数
beginTime=tfw12utz1u&endTime=48yrrznjfb&page=98&size=21&ssjg=tqj4ajef0g&ssry=vmigycbzmt&xtsbh=s99osfw62e=
2. 添加accessToken和namespace
beginTime=tfw12utz1u&endTime=48yrrznjfb&page=98&size=21&ssjg=tqj4ajef0g&ssry=vmigycbzmt&xtsbh=s99osfw62e=&namespace=xxydsjlb_jbxxb&accessToken=15e309ab-7484-4da4-87c4-a0ee5d37bece732217883533
3. 排序并去除空格
accessToken=15e309ab-7484-4da4-87c4-a0ee5d37bece732217883533&beginTime=tfw12utz1u&endTime=48yrrznjfb&namespace=xxydsjlb_jbxxb&page=98&size=21&ssjg=tqj4ajef0g&ssry=vmigycbzmt&xtsbh=s99osfw62e
4. 通过应用私钥加密获得签名
JLtBRw2ErzQ/LA5DUw6BaiHvu2lGWLKtwYpLa1pnog0VamCRI/b2/gfM2iBV3qe9DtnxdlBrG2XLQUCAzNIWvWh6SZBvTohRtD58owpYZUX5zwaTri/Uy8nFGESL+j5eGjGTxM8k2pCFQJS/Nl5gmHZyDYhBD8axJMKaySm0B09enykWBE+XwqucH+4J6nr0HTUQxI2M+k9Z+LTeDKXACgCmkZOYYw2xQ8BYR0iiZ5DGytFvyYDkWN7VCa4c2EfQR61t79hMFHxQkNnrotnh1HlsLKQhBFnjiZulcj/fhShNVpmUWrTx2px71AZ9onIivF65W/RMoObBDLf56/9XnA==
5. urlencode
JLtBRw2ErzQ%2FLA5DUw6BaiHvu2lGWLKtwYpLa1pnog0VamCRI%2Fb2%2FgfM2iBV3qe9DtnxdlBrG2XLQUCAzNIWvWh6SZBvTohRtD58owpYZUX5zwaTri%2FUy8nFGESL%2Bj5eGjGTxM8k2pCFQJS%2FNl5gmHZyDYhBD8axJMKaySm0B09enykWBE%2BXwqucH%2B4J6nr0HTUQxI2M%2Bk9Z%2BLTeDKXACgCmkZOYYw2xQ8BYR0iiZ5DGytFvyYDkWN7VCa4c2EfQR61t79hMFHxQkNnrotnh1HlsLKQhBFnjiZulcj%2FfhShNVpmUWrTx2px71AZ9onIivF65W%2FRMoObBDLf56%2F9XnA%3D%3D
6. 拼接到请求参数
https://tianyin-dw-test-gateway.iclass.cn/apis-dbus/theme/get/xxydsjlb_jbxxb/?accessToken=15e309ab-7484-4da4-87c4-a0ee5d37bece732217883533&sign=JLtBRw2ErzQ%2FLA5DUw6BaiHvu2lGWLKtwYpLa1pnog0VamCRI%2Fb2%2FgfM2iBV3qe9DtnxdlBrG2XLQUCAzNIWvWh6SZBvTohRtD58owpYZUX5zwaTri%2FUy8nFGESL%2Bj5eGjGTxM8k2pCFQJS%2FNl5gmHZyDYhBD8axJMKaySm0B09enykWBE%2BXwqucH%2B4J6nr0HTUQxI2M%2Bk9Z%2BLTeDKXACgCmkZOYYw2xQ8BYR0iiZ5DGytFvyYDkWN7VCa4c2EfQR61t79hMFHxQkNnrotnh1HlsLKQhBFnjiZulcj%2FfhShNVpmUWrTx2px71AZ9onIivF65W%2FRMoObBDLf56%2F9XnA%3D%3D&beginTime=tfw12utz1u&endTime=48yrrznjfb&page=98&size=21&ssjg=tqj4ajef0g&ssry=vmigycbzmt&xtsbh=s99osfw62e=
代码示例
public static void main(String[] args) {
String accessToken = accessToken();
Map<String,Object> params=new HashMap<>();
params.put("page",1);
params.put("size",10);
params.put("accessToken",accessToken);
params.put("namespace","DW_xkxx_jzgjbsj");
sign(params);
}
public static String sign( Map<String,Object> params) {
String result =getMapStr(params);
RSA rsa = new RSA(private_key, public_key);
byte[] encrypt = rsa.encrypt(result, KeyType.PrivateKey);
String sign = URLEncoder.encode(Base64Encoder.encode(encrypt));
System.out.println("获取sign:" + sign);
return sign;
}
private static String getMapStr(Map<String, Object> paramsMap) {
paramsMap.remove("sign");
List<String> params = new ArrayList<String>();
for (Map.Entry<String, Object> entry : paramsMap.entrySet()) {
params.add(entry.getKey() + "=" + entry.getValue() );
}
Collections.sort(params);
return CollUtil.join(params, "&");
}
作者:admin 创建时间:2022-10-25 10:37
最后编辑:admin 更新时间:2022-10-25 10:38
最后编辑:admin 更新时间:2022-10-25 10:38