|
@@ -0,0 +1,222 @@
|
|
|
+package com.pj.api.invoice;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+
|
|
|
+import java.io.*;
|
|
|
+import java.net.HttpURLConnection;
|
|
|
+import java.net.MalformedURLException;
|
|
|
+import java.net.URL;
|
|
|
+import java.net.URLConnection;
|
|
|
+import java.security.MessageDigest;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @Description:
|
|
|
+ */
|
|
|
+public class CallDomo {
|
|
|
+
|
|
|
+ public static final String appid = "100001";
|
|
|
+ public static final String appsecret = "7214fefff0cf47d7950cb2fc3b5d670a";
|
|
|
+ public static final String requestUrl = "http://localhost:8090/api/vi/uim";
|
|
|
+
|
|
|
+ public static void main(String[] args) throws Exception {
|
|
|
+ Map<String, String> param = new HashMap<>();
|
|
|
+ param.put("action", "erpaysav");
|
|
|
+ param.put("appid", appid);
|
|
|
+ param.put("timestamp", date2StrByInt(new Date(), "yyyyMMddHHmmssFFF"));
|
|
|
+ param.put("transid", genTransId());
|
|
|
+ String sign = createSign(getSortedMap(param), appsecret);
|
|
|
+ param.put("sign", sign);
|
|
|
+ //拼装请求url
|
|
|
+ String url = getUrl(requestUrl, param);
|
|
|
+ // 请求接口对应的业务参数封装
|
|
|
+ JSONObject businessObj = new JSONObject();
|
|
|
+ String paramStr = "{" +
|
|
|
+ " \"appaysavx\":[" +
|
|
|
+ " {" +
|
|
|
+ " \"bnktyp\":\"CMB\"," +
|
|
|
+ " \"bustyp\":\"0\"," +
|
|
|
+ " \"ccynbr\":\"10\"," +
|
|
|
+ " \"cltacc\":\"000110100002\"," +
|
|
|
+ " \"cltnbr\":\"0003\"," +
|
|
|
+ " \"eptdat\":\"2021-07-04\"," +
|
|
|
+ " \"epttim\":\"11:01:00\"," +
|
|
|
+ " \"exttxOne\":\"摘要信息03\"," +
|
|
|
+ " \"oprmod\":\"3\"," +
|
|
|
+ " \"oprty\":\"202\"," +
|
|
|
+ " \"payson\":\"N\"," +
|
|
|
+ " \"paytyp\":\"2\"," +
|
|
|
+ " \"recnum\":1," +
|
|
|
+ " \"refnbp\":\"TEST20190704\"," +
|
|
|
+ " \"revacc\":\"8512384214654654\"," +
|
|
|
+ " \"revbnk\":\"招商银行科技园支行\"," +
|
|
|
+ " \"revcit\":\"深圳市\"," +
|
|
|
+ " \"revnam\":\"招商银行\"," +
|
|
|
+ " \"revprv\":\"广东省\"," +
|
|
|
+ " \"trsamt\":200," +
|
|
|
+ " \"trsuse\":\"摘要信息01\"" +
|
|
|
+ " }" +
|
|
|
+ " ]," +
|
|
|
+ " \"info\":{" +
|
|
|
+ " \"funName\":\"ERPAYSAV\"" +
|
|
|
+ " }" +
|
|
|
+ "}";
|
|
|
+ System.out.println(httppost(url, JSONObject.parseObject(paramStr)));
|
|
|
+ }
|
|
|
+
|
|
|
+ public static JSONObject httppost(String urlString, JSONObject obj) throws Exception {
|
|
|
+ PrintWriter out = null;
|
|
|
+ BufferedReader reader = null;
|
|
|
+ HttpURLConnection connection = null;
|
|
|
+ StringBuffer sb = new StringBuffer("");
|
|
|
+ if (null == obj) {
|
|
|
+ obj = new JSONObject();
|
|
|
+ }
|
|
|
+ try {// 创建连接
|
|
|
+ URL url = new URL(urlString);
|
|
|
+ URLConnection conn = url.openConnection();
|
|
|
+ conn.setRequestProperty("accept", "*/*");
|
|
|
+ conn.setRequestProperty("connection", "Keep-Alive");
|
|
|
+ conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
|
|
+ conn.setRequestProperty("Accept-Charset", "utf-8");
|
|
|
+ conn.setRequestProperty("Content-Type", "application/json");
|
|
|
+ // 设置发 送数据的格式
|
|
|
+ conn.setDoOutput(true);
|
|
|
+ conn.setDoInput(true);
|
|
|
+ out = new PrintWriter(conn.getOutputStream());
|
|
|
+ out.print(obj.toString());
|
|
|
+ out.flush();
|
|
|
+ reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));
|
|
|
+ String line;
|
|
|
+ while ((line = reader.readLine()) != null) {
|
|
|
+ sb.append(line);
|
|
|
+ }
|
|
|
+ return JSONObject.parseObject(sb.toString());
|
|
|
+ } catch (MalformedURLException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (UnsupportedEncodingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ } finally {
|
|
|
+ try {
|
|
|
+ if (out != null) {
|
|
|
+ out.close();
|
|
|
+ }
|
|
|
+ if (reader != null) {
|
|
|
+ reader.close();
|
|
|
+ }
|
|
|
+ } catch (IOException ex) {
|
|
|
+ System.out.println("调用in.close Exception, url=" + urlString + ex);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ JSONObject jsonObj = new JSONObject();
|
|
|
+ jsonObj.put("code", "999");
|
|
|
+ jsonObj.put("msg", "请求服务(" + urlString + ")异常,请联系服务负责人");
|
|
|
+ return jsonObj;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 拼装请求URL
|
|
|
+ *
|
|
|
+ * @param basicUrl 基础url
|
|
|
+ * @param params 基础参数
|
|
|
+ * @return url
|
|
|
+ */
|
|
|
+ public static String getUrl(String basicUrl, Map<String, String> params) {
|
|
|
+ StringBuilder tmpUrl = new StringBuilder(basicUrl + "?");
|
|
|
+ for (String k : params.keySet()) {
|
|
|
+ tmpUrl.append(k).append("=").append(params.get(k)).append("&");
|
|
|
+ }
|
|
|
+ return tmpUrl.toString().substring(0, tmpUrl.length() - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取随机流水号,流水号由调用方控制生成,如果使用同一流水号发//起请求视为重复调用
|
|
|
+ public static String genTransId() {
|
|
|
+ return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + (int) ((Math.random() * 9 + 1) * 100000);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成时间戳
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String date2StrByInt(Date time, String par) {
|
|
|
+ SimpleDateFormat df = new SimpleDateFormat(par);
|
|
|
+ String date = "";
|
|
|
+ try {
|
|
|
+ if (time != null) {
|
|
|
+ date = df.format(time);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return date;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 生成sign
|
|
|
+ *
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String createSign(SortedMap<String, String> params, String key) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ Set<Map.Entry<String, String>> es = params.entrySet();
|
|
|
+ Iterator<Map.Entry<String, String>> it = es.iterator();
|
|
|
+ while (it.hasNext()) {
|
|
|
+ Map.Entry<String, String> entry = (Map.Entry<String, String>) it.next();
|
|
|
+ String k = (String) entry.getKey();
|
|
|
+ String v = (String) entry.getValue();
|
|
|
+ if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) {
|
|
|
+ sb.append(k + "=" + v + "&");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ sb.append("key=").append(key);
|
|
|
+ String sign = MD5(sb.toString()).toUpperCase();
|
|
|
+ return sign;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取有序map
|
|
|
+ *
|
|
|
+ * @param map
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static SortedMap<String, String> getSortedMap(Map<String, String> map) {
|
|
|
+ SortedMap<String, String> sortedMap = new TreeMap<>();
|
|
|
+ Iterator<String> it = map.keySet().iterator();
|
|
|
+ while (it.hasNext()) {
|
|
|
+ String key = (String) it.next();
|
|
|
+ String value = map.get(key);
|
|
|
+ String temp = "";
|
|
|
+ if (null != value) {
|
|
|
+ temp = value.trim();
|
|
|
+ }
|
|
|
+ sortedMap.put(key, temp);
|
|
|
+ }
|
|
|
+ return sortedMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * md5常用工具类
|
|
|
+ *
|
|
|
+ * @param data
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static String MD5(String data) {
|
|
|
+ try {
|
|
|
+ MessageDigest md5 = MessageDigest.getInstance("MD5");
|
|
|
+ byte[] array = md5.digest(data.getBytes("UTF-8"));
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (byte item : array) {
|
|
|
+ sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
|
|
|
+ }
|
|
|
+ return sb.toString().toUpperCase();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|