91 lines
3.0 KiB
Java
91 lines
3.0 KiB
Java
package com.engine.salary.util;
|
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.commons.codec.binary.Base64;
|
|
|
|
import javax.crypto.Mac;
|
|
import javax.crypto.spec.SecretKeySpec;
|
|
import java.net.URLEncoder;
|
|
import java.security.InvalidKeyException;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.security.SignatureException;
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.TreeMap;
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* @author jie.zhou
|
|
* @version 1.0
|
|
* @date 2021/1/14 15:27
|
|
*/
|
|
@Slf4j
|
|
public class SingnatureData {
|
|
|
|
/**
|
|
* 初始化延签头信息(GET)
|
|
*
|
|
* @param param
|
|
* @param appKey
|
|
* @param appSecret
|
|
* @return
|
|
*/
|
|
public static Map<String, String> initHeader(Map<String, String> param, String appKey, String appSecret) {
|
|
String version = "1.0.0";
|
|
long timestamp = System.currentTimeMillis();
|
|
String nonce = UUID.randomUUID().toString().replace("-", "");
|
|
Map<String, String> head = new HashMap<String, String>();
|
|
if (param != null && param.size() > 0) head.putAll(param);
|
|
head.put("version", version);
|
|
head.put("timestamp", Long.toString(timestamp));//TimeStamp
|
|
head.put("appKey", appKey);//accessKeyID
|
|
head.put("xReqNonce", nonce);//SignatureNonce
|
|
String signature = getSign(head, appSecret, "UTF-8");
|
|
head.put("signature", signature.trim());
|
|
return head;
|
|
}
|
|
|
|
/***
|
|
* 获取签名
|
|
* @param params
|
|
* @param appSecret
|
|
* @param encoding
|
|
* @return
|
|
*/
|
|
public static String getSign(Map<String, String> params, String appSecret, String encoding) {
|
|
TreeMap<String, String> treeMap = new TreeMap<>();
|
|
treeMap.put("appSecret", appSecret);
|
|
|
|
for (Map.Entry<String, String> entry : params.entrySet()) {
|
|
treeMap.put(entry.getKey(), entry.getValue().toString());
|
|
}
|
|
StringBuilder builder = new StringBuilder();
|
|
for (Object parameter : treeMap.values()) {
|
|
if (parameter != null) {
|
|
builder.append(parameter.toString());
|
|
}
|
|
}
|
|
String signStr = null;
|
|
try {
|
|
signStr = sign(URLEncoder.encode(builder.toString(), encoding), appSecret);
|
|
} catch (Exception e) {
|
|
log.error("获取签名失败", e);
|
|
}
|
|
return signStr;
|
|
}
|
|
|
|
public static String sign(String data, String appSecret) throws SignatureException {
|
|
try {
|
|
Mac mac = Mac.getInstance("HmacSHA256");
|
|
SecretKeySpec signingKey = new SecretKeySpec(appSecret.getBytes(), "HmacSHA256");
|
|
mac.init(signingKey);
|
|
byte[] signData = mac.doFinal(data.getBytes());
|
|
return Base64.encodeBase64String(signData);
|
|
} catch (NoSuchAlgorithmException e) {
|
|
throw new SignatureException("平台不支持" + "HMAC_SHA256" + "摘要方式");
|
|
} catch (InvalidKeyException e) {
|
|
throw new SignatureException("Speicified access secret is not valid.");
|
|
}
|
|
}
|
|
}
|