當前位置:成語大全網 - 新華字典 - android api 簽名是什麽意思

android api 簽名是什麽意思

android api 簽名是api調用的時候需要按照約定的參數生成壹個字符串,對方接收到後校驗參數,合法後接受請求並返回結果。

所有android端的API的有效訪問URL包括以下三個部分:

1. 資源訪問路徑,如/v1/deal/find_deals;

2. 請求參數:即API對應所需的參數名和參數值param=value,多個請求參數間用&連接

如deal_id=1-85462&appkey=00000;

3. 簽名串,由簽名算法生成

簽名算法如下:

1. 對除appkey以外的所有請求參數進行字典升序排列;

2. 將以上排序後的參數表進行字符串連接,如key1value1key2value2key3value3...keyNvalueN;

3. 將app key作為前綴,將app secret作為後綴,對該字符串進行SHA-1計算,並轉換成16進制編碼;

4. 轉換為全大寫形式後即獲得簽名串

簽名串獲得後,將其作為sign參數附加到對應的URL中,即可正常訪問API。

註意:請保證HTTP請求數據編碼務必為UTF-8格式,URL也務必為UTF-8編碼格式。

參考代碼:

// 定義申請獲得的appKey和appSecret

String appkey = "XXXXXXXX";

String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";

String apiUrl = "/v1/business/find_businesses";

// 創建參數表

Map<String, String> paramMap = new HashMap<String, String>();

paramMap.put("format", "json");

paramMap.put("city", "上海");

paramMap.put("latitude", "31.21524");

paramMap.put("longitude", "121.420033");

paramMap.put("category", "美食");

paramMap.put("region", "長寧區");

paramMap.put("limit", "20");

paramMap.put("radius", "2000");

paramMap.put("offset_type", "0");

paramMap.put("has_coupon", "1");

paramMap.put("has_deal", "1");

paramMap.put("keyword", "泰國菜");

paramMap.put("sort", "7");

// 對參數名進行字典排序

String[] keyArray = paramMap.keySet().toArray(new String[0]);

Arrays.sort(keyArray);

// 拼接有序的參數名-值串

StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append(appkey);

for (String key : keyArray)

{

stringBuilder.append(key).append(paramMap.get(key));

}

stringBuilder.append(secret);

String codes = stringBuilder.toString();

// 字符串連接示例

// XXXXXXXXcategory美食city上海formatjsonhas_coupon1has_deal1keyword泰國菜latitude31.21524limit20longitude121.420033offset_type0radius2000region長寧區sort7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

// SHA-1編碼, 這裏使用的是Apache codec,即可獲得簽名(shaHex()會首先將中文轉換為UTF8編碼然後進行sha1計算,使用其他的工具包請註意UTF8編碼轉換)

/*

* 以下sha1簽名代碼效果等同

* byte[] sha = org.apache.commons.codec.digest.DigestUtils.sha(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(codes));

* String sign = org.apache.commons.codec.binary.Hex.encodeHexString(sha).toUpperCase();

*/

String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();

//簽名示例

//7D78381BC58E1DB1DBA4BD965916FE6B4D5DC892