这个可咋弄啊
API名称
签名(sign)生成逻辑
请求方式
GET
数据格式
JSON
使用状态
正在使用
入参
1、将除了sign参数以外的参数按照字典序升序进行排列,按照keyvalue顺序进行拼接,得到的拼接结果首尾拼接秘钥(请求接口时用接口秘钥,回传订单验签时用回调秘钥)
2、将步骤1得到的字符串进行md5,得到的结果即为sign
出参 无
秘钥:123456
我应该得出签名结果啊?
public static String genSign(TreeMap params) {
if (params.containsKey("sign"))
params.remove("sign");
}
String str = "";
str += SECRET;
for (String key : params.keySet()) {
str += key + params.get(key);
}
str += SECRET;
String sign = md5(str);
return sign;
}
public static String md5(String source) {
String md5Result = null;
try {
byte[] hash = org.apache.commons.codec.binary.StringUtils.getBytesUtf8(source);
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(hash);
hash = messageDigest.digest();
md5Result = Hex.encodeHexString(hash);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return md5Result;
}
例如你的参数是
{
“key1”:"value1",
"key2":"value2",
"key3":"value3"
}
密钥:123456
需要签名的字符串就是:123456key1value1key2value2key3value3123456,再进行MD5加密得到sign
最终你请求的参数就是
{
“key1”:"value1",
"key2":"value2",
"key3":"value3",
“sign”:"签名后的值"
}
服务端接收到参数后也会对参数进行签名计算,再和你的签名做对比
直接拿去用吧
/**
* 签名
* @param params 需要签名的参数,TreeMap 会自带排序功能
* @return
* @throws Exception
*/
public static String paramsSign(TreeMap<String,String> params,String appkey) throws Exception{
if(params.containsKey("sign")) {//签名明文组装不包含sign字段
params.remove("sign");
}
params.put("key", appkey);
StringBuilder sb = new StringBuilder();
for(Map.Entry<String, String> entry:params.entrySet()){
if(entry.getValue()!=null&&entry.getValue().length()>0){
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
if(sb.length()>0){
sb.deleteCharAt(sb.length()-1);
}
String sign = md5(sb.toString().getBytes("UTF-8"));//记得是md5编码的加签
params.remove("key");
return sign;
}
/**
* md5
* @param b
* @return
*/
public static String md5(byte[] b) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(b);
byte[] hash = md.digest();
StringBuffer outStrBuf = new StringBuffer(32);
for (int i = 0; i < hash.length; i++) {
int v = hash[i] & 0xFF;
if (v < 16) {
outStrBuf.append('0');
}
outStrBuf.append(Integer.toString(v, 16).toLowerCase());
}
return outStrBuf.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return new String(b);
}
}
之前看错了,以为你要签名方法。直接调用genSign方法获得签名,把签名当成一个参数传过去给api就行了。