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