參考地址:http://developer.baidu.com/map/index.php?title=lbscloud/api/appendix
假設ak=yourak(yourak為一個字串),在http://lbsyun.baidu.com/apiconsole/key 中配置了該ak的驗證方式是sn簽名的驗證方式,點擊下面那排星號,顯示Security Key,可以看到此ak對應的sk私密金鑰,假設sk=yoursk。
請求的url是:http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak&sn=7de5a22212ffaa9e326444c75a58f9a0
後面的sn就是要計算的,sk不需要在url裡出現,但是在計算sn的時候需要sk(假設sk=yoursk)。
下面附上Java版代碼:
package com.boonya.baidu;import java.io.UnsupportedEncodingException;import java.net.URLEncoder;import java.security.NoSuchAlgorithmException;import java.util.LinkedHashMap;import java.util.Map;import java.util.Map.Entry;//java版計算signature簽名public class SnCal{public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException{SnCal snCal = new SnCal();// 計算sn跟參數對出現順序有關,所以用LinkedHashMap儲存<key,value>,此方法適用於get請求,如果是為發送post請求的url產生簽名,請保證參數對按照key的字母順序依次放入Map。以get請求為例:http://api.map.baidu.com/geocoder/v2/?address=百度大廈&output=json&ak=yourak,paramsMap中先放入address,再放output,然後放ak,放入順序必須跟get請求中對應參數的出現順序保持一致。Map paramsMap = new LinkedHashMap<String, String>();paramsMap.put("address", "百度大廈");paramsMap.put("output", "json");paramsMap.put("ak", "yourak");// 調用下面的toQueryString方法,對LinkedHashMap內所有value作utf8編碼,拼接返回結果address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourakString paramsStr = snCal.toQueryString(paramsMap);// 對paramsStr前面拼接上/geocoder/v2/?,後面直接拼接yoursk得到/geocoder/v2/?address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourakyourskString wholeStr = new String("/geocoder/v2/?" + paramsStr + "yoursk");// 對上面wholeStr再作utf8編碼String tempStr = URLEncoder.encode(wholeStr, "UTF-8");// 調用下面的MD5方法得到最後的sn簽名7de5a22212ffaa9e326444c75a58f9a0System.out.println(snCal.MD5(tempStr));}// 對Map內所有value作utf8編碼,拼接返回結果public String toQueryString(Map<?, ?> data) throws UnsupportedEncodingException{StringBuffer queryString = new StringBuffer();for (Entry<?, ?> pair : data.entrySet()){queryString.append(pair.getKey() + "=");queryString.append(URLEncoder.encode((String) pair.getValue(), "UTF-8") + "&");}if (queryString.length() > 0){queryString.deleteCharAt(queryString.length() - 1);}return queryString.toString();}// 來自stackoverflow的MD5計算方法,調用了MessageDigest庫函數,並把byte數組結果轉換成16進位public String MD5(String md5){try{java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");byte[] array = md.digest(md5.getBytes());StringBuffer sb = new StringBuffer();for (int i = 0; i < array.length; ++i){sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1, 3));}return sb.toString();} catch (java.security.NoSuchAlgorithmException e){}return null;}}<span style="font-family:KaiTi_GB2312;font-size:12px;"></span> 另外此演算法還提供php&C#版本。