感谢您的反馈!
如果您使用的是SDK,则生成签名对您来说是透明的。
签名算法如下,另外可以使用控制台的运维工具-签名辅助工具来协助您完成签名算法。
/** * * * @param params * 所有字符型的TOP请求参数(这个是除了sign以外的所有字段) * @param body * 请求主体内容 * @param secret * 签名密钥 * @param signMethod * 签名方法,目前支持:空(老md5)、md5, hmac_md5三种 * @return 签名 */ public static String signTopRequest(Map<String, String> params, String body, String secret, String signMethod) throws IOException { // 第一步:检查参数是否已经排序 String[] keys = params.keySet().toArray(new String[0]); Arrays.sort(keys); // 第二步:把所有参数名和参数值串在一起 StringBuilder query = new StringBuilder(); if (Constants.SIGN_METHOD_MD5.equals(signMethod)) { query.append(secret); } for (String key : keys) { String value = params.get(key); if (StringUtils.areNotEmpty(key, value)) { query.append(key).append(value); } } // 第三步:把请求主体拼接在参数后面 if (body != null) { query.append(body); } // 第四步:使用MD5/HMAC加密 byte[] bytes; if (Constants.SIGN_METHOD_HMAC.equals(signMethod)) { bytes = encryptHMAC(query.toString(), secret); } else if (Constants.SIGN_METHOD_HMAC_SHA256.equals(signMethod)) { bytes = encryptHMACSHA256(query.toString(), secret); } else { query.append(secret); bytes = encryptMD5(query.toString()); } // 第五步:把二进制转化为大写的十六进制 return byte2hex(bytes); }
为了防止接口被人乱掉用,需要在服务端做验签的逻辑,校验请求的合法性。开发者要求使用验签算法来对请求合法性进行校验。服务端验签可以使用sdk提供的工具类SpiUtils,验签失败时候返回“验签失败回应示例”的内容即可,验签逻辑如下。SDK提供有java,c#,php,C,NodeJS版本,如果您不使用SDK,可以把该工具类拷贝到工程中;如果您使用的语言没有对应的SDK版本,可以参考附录的验签算法翻译成对应的语言。