所有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