package com.ezviz.demo.common; import com.google.gson.*; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.concurrent.TimeUnit; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; public class HdlHttp { /// /// 请求地址 /// public static String RequestHttpsHost = "https://test-gz.hdlcontrol.com"; public String HeaderPrefix = "Bearer "; public static String HdlToken = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJqdGkiOiI2YTdlNzExOTAyNTQ0Y2FhOWQyMGVkMDMyNzRmNTE3OCIsInJvbGUiOiIiLCJoZWFkZXJQcmVmaXgiOiJCZWFyZXIgIiwidXNlckFjY291bnQiOiIxODgyNDg2NDE0MyIsInRlbmFudElkIjoiMjAiLCJ1c2VyVHlwZSI6IlVTRVJfQyIsInRva2VuVHlwZSI6ImFjY2Vzc190b2tlbiIsInVzZXJOYW1lIjoiTEUwMDAiLCJhcHBsaWNhdGlvbklkIjoiMCIsInVzZXJJZCI6IjEzMjg4ODYyNzMwMDM4NTU4NzQiLCJleHAiOjE2MTQ5MTM0MzksIm5iZiI6MTYxNDkwNjIzOX0.bx_z4weGI3HfehqKppM3nuegDgVOXvvKAOJFhArdhlO8pKjrnCMv-3t4xtzp8fORwGTjV_Mz4JESAicwsK0tgtkrnUonNqmSizkq2ZyaETiriZFt6333-hi-pyqNoKHTow6-rVIrJHVePOiecS1VGLND0TZ3gMR82KZHrqKmwQ4"; public String RequestResponseFromZigbeeHttps(String i_RequestName, HashMap i_pra) { byte[] result = RequestResultFromZigbeeHttps(i_RequestName, i_pra); if (result == null) { return null; } String resultData = new String(result); String code = ""; String data = ""; try { JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(resultData); JsonObject jsonObj = element.getAsJsonObject(); code = jsonObj.get("code").toString(); data = jsonObj.get("data").toString(); } catch (Exception e) { } if (code.equals("0") == false) { return null; } return data; } private byte[] CheckTokenIsTimeOut(byte[] i_result, String i_RequestName, HashMap i_pra) { if (i_result == null || i_result.length == 0 || i_result[0] != '{' || i_result[i_result.length - 1] != '}') { //以上都不是正规的json return i_result; } String resultData = new String(i_result); String code = ""; String data = ""; try { JsonParser jsonParser = new JsonParser(); JsonElement element = jsonParser.parse(resultData); JsonObject jsonObj = element.getAsJsonObject(); code = jsonObj.get("code").toString(); data = jsonObj.get("data").toString(); } catch (Exception e) { } if (code.equals("-1") || code.equals("-2")) { //系统繁忙,请稍后再试 return null; } if (code.equals("40001") || code.equals("10006") ) { return null; } return i_result; } public byte[] RequestResultFromZigbeeHttps(String i_RequestName, HashMap i_pra) { // Token=MainActivity.token; //请求Url的完成路径 String fullUrl = RequestHttpsHost + "/" + i_RequestName; OkHttpClient client = new OkHttpClient.Builder().connectTimeout(30, TimeUnit.SECONDS).build(); MediaType mediaType = MediaType.parse("application/json"); String strBody = this.GetSignRequestJson(new Gson().toJson(i_pra)); RequestBody body = RequestBody.create(mediaType, strBody); Request request = new Request.Builder().url(fullUrl).post(body) .addHeader("Content-Type", "application/json") .addHeader("authorization", HeaderPrefix + HdlToken) .addHeader("clientType", "2") .build(); try { Response response = client.newCall(request).execute(); ResponseBody responseBody = response.body(); InputStream inputStream = responseBody.byteStream(); byte[] bytes = readInputStream(inputStream); return CheckTokenIsTimeOut(bytes, i_RequestName, i_pra); } catch (Exception e) { e.printStackTrace(); return null; } } private byte[] readInputStream(InputStream inputStream) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; try { while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } byte[] data = outputStream.toByteArray(); outputStream.close(); inputStream.close(); return data; } catch (IOException e) { return null; } } /// /// appKey(访问云端固定的东西) /// private String APP_KEY = "HDL-HOME-APP-TEST"; /// /// 我也不知道这是什么鬼东西 /// private String SECRET_KEY = "WeJ8TY88vbakCcnvH8G1tDUqzLWY8yss"; /// /// 获取当前时间戳值(访问云端使用) /// /// private String GetTimestamp() { // 相差秒数 return String.valueOf(System.currentTimeMillis()); } /// /// MD5加密 /// /// /// private String SignMD5Encrypt(String s) { try { byte[] btInput = s.getBytes("utf-8"); MessageDigest mdInst = MessageDigest.getInstance("MD5"); mdInst.update(btInput); byte[] sign = mdInst.digest(); String signstr = ""; for (int i = 0; i < sign.length; i++) { String stmp = Integer.toHexString(sign[i] & 0xff); if (stmp.length() == 1) { signstr += "0" + stmp; } else { signstr += stmp; } } return signstr.toLowerCase(); } catch (IOException | NoSuchAlgorithmException e) { return null; } } /// /// 基础服务的接口都要校验sign,计算sign签名 /// /// body的数据 /// private String GetSignRequestJson(String i_BodyData) { //1. 将model实体转为Dictionary HashMap paramDictionary = new Gson().fromJson(i_BodyData, HashMap.class); //2. 计算sign if (paramDictionary != null) { paramDictionary.put("appKey", APP_KEY); paramDictionary.put("timestamp", GetTimestamp()); //2.1 字典升序 List listkey = new ArrayList(paramDictionary.keySet()); Collections.sort(listkey); //2.2 拼接按URL键值对 String str = ""; for (int i = 0; i < listkey.size(); i++) { String strkey = listkey.get(i); Object obj = paramDictionary.get(strkey); if (obj == null) { //不校验 continue; } String myValue = obj.toString(); if (myValue == "") { //空字符也不校验 continue; } if (obj.getClass() == boolean.class) { //云端那帮沙雕说bool类型必须用小写 myValue = myValue.toLowerCase(); } str += strkey + "=" + myValue + "&"; } //2.3 拼接SECRET_KEY str = str.substring(0, str.length() - 1) + SECRET_KEY; //2.4 MD5转换+转小写 String signstr = SignMD5Encrypt(str); paramDictionary.put("sign", signstr); return new Gson().toJson(paramDictionary).toString(); } else { return ""; } } }