signature签名创建规则说明


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