package com.zy.nc;
|
|
|
import com.alibaba.excel.util.StringUtils;
|
import com.alibaba.fastjson.JSONObject;
|
import com.core.common.Cools;
|
import com.zy.nc.util.*;
|
|
import java.io.*;
|
import java.net.HttpURLConnection;
|
import java.net.URL;
|
import java.net.URLEncoder;
|
import java.nio.charset.Charset;
|
import java.util.HashMap;
|
import java.util.Map;
|
import java.util.Properties;
|
|
/**
|
* 1.从resources/config.properties中读取测试api相关的数据 2.运行程序,测试查看测试结果
|
*
|
* @author lizhmf
|
* @date 2019年6月20日上午10:53:11
|
*/
|
public class Test {
|
|
// app_secret
|
private static String client_secret = null;
|
// 公钥
|
private static String pubKey = null;
|
// app_id
|
private static String client_id = null;
|
// ncc用户名
|
private static String username = null;
|
private static String usercode = null;
|
// ncc用户名密码
|
private static String pwd = null;
|
// ncc账套
|
private static String busi_center = null;
|
private static String dsname = null;
|
// 获取token方式:client_credentials、password
|
private static String grant_type = null;
|
// 服务器ip:port
|
private static String baseUrl = null;
|
// 返回值压缩加密级别
|
private static String secret_level = null;
|
// 请求参数
|
private static String requestBody = null;
|
// openapi请求路径
|
private static String apiUrl = null;
|
|
// 访问api获取到的access_token
|
public static String token = null;
|
// 重复调用检查
|
public static String repeat_check = null;
|
// 接口调用业务标识
|
public static String busi_id = null;
|
|
/**
|
* 启动入口
|
*
|
* @param args
|
*/
|
public static void main(String[] args) {
|
try {
|
// // 初始化数据
|
init();
|
// // 请求token
|
if (token == null) {
|
token = getToken();
|
}
|
System.out.println("getTokenData:" + token);
|
// 测试openapi
|
testApi(token);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
|
/**
|
* 获取access_token
|
*
|
* @return
|
* @throws Exception
|
*/
|
private static String getToken() throws Exception {
|
String token = null;
|
if ("password".equals(grant_type)) {
|
// 密码模式
|
token = getTokenByPWD();
|
} else if ("client_credentials".equals(grant_type)) {
|
// 客户端模式
|
token = getTokenByClient();
|
}
|
return token;
|
}
|
|
/**
|
* 客户端模式获取token
|
*
|
* @return
|
* @throws Exception
|
*/
|
private static String getTokenByClient() throws Exception {
|
Map<String, String> paramMap = new HashMap<String, String>();
|
// 密码模式认证
|
paramMap.put("grant_type", "client_credentials");
|
// 第三方应用id
|
paramMap.put("client_id", client_id);
|
// 第三方应用secret 公钥加密
|
String secret_entryption = Encryption.pubEncrypt(pubKey, client_secret);
|
System.out.println("secret_entryption::" + secret_entryption);
|
paramMap.put("client_secret", URLEncoder.encode(secret_entryption, "utf-8"));
|
// 账套编码
|
paramMap.put("biz_center", busi_center);
|
// // TODO 传递数据源和ncc登录用户
|
// paramMap.put("dsname", dsname);
|
paramMap.put("usercode", usercode);
|
|
// 签名
|
String sign = SHA256Util.getSHA256(client_id + client_secret + pubKey, pubKey);
|
paramMap.put("signature", sign);
|
System.out.println("##gettoken sign::" + sign);
|
|
String url = baseUrl + "/nccloud/opm/accesstoken";
|
String mediaType = "application/x-www-form-urlencoded";
|
String token = doPost(url, paramMap, mediaType, null, "");
|
return token;
|
}
|
|
/**
|
* 密码模式获取token
|
*
|
* @return
|
* @throws Exception
|
*/
|
@SuppressWarnings("unused")
|
private static String getTokenByPWD() throws Exception {
|
Map<String, String> paramMap = new HashMap<String, String>();
|
// 密码模式认证
|
paramMap.put("grant_type", "password");
|
// 第三方应用id
|
paramMap.put("client_id", client_id);
|
// 第三方应用secret 公钥加密
|
paramMap.put("client_secret", URLEncoder.encode(Encryption.pubEncrypt(pubKey, client_secret), "utf-8"));
|
// paramMap.put("client_secret", client_secret);
|
// ncc用户名
|
paramMap.put("username", username);
|
// 密码 公钥加密
|
paramMap.put("password", URLEncoder.encode(Encryption.pubEncrypt(pubKey, pwd), "utf-8"));
|
// paramMap.put("password", pwd);
|
// 账套编码
|
paramMap.put("biz_center", busi_center);
|
// 签名
|
String sign = SHA256Util.getSHA256(client_id + client_secret + username + pwd + pubKey, pubKey);
|
System.out.println("sign_getToken::" + sign);
|
paramMap.put("signature", sign);
|
|
String url = baseUrl + "/nccloud/opm/accesstoken";
|
String mediaType = "application/x-www-form-urlencoded";
|
String token = doPost(url, paramMap, mediaType, null, "");
|
return token;
|
}
|
|
/**
|
* 请求openapi
|
*
|
* @param token
|
* @throws Exception
|
*/
|
private static void testApi(String token) throws Exception {
|
// token转对象,获取api访问所用token和secret
|
ResultMessageUtil returnData = JSONObject.parseObject(token, ResultMessageUtil.class);
|
Map<String, Object> data = (Map<String, Object>) returnData.getData();
|
String access_token = (String) data.get("access_token");
|
String security_key = (String) data.get("security_key");
|
String refresh_token = (String) data.get("refresh_token");
|
long expire_in = new Double((double) data.get("expires_in")).longValue();
|
long ts = new Double((double) data.get("ts")).longValue();
|
if (ts + expire_in < System.currentTimeMillis()) {
|
token = getToken();
|
returnData = JSONObject.parseObject(token, ResultMessageUtil.class);
|
data = (Map<String, Object>) returnData.getData();
|
access_token = (String) data.get("access_token");
|
security_key = (String) data.get("security_key");
|
refresh_token = (String) data.get("refresh_token");
|
}
|
System.out.println("【ACCESS_TOKEN】:" + access_token);
|
|
// 请求路径
|
String url = baseUrl + apiUrl;
|
// header 参数
|
Map<String, String> headermap = new HashMap<>();
|
headermap.put("access_token", access_token);
|
headermap.put("client_id", client_id);
|
|
StringBuffer sb = new StringBuffer();
|
sb.append(client_id);
|
if (!Cools.isEmpty(requestBody)) {
|
// sb.append(requestBody.replaceAll("\\s*|\t|\r|\n", "").trim());
|
sb.append(requestBody);
|
}
|
sb.append(pubKey);
|
String sign = SHA256Util.getSHA256(sb.toString(), pubKey);
|
headermap.put("signature", sign);
|
|
if (!Cools.isEmpty(busi_id)) {
|
headermap.put("busi_id", busi_id);
|
}
|
if (!Cools.isEmpty(repeat_check)) {
|
headermap.put("repeat_check", repeat_check);
|
}
|
// headermap.put("ucg_flag", "y");
|
|
String mediaType = "application/json;charset=utf-8";
|
|
// 表体数据json
|
// 根据安全级别选择加密或压缩请求表体参数
|
String json = dealRequestBody(requestBody, security_key, secret_level);
|
|
// 返回值
|
String result = doPost(url, null, mediaType, headermap, json);
|
String result2 = dealResponseBody(result, security_key, secret_level);
|
System.out.println("【RESULT】:" + result);
|
System.out.println("result解密:" + result2);
|
}
|
|
/**
|
* 返回值进行过加密和压缩,对返回值进行解压和解密
|
*
|
* @param source
|
* @param security_key
|
* @param level
|
* @return
|
* @throws Exception
|
*/
|
private static String dealResponseBody(String source, String security_key, String level) throws Exception {
|
String result = null;
|
|
if (StringUtils.isEmpty(level) || SecretConst.LEVEL0.equals(level)) {
|
result = source;
|
} else if (SecretConst.LEVEL1.equals(level)) {
|
result = Decryption.symDecrypt(security_key, source);
|
} else if (SecretConst.LEVEL2.equals(level)) {
|
result = CompressUtil.gzipDecompress(source);
|
} else if (SecretConst.LEVEL3.equals(level)) {
|
result = CompressUtil.gzipDecompress(Decryption.symDecrypt(security_key, source));
|
} else if (SecretConst.LEVEL4.equals(level)) {
|
result = Decryption.symDecrypt(security_key, CompressUtil.gzipDecompress(source));
|
} else {
|
throw new Exception("无效的安全等级");
|
}
|
|
return result;
|
}
|
|
/**
|
* 初始化参数
|
*/
|
private static void init() {
|
// TODO Auto-generated method stub
|
Properties properties = new Properties();
|
|
String filepath = "config.properties";
|
ClassLoader classloader = Thread.currentThread().getContextClassLoader();
|
InputStream inputStream = classloader.getResourceAsStream(filepath);
|
try {
|
InputStreamReader reader = new InputStreamReader(inputStream, "UTF-8");
|
properties.load(reader);
|
|
client_secret = new String(properties.getProperty("client_secret").getBytes("utf-8"), "utf-8");
|
client_id = properties.getProperty("client_id");
|
pubKey = properties.getProperty("pubKey");
|
username = properties.getProperty("username");
|
usercode = properties.getProperty("usercode");
|
pwd = properties.getProperty("pwd");
|
busi_center = properties.getProperty("busi_center");
|
dsname = properties.getProperty("dsname");
|
baseUrl = properties.getProperty("baseUrl");
|
requestBody = new String(properties.getProperty("requestBody").getBytes("utf-8"), "utf-8");
|
apiUrl = properties.getProperty("apiUrl");
|
grant_type = properties.getProperty("grant_type");
|
secret_level = properties.getProperty("secret_level");
|
repeat_check = properties.getProperty("repeat_check");
|
busi_id = properties.getProperty("busi_id");
|
} catch (IOException e) {
|
// TODO Auto-generated catch block
|
e.printStackTrace();
|
}
|
}
|
|
// 根据安全级别设置,表体是否加密或压缩
|
private static String dealRequestBody(String source, String security_key, String level) throws Exception {
|
String result = null;
|
if (StringUtils.isEmpty(level) || SecretConst.LEVEL0.equals(level)) {
|
result = source;
|
} else if (SecretConst.LEVEL1.equals(level)) {
|
result = Encryption.symEncrypt(security_key, source);
|
} else if (SecretConst.LEVEL2.equals(level)) {
|
result = CompressUtil.gzipCompress(source);
|
} else if (SecretConst.LEVEL3.equals(level)) {
|
result = Encryption.symEncrypt(security_key, CompressUtil.gzipCompress(source));
|
} else if (SecretConst.LEVEL4.equals(level)) {
|
result = CompressUtil.gzipCompress(Encryption.symEncrypt(security_key, source));
|
} else {
|
throw new Exception("无效的安全等级");
|
}
|
|
return result;
|
}
|
|
/**
|
* 发送post请求
|
*
|
* @param baseUrl
|
* @param paramMap
|
* @param mediaType
|
* @param headers
|
* @param json
|
* @return
|
*/
|
private static String doPost(String baseUrl, Map<String, String> paramMap, String mediaType,
|
Map<String, String> headers, String json) throws Exception {
|
|
HttpURLConnection urlConnection = null;
|
InputStream in = null;
|
OutputStream out = null;
|
BufferedReader bufferedReader = null;
|
String result = null;
|
try {
|
StringBuffer sb = new StringBuffer();
|
sb.append(baseUrl);
|
if (paramMap != null) {
|
sb.append("?");
|
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
|
String key = entry.getKey();
|
String value = entry.getValue();
|
sb.append(key + "=" + value).append("&");
|
}
|
baseUrl = sb.toString().substring(0, sb.toString().length() - 1);
|
}
|
|
URL urlObj = new URL(baseUrl);
|
urlConnection = (HttpURLConnection) urlObj.openConnection();
|
urlConnection.setConnectTimeout(50000);
|
urlConnection.setRequestMethod("POST");
|
urlConnection.setDoOutput(true);
|
urlConnection.setDoInput(true);
|
urlConnection.setUseCaches(false);
|
urlConnection.addRequestProperty("content-type", mediaType);
|
if (headers != null) {
|
for (String key : headers.keySet()) {
|
urlConnection.addRequestProperty(key, headers.get(key));
|
}
|
}
|
out = urlConnection.getOutputStream();
|
out.write(json.getBytes("utf-8"));
|
out.flush();
|
int resCode = urlConnection.getResponseCode();
|
System.out.println("状态码::" + resCode);
|
// if (resCode == HttpURLConnection.HTTP_OK || resCode == HttpURLConnection.HTTP_CREATED || resCode == HttpURLConnection.HTTP_ACCEPTED) {
|
in = urlConnection.getInputStream();
|
// } else {
|
// in = urlConnection.getErrorStream();
|
// }
|
bufferedReader = new BufferedReader(new InputStreamReader(in, "utf-8"));
|
StringBuffer temp = new StringBuffer();
|
String line = bufferedReader.readLine();
|
while (line != null) {
|
temp.append(line).append("\r\n");
|
line = bufferedReader.readLine();
|
}
|
String ecod = urlConnection.getContentEncoding();
|
if (ecod == null) {
|
ecod = Charset.forName("utf-8").name();
|
}
|
result = new String(temp.toString().getBytes("utf-8"), ecod);
|
System.out.println(result);
|
} catch (Exception e) {
|
System.out.println(e);
|
throw e;
|
} finally {
|
if (null != bufferedReader) {
|
try {
|
bufferedReader.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
if (null != out) {
|
try {
|
out.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
if (null != in) {
|
try {
|
in.close();
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
}
|
urlConnection.disconnect();
|
}
|
return result;
|
}
|
|
class SecretConst {
|
/**
|
* LEVEL0 不压缩、不加密
|
*/
|
public static final String LEVEL0 = "L0";
|
/**
|
* LEVEL1 只加密、不压缩
|
*/
|
public static final String LEVEL1 = "L1";
|
/**
|
* LEVEL2 只压缩、不加密
|
*/
|
public static final String LEVEL2 = "L2";
|
/**
|
* LEVEL3 先压缩、后加密
|
*/
|
public static final String LEVEL3 = "L3";
|
/**
|
* LEVEL4 先加密、后压缩
|
*/
|
public static final String LEVEL4 = "L4";
|
}
|
}
|