最近更新時間:2022-03-22
第一步:將Signature外其他的所有請求參數封裝成一個json,參數名作為json的key,參數值作為該key的value,比如要訪問的路徑為(Signature的值已經給出): http://api.unicloud.com/product?Action=GetRegion&ProductCode=VM&AccessKeyId=0E9vFY4xL4PvaDil&Signature=dKvipmrF27bAkLldtHjx1bQFl1c%3D, Signature外的請求參數有三個: 1.Action=GetRegion, 2.ProductCode=VM, 3.AccessKeyId=0E9vFY4xL4PvaDil,則封裝json的偽代碼為: json.put("Action","GetRegion"); json.put("ProductCode","VM"); json.put("AccessKeyId","0E9vFY4xL4PvaDil"); 第二步:以json和您的access_secret作為參數,使用簽名生成工具類生成簽名:Signature=dKvipmrF27bAkLldtHjx1bQFl1c%3D,拼接上訪問即可。 |
package com.unicloud.framework.transaction.utils; import com.alibaba.fastjson.JSONObject; import com.google.common.base.Joiner; import org.apache.commons.codec.binary.Base64; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.List; import java.util.stream.Collectors; /** * @Desc 簽名生成工具類 * @Version 1.0 */ public class GenerateSignatureTool { private static String ak = "Xnt0niaAeiz1t1Ly"; private static String sk = "rngdawvIVJBOu0g2FI08LbJayvnO3j"; public static void main(String[] args) throws Exception{ // 查詢計費方式 JSONObject params = new JSONObject(); params.put("Action","GetProductPaymentList"); params.put("RegionId","cn-beijing"); params.put("ProductCode","VM"); params.put("AccessKeyId", ak); System.out.println(generateSignature(params, sk)); } /** * 生成簽名 * * @param params * @param sk * @return * @throws Exception */ public static String generateSignature(JSONObject params, String sk) throws Exception{ List<String> keyValueList = params.keySet().stream().map(key -> key + "=" + encode(params.get(key))).map(GenerateSignatureTool::encode).sorted().collect(Collectors.toList()); String formatQueryString = Joiner.on("%26").join(keyValueList); String stringToSign = Joiner.on("&").join("GET", URLEncoder.encode("/", "utf-8"), formatQueryString); String hmac = HmacSHA1Encrypt(stringToSign, sk + "&"); return new StringBuilder("Signature=").append(encode(hmac)).toString(); } private static String HmacSHA1Encrypt(String encryptText, String encryptKey) throws Exception { SecretKey secretKey = new SecretKeySpec(encryptKey.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(secretKey); byte[] rawHmac = mac.doFinal(encryptText.getBytes()); return new String(Base64.encodeBase64(rawHmac)); } private static String encode(Object s) { try { return s != null ? URLEncoder.encode(String.valueOf(s), "UTF-8").replace("+", "%20") .replace("*", "%2A").replace("%7E", "~") : null; } catch (UnsupportedEncodingException e) { e.printStackTrace(); return ""; } } } |