接口验签

一。般使用的签名算法

  1. 将所有参数(sign除外)按照参数名的字母顺序排序,并用&连接: app_id=1235123121&app_poi_code=31&timestamp=1389751221
  2. 按照请求url + ? + 排序后的参数 + secretKey的顺序进行连接,得到加密前的字符串: http:/test.com/api/v1/poi/mget?app_id=1235123121&app_poi_codes=31&timestamp=1389751221d31ba58fd73c71db697ab5e4946d52d

  3. 对加密前的字符串进行MD5加密,得到签名:00934d00d0aea6f12161edfb6456143d
  4. 将得到的签名赋给sign作为请求参数:http://test.com/api/v1/poi/mget?app_poi_codes=31&app_id=1235123121& timestamp=1389751221&sign=00934d00d0aea6f12161edfb6456143d

二。验签,使用签名算法计算出sign,然后和调用方传过来的比对,不一样就是验签失败,非法请求

 

三。签名代码

private static final String SIGN = "sig";

private static final String MD5 = "MD5";

private static final String CHARSET_NAME = "utf-8";


/**
 *
 * @param:  * @param baseUrl
 * @return: java.lang.String
 * @throws: ApiSysException
 */
public static String genSig(String url,Map<String, Object> params,String secret,boolean isDecode) {

    String baseUrl = appendUrlAndParamsAndSecret(url, params, secret);
    if (isDecode){
        try {
            baseUrl = URLDecoder.decode(baseUrl, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }
    return DigestUtils.md5DigestAsHex(baseUrl.getBytes());

}
/**
 * 排序参数列表
 * @param params
 * @return
 */
private static String sortParams(Map<String, Object> params) {
    // 自然排序
    Set<String> sortedParams = new TreeSet<String>();
    sortedParams.addAll(params.keySet());

    StringBuilder strB = new StringBuilder();
    // 排除sign和空值参数
    for (String key : sortedParams) {
        if (key.equalsIgnoreCase(SIGN)) {
            continue;
        }
        if (params.get(key) == null){
           continue;
        }
        String value = params.get(key).toString();
        if (value != null) {
            strB.append(key)
                    .append("=")
                    .append(value)
                    .append("&");
        }
    }
    String str = strB.toString();
    if (!StringUtils.isEmpty(str)) {
        str = str.substring(0, str.length() - 1);
    }

    return str;
}


private static String appendUrlAndParamsAndSecret(String url, Map<String, Object> params, String secret) {
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(url)
            .append("?")
            .append(sortParams(params))
            .append(secret);
    return stringBuilder.toString();
}
posted @ 2021-09-26 08:56  qiushui  阅读(573)  评论(0)    收藏  举报