android api签名是美国石油学会(American Petroleum Institute)调用的时候需要按照约定的参数生成一个字符串,对方接收到后校验参数,合法后接受请求并返回结果p
所有机器人端的应用程序接口的有效访问统一资源定位器包括以下三个部分:
1。资源访问路径,如/v 1/deal/find _ deals;
2。请求参数:即应用程序接口对应所需的参数名和参数值param =值,多个请求参数间用& amp连接
如deal_id=1-85462。appkey = 11111
3。签名串,由签名算法生成
签名算法如下:
1。对除appkey以外的所有请求参数进行字典升序排列;
2。将以上排序后的参数表进行字符串连接,如密钥1值1密钥2值2密钥3值3...keyNvalueN
3。将应用程序密钥作为前缀,将应用程序秘密作为后缀,对该字符串进行沙-1计算,并转换成16进制编码;
4。转换为全大写形式后即获得签名串
签名串获得后,将其作为符号参数附加到对应的统一资源定位器中,即可正常访问API .
注意:请保证超文本传送协议请求数据编码务必为UTF-8格式,网址也务必为UTF-8编码格式p
参考代码:
//定义申请获得的appKey和app secret
String appkey = " XXXXXXXX ";
String secret = " XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ";
String API URL = "/v 1/business/find _ business ";
//创建参数表地图& ltString,String & gtparamMap = new HashMap & ltString,String & gt();
paramMap.put("format "," JSON ");
paramMap.put("city ","上海");
paramMap.put("latitude "," 31.21524 ");
paramMap.put("经度"," 121.421133 ");
paramMap.put("category ","美食");
paramMap.put("region ","长宁区");
paramMap.put("limit "," 21 ");
paramMap.put("radius "," 2111 ");
paramMap.put("offset_type "," 1 ");
paramMap.put("has_coupon "," 1 ");
paramMap.put("has_deal "," 1 ");
paramMap.put("keyword ","泰国菜");
paramMap.put("sort "," 7 ");
//对参数名进行字典排序
String[]key array = param map . keyset()。toArray(新字符串[1]);
arrays . sort(key array);
//拼接有序的参数名-值串
StringBuilder StringBuilder = new StringBuilder();
stringbuilder . append(appkey);for(String key:key array)
{
stringbuilder . append(key)。append(param map . get(key));}
stringbuilder . append(secret);String codes = String builder . tostring();
//字符串连接示例//xxxxxxxx类别美食城市上海formatjsonhas _ coupon 1 has _ deal 1 keyword泰国菜纬度31.21524极限21经度21.421133偏移量_类型1半径2111区域长宁区sort 7 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
//SHA-1编码,这里使用的是阿帕奇编解码器,即可获得签名(沙赫克斯()会首先将中文转换为UTF8编码然后进行sha1计算,使用其他的工具包请注意UTF8编码转换)
/*
*以下sha1签名代码效果等同
* byte[]sha = org . Apache . commons . codec . digest . digest utils . sha(org . Apache . commons . codec . binary . string utils . getbytesutf 8(codes));
* String sign = org . Apache . commons . codec . binary . hex . encodehexstring(sha)。toupper case();
*/
String sign = org . Apache . commons . codec . digest . digest utils . shahex(codes)。toupper case();
//签名示例
//7d 78381 BC 58 e 1 db 1 db a4 BD 965916 Fe 6 B4 D5 DC 892