Created
February 26, 2017 11:37
-
-
Save caoxudong/8071fab67185ad5e4f38aa81eb39f9f3 to your computer and use it in GitHub Desktop.
百度地图, java版计算signature签名
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package location.api.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 BaiduSNGenerator { | |
//http://api.map.baidu.com/geocoder/v2/?address=%E5%8C%97%E4%BA%AC%E5%B8%82%E4%B8%B0%E5%8F%B0%E5%8C%BA%E9%A9%AC%E5%AE%B6%E5%A0%A1%E5%9F%8E%E5%8D%97%E5%98%89%E5%9B%AD%E7%9B%8A%E5%9F%8E%E5%9B%AD14%E5%8F%B7%E6%A5%BC%E5%8D%8E%E8%81%94%E5%95%86%E5%8E%A6&output=json&ak=68fb2eef6993a628f9c165c943dd9269&sn=d130b5462bfbf2635668885f72d0b1e5 | |
public static void main(String[] args) throws UnsupportedEncodingException, NoSuchAlgorithmException { | |
BaiduSNGenerator snCal = new BaiduSNGenerator(); | |
// 计算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", "北京市丰台区凯德MALL大峡谷购物中心"); | |
paramsMap.put("output", "json"); | |
paramsMap.put("ak", "68fb2eef6993a628f9c165c943dd9269"); | |
// 调用下面的toQueryString方法,对LinkedHashMap内所有value作utf8编码,拼接返回结果address=%E7%99%BE%E5%BA%A6%E5%A4%A7%E5%8E%A6&output=json&ak=yourak | |
String 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=yourakyoursk | |
String wholeStr = new String("/geocoder/v2/?" + paramsStr + "D1d2ad69b9f5edfee4e4c4f968308ed8"); | |
// 对上面wholeStr再作utf8编码 | |
String tempStr = URLEncoder.encode(wholeStr, "UTF-8"); | |
// 调用下面的MD5方法得到最后的sn签名7de5a22212ffaa9e326444c75a58f9a0 | |
System.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; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment