在最近的开发过程中,用到了签名方式,简单说就是在请求网络数据的时候通过md5加密上传必选的参数以及最重要的时间戳和秘钥,否则会报签名失败。这里先简单说一下时间戳和秘钥。
时间戳(time):我的博客也有到过,可以参考一下 http://blog.youkuaiyun.com/lk764265808/article/details/70915907
秘钥(sign):是后台提供给你的,但这个秘钥并不是真正的秘钥,后边会详细解析这个秘钥。
在做签名的时候,首先要把你要传的参数进行md5加密。这里我把他封装了一下,如下:
package utils;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Md5加密的工具类
*/
public class MD5Util {
//Md5加密
public static String md5(String input) throws NoSuchAlgorithmException {
String result = input;
if(input != null) {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(input.getBytes());
BigInteger hash = new BigInteger(1, md.digest());
result = hash.toString(16);
while(result.length() < 32) {
result = "0" + result;
}
}
return result;
}
}
通过调用MD5Util .md5(传入的是你需要上传的参数+时间戳+秘钥),返回的是一个32位小写的md5字符串。重点就是这个字符串才是真正的签名秘钥,后台提供给你的只是一串简单的秘钥字符串(也是很重要的)。
好了,md5(即真正的秘钥)得到了,开始请求网络数据。
OkHttpUtil.post(*上下文*, *url地址*, *map(存的是必选参数+time+sign)*);
关于秘钥着重提一下。首先上述提到的后台会给你提供一个秘钥,但并不是意味着直接通过md5加密把时间戳和秘钥一起上传请求数据就可以了,不是这样的(md5下面会提到)。简单来说通过md5加密之后返回的字符串才是真正的签名秘钥(sign通常是放到最后的),得到这个真正的签名秘钥才能和时间戳以及其他你需要的必选参数一起来请求数据,我个人用的是LinkedHashMap,把所有的参数放到map中去,去做网络请求。因为我个人这边需要对参数进行排序,故用了LinkedHashMap(Map是无序的,相信大家也都知道)。
按照这样的流程下来,就能请求正确的数据,如若报了签名失败,则证明你的参数有问题,反之成功了会返回相对应的数据。这里提供几个链接方便大家使用。
API测试工具:http://runapi.showdoc.cc/
Md5加密: http://tool.chinaz.com/tools/md5.aspx
时间戳:http://unixtime.51240.com/