栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通用API接口签名算法(参考淘宝)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通用API接口签名算法(参考淘宝)

java接口签名算法 java接口签名算法
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Map;

public class SignUtil {


    public static final String SIGN_METHOD_MD5 = "md5";
    public static final String SIGN_METHOD_HMAC = "hmac";
    private static final String CHARSET_UTF8 = "utf-8";


    
    public static String signTopRequest(Map params, String secret, String signMethod) throws IOException {
 // 第一步:检查参数是否已经排序
 String[] keys = params.keySet().toArray(new String[0]);
 Arrays.sort(keys);

 // 第二步:把所有参数名和参数值串在一起
 StringBuilder query = new StringBuilder();
 if (SIGN_METHOD_MD5.equals(signMethod)) {
     query.append(secret);
 }
 for (String key : keys) {
     String value = params.get(key);
     if (isNotEmpty(key) && isNotEmpty(value)) {
  query.append(key).append(value);
     }
 }

 // 第三步:使用MD5/HMAC加密
 byte[] bytes;
 if (SIGN_METHOD_HMAC.equals(signMethod)) {
     bytes = encryptHMAC(query.toString(), secret);
 } else {
     query.append(secret);
     bytes = encryptMD5(query.toString());
 }

 // 第四步:把二进制转化为大写的十六进制
 return byte2hex(bytes);
    }

    
    private static byte[] encryptHMAC(String data, String secret) throws IOException {
 byte[] bytes = null;
 try {
     SecretKey secretKey = new SecretKeySpec(secret.getBytes(CHARSET_UTF8), "HmacMD5");
     Mac mac = Mac.getInstance(secretKey.getAlgorithm());
     mac.init(secretKey);
     bytes = mac.doFinal(data.getBytes(CHARSET_UTF8));
 } catch (GeneralSecurityException gse) {
     throw new IOException(gse.toString());
 }
 return bytes;
    }

    
    private static byte[] encryptMD5(String data) throws IOException {
 return encryptMD5(data.getBytes(CHARSET_UTF8));
    }

    
    private static byte[] encryptMD5(byte[] data) throws IOException {
 byte[] bytes = null;
 try {
     MessageDigest md = MessageDigest.getInstance("MD5");
     bytes = md.digest(data);
 } catch (GeneralSecurityException gse) {
     throw new IOException(gse.toString());
 }
 return bytes;
    }

    
    private static String byte2hex(byte[] bytes) {
 StringBuilder sign = new StringBuilder();
 for (int i = 0; i < bytes.length; i++) {
     String hex = Integer.toHexString(bytes[i] & 0xFF);
     if (hex.length() == 1) {
  sign.append("0");
     }
     sign.append(hex.toUpperCase());
 }
 return sign.toString();
    }

    private static boolean isNotEmpty(String value) {
 int strLen;
 if (value == null || (strLen = value.length()) == 0) {
     return false;
 }
 for (int i = 0; i < strLen; i++) {
     if ((Character.isWhitespace(value.charAt(i)) == false)) {
  return true;
     }
 }
 return false;
    }
    public static void main(String[] args) throws Exception {
		Map params = new HashMap();
		// 公共参数
		params.put("method", "taobao.item.seller.get");
		params.put("app_key", appKey);
		params.put("session", sessionKey);
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		params.put("timestamp", df.format(new Date()));
		params.put("format", "json");
		params.put("v", "2.0");
		params.put("sign_method", "hmac");
		// 业务参数
		params.put("fields", "num_iid,title,nick,price,num");
		params.put("num_iid", "123456789");
		// 签名参数
		params.put("sign", signTopRequest(params, appSecret, SIGN_METHOD_HMAC));
	}
}
Javascript接口签名算法

内容转自 :https://blog.kfzsy.com/api-sign.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/236786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号