package nccloud.openapi; import com.alibaba.fastjson.JSONObject; import nc.ws.opm.pub.utils.security.SecurityUtil; import nccloud.openapi.BaseOpenApiTest.HttpClientWapper.Response; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.NameValuePair; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.StringRequestEntity; import org.apache.commons.httpclient.util.EncodingUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.core.io.ClassPathResource; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import java.io.*; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.security.*; import java.security.spec.X509EncodedKeySpec; import java.util.*; import java.util.Map.Entry; /** * @description: 审批流程接口测试 * @author:guoxqc@yonyou.com * @date:2020年10月23日 */ public class BaseOpenApiTest { // public static final String BASE_URL_DEV="http://192.168.82.5:9999"; public static final String BASE_URL_DEV = "http://127.0.0.1:8088"; // public static final String BASE_URL_DEV = "http://192.168.82.104:7788"; // public static final String BASE_URL_DEV="http://192.168.82.1:9081"; // public static final String BASE_URL_DEV="http://172.23.17.146:8001"; /** * APP ID */ public static final String CLIENT_ID; /** * APP Secret */ public static final String CLIENT_SECRET; /** * 公钥 */ public static final String PUBLIC_KEY; /** * 账套编码 */ public static final String BIZ_CENTER; /** * 用户编码 */ public static final String USER_CODE; static { ResourceBundle config = ResourceBundle.getBundle("nccloud.openapi.config"); CLIENT_ID = config.getString("client_id"); CLIENT_SECRET = config.getString("client_secret"); PUBLIC_KEY = config.getString("pub_key"); BIZ_CENTER = config.getString("biz_center"); USER_CODE = config.getString("user_code"); } public HttpClientWapper client = new HttpClientWapper(); /** * @param url * @param param * @return * @throws Exception */ public String requestOpenApi(String url, Map param) throws Exception { return requestOpenApi(url, new JSONObject(param)); } /** * @param url * @param param * @return * @throws Exception */ public String requestOpenApi(String url, JSONObject param) throws Exception { return requestOpenApi(url, param.toJSONString()); } /** * @param url * @param fileName * @return * @throws Exception */ public String requestOpenApiByJSON(String url, String fileName) throws Exception { ClassPathResource classPathResorce = new ClassPathResource(fileName, this.getClass()); StringBuffer data = new StringBuffer(); try { InputStream in = classPathResorce.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, "utf-8")); String line = reader.readLine(); while (StringUtils.isNotEmpty(line)) { data.append(line); line = reader.readLine(); } } catch (IOException e1) { e1.printStackTrace(); } return requestOpenApi(url, data.toString()); } public String requestOpenApi(String url, String param) throws Exception { String accessToken = this.getAccessTokenByClient(); System.out.println(param.replace(" ", "")); String sign = digest(CLIENT_ID + PUBLIC_KEY); List
headers = new ArrayList
(); headers.add(new Header("Content-Type", "application/json;charset=UTF-8")); headers.add(new Header("signature", sign)); headers.add(new Header("ucg_flag", "y")); headers.add(new Header("access_token", accessToken)); headers.add(new Header("client_id", CLIENT_ID)); Response response; try { response = client.post(BASE_URL_DEV + url, headers.toArray(new Header[headers.size()]), null, param); // System.out.println(response.getData()); return response.getData(); } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); return e.getMessage(); } } /** * @param seed 种子,用于生成公钥 * @param src 明文 * @return * @throws Exception * @description RSA加密 */ public String pubEncrypt(String seed, String src) throws Exception { String target = null; ByteArrayOutputStream out = null; try { Key key = genPublicKey(PUBLIC_KEY); Cipher cipher = Cipher.getInstance("RSA"); cipher.init(1, key); byte[] data = src.getBytes(); int inputLen = data.length; out = new ByteArrayOutputStream(); int offSet = 0; int i = 0; while (inputLen - offSet > 0) { byte[] cache; ; if (inputLen - offSet > 117) { cache = cipher.doFinal(data, offSet, 117); } else { cache = cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i++; offSet = i * 117; } target = new BASE64Encoder().encodeBuffer(out.toByteArray()); } catch (Exception e) { throw new Exception("加密失败" + e.getMessage()); } finally { if (out != null) { out.close(); } } return target; } /** * @param str * @return * @description 信息摘要 */ public static String digest(String str) { String encodestr = ""; try { MessageDigest messageDigest = MessageDigest.getInstance("SHA-256"); messageDigest.update(str.getBytes(StandardCharsets.UTF_8)); encodestr = byte2Hex(messageDigest.digest()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } return encodestr; } private static String byte2Hex(byte[] bytes) { StringBuffer stringBuffer = new StringBuffer(); String temp = null; for (int i = 0; i < bytes.length; i++) { temp = Integer.toHexString(bytes[i] & 0xFF); if (temp.length() == 1) { stringBuffer.append("0"); } stringBuffer.append(temp); } return stringBuffer.toString(); } /** * @param PUBLIC_KEY * @return * @throws Exception * @description 根据种子生成密钥对 */ public static Key genPublicKey(String seed) throws Exception { Key key = null; try { byte[] keyBytes = new BASE64Decoder().decodeBuffer(seed); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes); key = keyFactory.generatePublic(x509KeySpec); } catch (Exception e) { throw new Exception("无效的密钥 " + e.getMessage()); } return key; } /** * Http请求包装类 * * @author guoxiangqiao * @date 2019年12月11日 */ public class HttpClientWapper { public static final int HTTP_STATUS_SUCCESS = 200; /** * post请求 * * @param url * @param headers * @param requestBody * @return * @throws Exception */ public Response post(String url, Header[] headers, NameValuePair[] requestBody, String requestEntityStr) throws Exception { HttpClient client = new HttpClient(); PostMethod postMethod = new PostMethod(url); if (headers != null) { for (Header header : headers) { postMethod.setRequestHeader(header); } } if (requestBody != null) { postMethod.setRequestBody(requestBody); } if (StringUtils.isNotEmpty(requestEntityStr)) { StringRequestEntity requestEntity = new StringRequestEntity(requestEntityStr, null, "utf-8"); postMethod.setRequestEntity(requestEntity); } int httpStatus = client.executeMethod(postMethod); String result = this.getResponseBodyAsString(postMethod); return new Response(httpStatus, result); } public String getResponseBodyAsString(PostMethod postMethod) throws IOException { byte[] rawdata = null; rawdata = postMethod.getResponseBody(); return rawdata != null ? EncodingUtil.getString(rawdata, "utf-8") : null; } /** * @param params * @return * @description Map转URL参数 * @author guoxqc@yonyou.com * @date 2020年10月22日 */ public String getURLParam(Map params) { StringBuffer paramStr = new StringBuffer(); if (!params.isEmpty()) { for (Entry kv : params.entrySet()) { paramStr.append(kv.getKey()); paramStr.append("="); paramStr.append(kv.getValue()); paramStr.append("&"); } paramStr.deleteCharAt(paramStr.length() - 1); } return paramStr.toString(); } /** * get请求 * * @param url * @param headers * @param params * @return * @throws Exception */ public Response get(String url, Header[] headers, NameValuePair[] params) throws Exception { HttpClient client = new HttpClient(); GetMethod getMethod = new GetMethod(url); if (params != null) { getMethod.setQueryString(params); } if (headers != null) { for (Header header : headers) { getMethod.setRequestHeader(header); } } int httpStatus = client.executeMethod(getMethod); String result = getMethod.getResponseBodyAsString(); return new Response(httpStatus, result); } /** * 获取url查询参数 * * @param params * @return */ public String getQueryString(NameValuePair[] params) { GetMethod getMethod = new GetMethod(); getMethod.setQueryString(params); return getMethod.getQueryString(); } class Response { private int httpStatus; private String data; public int getHttpStatus() { return httpStatus; } public void setHttpStatus(int httpStatus) { this.httpStatus = httpStatus; } public String getData() { return data; } public void setData(String data) { this.data = data; } public Response(int httpStatus, String data) { super(); this.httpStatus = httpStatus; this.data = data; } public Response() { super(); } } } public static String getSHA256(String str, String key) throws Exception { byte[] salt = new byte[16]; SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); random.setSeed(key.getBytes()); random.nextBytes(salt); String salt_value = new BASE64Encoder().encodeBuffer(salt); return digest(str + salt_value.replaceAll("\r|\n", "")); } /** * @return * @throws Exception * @description 获取AccessToken */ @SuppressWarnings("static-access") public String getAccessTokenByClient() throws Exception { String url = BASE_URL_DEV + "/nccloud/opm/accesstoken"; List
headers = new ArrayList
(); headers.add(new Header("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8")); // 获取信息摘要 String signature = getSHA256(CLIENT_ID + CLIENT_SECRET + PUBLIC_KEY, PUBLIC_KEY); // 使用PUBLIC_KEY生成公钥,对CLIENT_SECRET加密 SecurityUtil securityUtil = new SecurityUtil(); String CLIENT_SECRETEn = URLEncoder.encode(securityUtil.pubEncrypt(PUBLIC_KEY, CLIENT_SECRET), "utf-8"); Map params = new HashMap(); params.put("client_id", CLIENT_ID); params.put("userCode", USER_CODE); params.put("grant_type", "client_credentials"); params.put("biz_center", BIZ_CENTER); params.put("signature", signature); params.put("client_secret", CLIENT_SECRETEn); try { Response response = client.post(url, headers.toArray(new Header[headers.size()]), null, client.getURLParam(params)); System.out.println(response.getData()); JSONObject result = JSONObject.parseObject(response.getData()); boolean success = result.getBoolean("success"); if (success) { return result.getJSONObject("data").getString("access_token"); } } catch (Exception e) { System.out.println(e.getMessage()); e.printStackTrace(); } return null; } }