以往卡密都是电信直接提供txt文件我们这边再导入数据库中,现在电信要求厂家获取卡密必须通过接口调用,此次对接主要用到三个方面知识:
1.通过http Post请求方式将JSON数据放入body中传入,http数据交互post方式常用DefaultHttpClient(需要导入
)
1 | public static String post(String url, String content){ |
2.需要将传入的code以AES加密:
武电实业提供文档如下:
主要对传入json串中的code值进行加密(早期的对称加密方式为DES,DES被破解,又出来3DES加密算法基于DES基础之上,所以也很快被破解了,目前最为流行的为AES),博客园里有位博友的文章写的不错,大家有兴趣的可以看看: http://www.cnblogs.com/block2016/p/5596676.html
加密方法如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19public static String Encrypt(String sSrc, String sKey) throws Exception {
if (sKey == null) {
System.out.print("Key为空null");
return null;
}
// 判断Key是否为16(此处为AES 128位)
if (sKey.length() != 16) {
System.out.print("Key长度不是16");
return null;
}
byte[] raw = sKey.getBytes();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");//"算法/模式/补码方式"
IvParameterSpec iv = new IvParameterSpec("1Zja83t262AXxn13".getBytes());//使用CBC模式,需要一个向量iv,可增加加密算法的强度
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(sSrc.getBytes());
return new BASE64Encoder().encode(encrypted);//此处使用BASE64做转码功能,同时能起到2次加密的作用。
}
3.返回值的获取,通过org.json.JSONObject(需要导入json.jar)对象解析json数据(android处理json数据经常用到,我们iptv业务处理json数据是采用jackson,需要导入jackson-all-1.9.5.jar);
以下我将两种方式简单的写了出来:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34/**
* {"dataInfo":{"cardNo":"itv200085","cardPwd":"ps2000085"},"message":"","status":"0"}
* 对上面的json进行解析,获取所需要的值cardNo
*/
/**
* JSONObject方式解析json串
*/
public static String JSONObectToString(String json){
try {
JSONObject jsonObject = new JSONObject(json);
JSONObject dataInfo = jsonObject.getJSONObject("dataInfo");
String cardNo = dataInfo.getString("cardNo");
return cardNo;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
/**
* Jackson方式解析json串
*/
public static String JacksonToString(String json){
ObjectMapper mapper = new ObjectMapper();
try {
Map object = mapper.readValue(json, Map.class);
Map map = new HashMap<>();
map = (Map) object.get("dataInfo");
String cardNo = (String) map.get("cardNo");
return cardNo;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
若以上有哪些语句不对的麻烦大家及时指出,相互学习相互进步,谢谢阅读。