admin管理员组

文章数量:821236

JAVA百度鹰眼 API 遇到的坑 APP SN校验失败

JAVA百度鹰眼 API 遇到的坑 APP SN校验失败

声明:这不是原创,只是刚好遇到,找了好久,写下来方便以后查询,代码都是复制过来的

1.总是返回sn校验失败,原因是 coords的参数有逗号,在按照官方实例时,不能处理一种参数形式,那就是参数中
不只有中文,还有其他特殊字符,比如逗号;就会导致sn错误
2.官方提供的MD5加密有问题
// An highlighted block
public static void main(String[] args) throws UnsupportedEncodingException {Map<String,String> map =new TreeMap<>();map.put("ak","yourak");//你创建的service_idmap.put("service_id","2xxxx2");map.put("fence_name","地图一");map.put("latitude","23.125585");map.put("longitude","113.354838");map.put("radius","500");map.put("coord_type","wgs84");String sk ="yoursk";String url ="?";getSn(url,map,sk);}
/*** 计算sn跟参数对出现顺序有关(参数对放入顺序必须跟请求中对应参数的出现顺序保持一致):* get请求请使用LinkedHashMap保存<key,value>,该方法根据key的插入顺序排序;* post请使用TreeMap保存<key,value>,该方法会自动将key按照字母a-z顺序排序。* 所以get请求可自定义参数顺序(sn参数必须在最后)发送请求,* 但是post请求必须按照字母a-z顺序填充body(sn参数必须在最后)。** @param url       请求路径url* @param paramsMap 请求参数对* @param sk        ak对应sk秘钥* @return sn签名* @throws UnsupportedEncodingException*/public static String getSn(String url, Map<?, ?> paramsMap, String sk) throws UnsupportedEncodingException {String paramsStr = toQueryString(paramsMap);url = url.replaceFirst("", "").trim();url = url.replaceFirst("", "").trim();System.out.println("************************Calculate Sn >>>>>url:" + url);//url在计算sn签名的时候,不管是get请求还是post请求,必须带?String wholeStr = url + paramsStr + sk;System.out.println("************************Calculate Sn >>>>>wholeStr:" + wholeStr);//对上面wholeStr再作utf8编码String tempStr = URLEncoder.encode(wholeStr, "UTF-8");System.out.println("************************Calculate Sn >>>>>tempStr:" + tempStr);//调用下面的MD5方法得到最后的sn签名String sn = MD5(tempStr);System.out.println("************************Calculate Sn >>>>>Sn:" + sn);return sn;}
public static String toQueryString(Map<?, ?> data) throws UnsupportedEncodingException {StringBuffer queryString = new StringBuffer();for (Map.Entry<?, ?> pair : data.entrySet()) {queryString.append(pair.getKey()).append("=");String ss[] = String.valueOf(pair.getValue()).split(",");if (ss.length>1){for(String s:ss){queryString.append(URLEncoder.encode(s, "UTF-8")).append(",");}queryString.deleteCharAt(queryString.length()-1);queryString.append("&");}else {queryString.append(URLEncoder.encode(String.valueOf(pair.getValue()), "UTF-8"));queryString.append("&");}}if (queryString.length() > 0) {queryString.deleteCharAt(queryString.length() - 1);}return queryString.toString();}
/*** 来自stackoverflow的MD5计算方法,调用了MessageDigest库函数,并把byte数组结果转换成16进制** @param str 要计算的字符串* @return sn*/public static String MD5(String str) {try {java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");byte[] array = md.digest(str.getBytes());StringBuffer sb = new StringBuffer();for (byte b : array) {sb.append(Integer.toHexString((b & 0xFF) | 0x100), 1, 3);}return sb.toString();} catch (java.security.NoSuchAlgorithmException ignored) {}return null;}

本文标签: JAVA百度鹰眼 API 遇到的坑APP SN校验失败