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); } }