HMacSHA256签名方式
一:HMacSHA256的代码:
package com.huatech.httpapi.common.util;
import com.huatech.httpapi.business.i001.entity.comm.AccessTokenobject;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* String传参的HMacSHA256
*/
public class HMacSHA256 {
private static String Encrypt(String message, String secret) {
String hash = "";
try {
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(message.getBytes());
hash = byteArrayToHexString(bytes);
System.out.println(hash);
} catch (Exception e) {
System.out.println("Error HmacSHA256 ===========" + e.getMessage());
}
return hash;
}
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b!=null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1)
hs.append('0');
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
二:httpClient请求:
/**
* @Description: TODO
* @author: scott
* @date: 2020年08月14日 15:29
*/
package com.huatech.httpapi.common.util;
import com.huatech.httpapi.business.i001.entity.comm.AccessTokenobject;
import com.huatech.httpapi.business.i001.entity.comm.PublicRequestobject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* 是根据当前业务在httpclient的衍生出来的新的
*/
public class HttpHelper {
public static String HttpPostWithJson(String url, String json) {
String returnValue = "这是默认返回值,接口调用失败";
CloseableHttpClient httpClient = HttpClients.createDefault();
ResponseHandler<String> responseHandler = new BasicResponseHandler();
try{
//第一步:创建HttpClient对象
httpClient = HttpClients.createDefault();
//第二步:创建httpPost对象
HttpPost httpPost = new HttpPost(url);
//第三步:给httpPost设置JSON格式的参数
StringEntity requestEntity = new StringEntity(json,"UTF-8");
requestEntity.setContentEncoding("UTF-8");
httpPost.setHeader("Content-type", "application/json; charset=utf-8");
httpPost.setEntity(requestEntity);
//第四步:发送HttpPost请求,获取返回值
HttpResponse response = httpClient.execute(httpPost);
//处理请求中文乱码的解决方案
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instreams = entity.getContent();
String str = convertStreamToString(instreams);
httpPost.abort();
return str;
}
}
catch(Exception e)
{
e.printStackTrace();
}
finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
//第五步:处理返回值
return returnValue;
}
//处理请求中文乱码的解决方法
private static String convertStreamToString(InputStream is) {
StringBuilder sb1 = new StringBuilder();
byte[] bytes = new byte[4096];
int size = 0;
try {
while ((size = is.read(bytes)) > 0) {
String str = new String(bytes, 0, size, "UTF-8");
sb1.append(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb1.toString();
}
//测试51接口的参数
public static void main(String[] args) throws Exception {
HMacSHA256 aMacSHA256 = new HMacSHA256();
Class cls=Class.forName("com.huatech.httpapi.common.util.HMacSHA256");
String url ="https://digi.aisino.com/accessToken/v1.0/get";
PublicRequestobject p = new PublicRequestobject();
p.setInterfaceCode("51.formatfile.build");
p.setSpanId("");
p.setDatagram("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");
p.setZipCode("0");
p.setEncryptCode("2");
// p.setSignature();
p.setAccess_token("c35756480b5c6a542d7ea0a0065d56ce2643c56012ba71201311a3c208ed5050");
}
}
三:测试申请身份令牌:
public static void main(String[] args) { String url ="https://digi.aisino.com/accessToken/v1.0/get"; AccessTokenobject atko = new AccessTokenobject(); atko.setUserName("HLJTEST1"); atko.setTaxpayerId("500102191212027426"); atko.setTerminalId("1"); atko.setSigntype("HMacSHA256"); atko.setAuthorizationCode(HMacSHA256.Encrypt("Y4SKNBXECE","53244473").toUpperCase()); atko.setTimestamp(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()).toString()); atko.setSignature(HMacSHA256.Encrypt(atko.getUserName()+atko.getTaxpayerId()+atko.getTerminalId()+atko.getSigntype()+atko.getAuthorizationCode()+atko.getTimestamp(),"53244473").toUpperCase()); //调用接口请求身份令牌 String s = HttpHelper.HttpPostWithJson(url, JsonUtils.object2Json(atko)); System.out.println(s);
四:JSON处理工具类
import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import org.jdom.Document; import org.jdom.Element; import org.jdom.input.SAXBuilder; import org.jdom.output.XMLOutputter; import com.fasterxml.jackson.databind.ObjectMapper; public class JsonUtils { public static int PRETTY_PRINT_INDENT_FACTOR = 4; /** * <p> * 对象转JSON字符串 * </p> * */ public static String object2Json(Object obj) { String result = null; try { ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.writeValueAsString(obj); } catch (IOException e) { e.printStackTrace(); } return result; } /** * <p> * JSON字符串转Map对象 * </p> * */ public static Map<?, ?> jsonToMap(String json) { return json2Object(json, Map.class); } /** * <p> * JSON转Object对象 * </p> * @author xul * */ public static <T> T json2Object(String json, Class<T> cls) { T result = null; try { ObjectMapper objectMapper = new ObjectMapper(); result = objectMapper.readValue(json, cls); } catch (IOException e) { e.printStackTrace(); } return result; } /** * <p> * </p> * @author xul * @version V1.0 */ public static <T> T conveterObject(Object srcObject, Class<T> destObjectType) { String jsonContent = object2Json(srcObject); return json2Object(jsonContent, destObjectType); } /** * <p> * xml转json * </p> * @author xul * @version V1.0 */ public static String xmlToJSON(String xml) { JSONObject obj = new JSONObject(); try { InputStream is = new ByteArrayInputStream(xml.getBytes("utf-8")); SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(is); Element root = doc.getRootElement(); Map map=iterateElement(root); obj.put(root.getName(),map); return obj.toString(); } catch (Exception e) { e.printStackTrace(); return null; } } /** * <p> * json转xml * </p> * @author xul * @version V1.0 * @date 2018年05月03日 下午17:26:02 * @param obj * @return */ public static String JsonToXml(Object json) { if(json==null){ return null; }else{ Element elements=new Element("return"); getXMLFromObject(json,"return",elements); XMLOutputter xmlOut = new XMLOutputter(); String res=xmlOut.outputString(elements); return res; } } private static Map iterateElement(Element root) { List childrenList = root.getChildren(); Element element = null; Map map = new HashMap(); List list = null; for (int i = 0; i < childrenList.size(); i++) { list = new ArrayList(); element = (Element) childrenList.get(i); if(element.getChildren().size()>0){ if(root.getChildren(element.getName()).size()>1){ if (map.containsKey(element.getName())) { list = (List) map.get(element.getName()); } list.add(iterateElement(element)); map.put(element.getName(), list); }else{ map.put(element.getName(), iterateElement(element)); } }else { if(root.getChildren(element.getName()).size()>1){ if (map.containsKey(element.getName())) { list = (List) map.get(element.getName()); } list.add(element.getTextTrim()); map.put(element.getName(), list); }else{ map.put(element.getName(), element.getTextTrim()); } } } return map; } private static void getXMLFromObject(Object obj,String tag,Element parent) { if(obj==null) return; Element child; String eleStr; Object childValue; if(obj instanceof JSONObject) { JSONObject jsonObject=(JSONObject)obj; for(Object temp:jsonObject.keySet()) { eleStr=temp.toString(); childValue=jsonObject.get(temp); child=new Element(eleStr); if(childValue instanceof JSONArray) getXMLFromObject(childValue,eleStr,parent); else{ parent.addContent(child); getXMLFromObject(childValue,eleStr,child); } } }else if(obj instanceof JSONArray){ JSONArray jsonArray=(JSONArray)obj; for(int i=0;i<jsonArray.size();i++) { childValue=jsonArray.get(i); child=new Element(tag); parent.addContent(child); getXMLFromObject(childValue,tag,child); } }else if(obj instanceof Date){ SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); parent.setText(sf.format((Date)obj)); }else{ parent.setText(obj.toString()); } } }