signature签名创建规则
在每次请求接口时需根据参数、apikey、token临时构建出signature签名,最大程度保障接口安全性,构建规则如下;
对所有参数(除signature外)按照字段名的ASCII 码从小到大排序(字典排序)后,使用URL键值对的格式(即key1=value1&key2=value2… + token=xxx)拼接成字符串,最后再进行md5加密。字段名和字段值都采用原始值,请勿行URL转义。
举例说明:
接口A请求参数为: name、age、address
代码示例(php):
//1、准备好入参参数 $param = array( 'apikey' => 'abcdefgdswasas', 'name' => '小明', 'age' => '20' ); //2、进行自然排序 ksort($param); //3、对排序后的字典数组进行key=value拼接,得出拼接后的url字符串 apikey=abcdefgdswasas&age=20&name=小明 //4、对拼接好的参数进行加密,得出signature echo md5(http_build_query($param) . '&token=csdsdswewwewew');
PHP创建sign方法
function create_signature($data, $token)
{
ksort($data);
return md5(http_build_query($data) . '&token=' . trim($token));
}
Java代码示例
package com.wdwl.changfa;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.commons.codec.digest.DigestUtils;
public class Test {
private static String TOKEN = "SASDADSDDDFFFDGHGJHGFDVV";
public static void main(String[] args) {
Map<String, Object> params = new TreeMap<String, Object>();
params.put("apikey", "abcdefg");
params.put("name", "xiaoming");
params.put("age", "20");
Set<String> keySet = params.keySet();
Iterator<String> iter = keySet.iterator();
String kv = "";
while (iter.hasNext()) {
String key = iter.next();
kv += key+"="+params.get(key)+"&";
}
kv += "token="+TOKEN;
System.out.println("加密前:"+kv);
System.out.println("加密后:"+md5(kv));
}
public static String md5(String res){
//加密后的字符串
return DigestUtils.md5Hex(res);
}
}