1
0
Переглянути джерело

对接海关平台开放实时数据获取接口bug修改

dq 6 роки тому
батько
коміт
0e37c5acdd

+ 1 - 1
kmall-admin/src/main/resources/conf/cus.properties

@@ -35,6 +35,6 @@ cus.prod.recpCode=91440300MA5DGG1J0R
 # 收款企业名称
 cus.prod.recpName=中网科技(深圳)有限公司
 # 商品展示链接地址
-cus.prod.itemLink=https://mp.k1net.cn/api//goods/detail
+cus.prod.itemLink=https://mp.k1net.cn/api/goods/detail
 # 定时器请求地址
 cus.prod.sendUrl=https://mp.k1net.cn/cus/send

+ 1 - 1
kmall-admin/src/main/resources/conf/websocket.properties

@@ -3,5 +3,5 @@
 websocket.wsUrl=ws://qhdswl.f3322.net:61232
 websocket.cusSignMethod=cus-sec_SpcSignDataAsPEM
 websocket.opCardPwd=88888888
-websocket.cardNo=00f2f3e3
+websocket.cardNo=012fa6a7
 websocket.id=1

+ 2 - 2
kmall-common/src/main/java/com/kmall/common/constant/Dict.java

@@ -821,8 +821,8 @@ public class Dict {
      */
     public enum cusDateOpenStatus {
         item_0("0", "接收"),
-        item_1("1", "发送成功"),
-        item_2("2", "发送失败"),
+        item_10000("10000", "发送成功"),
+        item_20000("20000", "发送失败"),
         item_3("3", "加签失败");
 
         private String item;

+ 3 - 1
kmall-common/src/main/java/com/kmall/common/controller/pay/data/open/PlatDataOpen.java

@@ -14,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.util.Date;
 
@@ -40,7 +41,8 @@ public class PlatDataOpen {
      * @param openReq
      * @return
      */
-    @RequestMapping("/platDataOpen")
+    @RequestMapping(value = "/cus/platDataOpen")
+    @ResponseBody
     public ResponseMsg platDataOpen(@RequestParam(required = false) String openReq) {
         if (StringUtils.isBlank(openReq)) {
             return ResponseMsg.builder().setCode(ResponseMsg.ERROR_CODE)

+ 4 - 2
kmall-common/src/main/java/com/kmall/common/controller/pay/data/open/RealTimeDataUp.java

@@ -24,6 +24,7 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
 
 import java.io.IOException;
 import java.util.*;
@@ -51,7 +52,8 @@ public class RealTimeDataUp {
      *
      * @return
      */
-    @RequestMapping("/cus/send")
+    @RequestMapping(value = "/cus/send")
+    @ResponseBody
     public String send() {
         try {
             //获取待发送数据
@@ -228,7 +230,7 @@ public class RealTimeDataUp {
         // --------------------------------------------------
 
         // 海关请求数据时的sessionID
-        payExInfo.setSessionID(record.getSessionId());
+        payExInfo.setSessionID(record.getSessionID());
 
         payExInfo.setPayExchangeInfoHead(head);
         payExInfo.setPayExchangeInfoLists(infoList);

+ 5 - 5
kmall-common/src/main/java/com/kmall/common/entity/CusReqRecordEntity.java

@@ -25,7 +25,7 @@ public class CusReqRecordEntity implements Serializable {
     /**
      * 海关发起请求时,平台接收的会话ID
      */
-    private String sessionId;
+    private String sessionID;
     /**
      * 调用时的系统时间
      */
@@ -78,15 +78,15 @@ public class CusReqRecordEntity implements Serializable {
     /**
      * 获取:海关发起请求时,平台接收的会话ID
      */
-    public String getSessionId() {
-        return sessionId;
+    public String getSessionID() {
+        return sessionID;
     }
 
     /**
      * 设置:海关发起请求时,平台接收的会话ID
      */
-    public void setSessionId(String sessionId) {
-        this.sessionId = sessionId;
+    public void setSessionID(String sessionID) {
+        this.sessionID = sessionID;
     }
 
     /**

+ 7 - 10
kmall-common/src/main/java/com/kmall/common/manager/tocus/CusPayDataSender.java

@@ -50,7 +50,7 @@ public class CusPayDataSender {
         String contents = JacksonUtils.toJson(map);
         logger.debug("send pay data: {}", contents);
 
-        String resp = OkHttpUtils.post(map, CusPropertiesBuilder.instance().getPayDateUrl(), "");
+        String resp = OkHttpUtils.post(map, CusPropertiesBuilder.instance().getPayDateUrl(), "SSL");
         return resp;
     }
 
@@ -64,7 +64,7 @@ public class CusPayDataSender {
             logger.error(str);
 
             // 更新状态
-            record.setStatus(Dict.cusDateOpenStatus.item_2.getItem());
+            record.setStatus(Dict.cusDateOpenStatus.item_20000.getItem());
             record.setMessage(str);
             record.setModTime(new Date());
             return record;
@@ -72,26 +72,23 @@ public class CusPayDataSender {
 
         ResponseMsg resp = JacksonUtils.fromStringJson(result, ResponseMsg.class);
         String code = resp.getCode();
-        if (!ResponseMsg.SUCCESS_CODE.equals(code)) {
-            logger.error("发送海关失败,返回消息: {}", result);
+        if (ResponseMsg.SUCCESS_CODE.equals(code)) {
+            logger.info("发送海关成功,返回消息: {}", result);
 
             // 更新状态
-            record.setStatus(Dict.cusDateOpenStatus.item_1.getItem());
+            record.setStatus(Dict.cusDateOpenStatus.item_10000.getItem());
             record.setMessage(resp.getMessage());
             record.setModTime(new Date());
             return record;
         } else {
-            logger.error("发送海关成功,返回消息: {}", result);
+            logger.error("发送海关失败,返回消息: {}", result);
 
             // 更新状态
-            record.setStatus(Dict.cusDateOpenStatus.item_2.getItem());
+            record.setStatus(code);
             record.setMessage(resp.getMessage());
             record.setModTime(new Date());
             return record;
         }
-
-        // do others......
-
     }
 
 }

+ 96 - 62
kmall-common/src/main/java/com/kmall/common/utils/OkHttpUtils.java

@@ -32,6 +32,8 @@ public class OkHttpUtils {
     public static final MediaType MEDIA_TYPE_TEXT_HTML = MediaType.parse("text/html;charset=UTF-8");
     private static final MediaType MEDIA_TYPE_FORM= MediaType.parse("application/x-www-form-urlencoded");
 
+    private static final String SSL = "SSL";
+
 
     public static final int CONNECT_TIME_OUT = 20;
     public static final int READ_TIME = 30;
@@ -56,11 +58,29 @@ public class OkHttpUtils {
 
     /**
      * https 和 http
-     * @param ssl
+     * @param ssl 如果需要SSL认证https, ssl值为SSL, 如果ssl为空, 则为http
      * @return
      */
     private static OkHttpClient okHttpClient(String ssl){
-        return StringUtils.isNotBlank(ssl) && "ssl".equalsIgnoreCase(ssl) ? okHttpInstanceSsl() : okHttpInstance();
+        return StringUtils.isNotBlank(ssl) && SSL.equals(ssl) ? okHttpInstanceSsl() : okHttpInstance();
+    }
+
+    /**
+     * https 和 http
+     * 如果要信息所有证书,
+     *      <code>ssl</code>必须为SSL,
+     *      <code>ignoreHostnameVerifier</code>为true,
+     *      <code>InputStream... certificates</code>为null
+     *
+     * @param ssl
+     * @param ignoreHostnameVerifier 是否忽略Hostname验证
+     * @param certificates 证书流
+     * @return
+     */
+    private static OkHttpClient okHttpClient(String ssl, boolean ignoreHostnameVerifier, InputStream... certificates){
+        return StringUtils.isNotBlank(ssl) && SSL.equalsIgnoreCase(ssl)
+                ? okHttpInstanceSsl(ignoreHostnameVerifier, certificates)
+                : okHttpInstance();
     }
 
     /**
@@ -73,7 +93,8 @@ public class OkHttpUtils {
             OkHttpClient.Builder builder = new OkHttpClient.Builder();
             builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
                     .readTimeout(READ_TIME, TimeUnit.SECONDS)
-                    .writeTimeout(WRITE_TIME, TimeUnit.SECONDS);
+                    .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
+                    .retryOnConnectionFailure(true);
 
             client = builder.build();
             okHttpClientThreadLocal.set(client);
@@ -81,31 +102,41 @@ public class OkHttpUtils {
         return client;
     }
 
+
+    /**
+     * OkHttpClient ssl 实例
+     * 忽略Hostname验证, 并信息所有证书
+     * @return
+     */
     private static OkHttpClient okHttpInstanceSsl() {
-        return okHttpInstanceSsl(null);
+        return okHttpInstanceSsl(true, null);
     }
 
     /**
      * OkHttpClient ssl 实例
+     * 如果要信息所有证书, <code>InputStream... certificates</code>为null
+     * @param ignoreHostnameVerifier 是否忽略Hostname验证
+     * @param certificates 证书流
      * @return
      */
-    private static OkHttpClient okHttpInstanceSsl(InputStream... certificates) {
+    private static OkHttpClient okHttpInstanceSsl(boolean ignoreHostnameVerifier, InputStream... certificates) {
         OkHttpClient client = okHttpClientSslThreadLocal.get();
         if (client == null) {
 
-            X509TrustManager trustManager = buildX509TrustManager(certificates);
+            X509TrustManager[] trustManager = buildX509TrustManager(certificates);
             SSLSocketFactory sslSocketFactory = buildSSLSocketFactory(trustManager);
 
             OkHttpClient.Builder builder = new OkHttpClient.Builder();
             builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
                     .readTimeout(READ_TIME, TimeUnit.SECONDS)
-                    .writeTimeout(WRITE_TIME, TimeUnit.SECONDS)
-                    .hostnameVerifier(new HostnameVerifier() {
-                        @Override
-                        public boolean verify(String hostname, SSLSession session) {
-                            return true;
-                        }
-                    }).sslSocketFactory(sslSocketFactory, trustManager);
+                    .writeTimeout(WRITE_TIME, TimeUnit.SECONDS);
+
+            //是否忽略host验证
+            if (ignoreHostnameVerifier) {
+                builder.hostnameVerifier(getHostnameVerifier());
+            }
+            builder.sslSocketFactory(sslSocketFactory, trustManager[0])
+                    .retryOnConnectionFailure(true);
 
             client = builder.build();
             okHttpClientSslThreadLocal.set(client);
@@ -282,7 +313,7 @@ public class OkHttpUtils {
         try {
             return okHttpClient(ssl).newCall(request).execute().body().string();
         } catch (IOException e) {
-                logger.error("okhttp3 post throw IOException, {}", e.getMessage());
+            logger.error("okhttp3 post throw IOException, {}", e.getMessage());
         }
         return null;
     }
@@ -293,7 +324,7 @@ public class OkHttpUtils {
      * @param ssl
      * @param responseCallback
      */
-    public static void asyncPostCallback(Request request, String ssl, Callback responseCallback) {
+    public static void asyncPostCallback(Request request, String ssl,  Callback responseCallback) {
         okHttpClient(ssl).newCall(request).enqueue(responseCallback);
     }
 
@@ -318,41 +349,20 @@ public class OkHttpUtils {
 
 
     //------------------------------ ssl ------------------------------
+
     /**
-     * 获取SSLSocketFactory
-     *
-     * @param certificates 证书流文件
+     * 获取主机验证 HostnameVerifier
      * @return
      */
-    /*private static SSLSocketFactory buildSSLSocketFactory(InputStream... certificates) {
-        try {
-            CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
-            KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
-            keyStore.load(null);
-            int index = 0;
-            for (InputStream certificate : certificates) {
-                String certificateAlias = Integer.toString(index++);
-                keyStore.setCertificateEntry(certificateAlias, certificateFactory.generateCertificate(certificate));
-
-                try {
-                    if (certificate != null) {
-                        certificate.close();
-                    }
-                } catch (IOException e) {
-                }
+    public static HostnameVerifier getHostnameVerifier() {
+        return new HostnameVerifier() {
+            @Override
+            public boolean verify(String s, SSLSession sslSession) {
+                return true;
             }
+        };
+    }
 
-            TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
-            trustManagerFactory.init(keyStore);
-
-            SSLContext sslContext = SSLContext.getInstance("TLS");
-            sslContext.init(null, trustManagerFactory.getTrustManagers(), new SecureRandom());
-            return sslContext.getSocketFactory();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-        return null;
-    }*/
 
     /**
      * 自定义证书
@@ -390,12 +400,44 @@ public class OkHttpUtils {
     }
 
 
-    private static X509TrustManager buildX509TrustManager(){
+    /**
+     * 证书管理
+     * 信任所有证书
+     * @return
+     */
+    private static X509TrustManager[] buildX509TrustManager(){
         return buildX509TrustManager(null);
     }
 
-    private static X509TrustManager buildX509TrustManager(InputStream... certificates) {
+    /**
+     * 证书管理
+     * 如果要信任所有证书,<code>InputStream... certificates</code>为null
+     * @param certificates 证书文件流
+     * @return
+     */
+    private static X509TrustManager[] buildX509TrustManager(InputStream... certificates) {
         try {
+            if (certificates == null) {
+                // 信任所有证书
+                return new X509TrustManager[]{
+                    new X509TrustManager() {
+                        @Override
+                        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+                        }
+
+                        @Override
+                        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
+                        }
+
+                        @Override
+                        public X509Certificate[] getAcceptedIssuers() {
+                            return new X509Certificate[]{};
+                        }
+                    }
+                };
+            }
+
+            // 信任自定义证书
             KeyStore keyStore = generateKeyStore(certificates);
 
             TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
@@ -409,8 +451,7 @@ public class OkHttpUtils {
                         + Arrays.toString(trustManagers));
             }
 
-            X509TrustManager trustManager = (X509TrustManager) trustManagers[0];
-            return trustManager;
+            return (X509TrustManager[]) trustManagers;
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -425,7 +466,7 @@ public class OkHttpUtils {
 
     private static SSLSocketFactory buildSSLSocketFactory(InputStream... certificates) {
         try {
-            TrustManager trustManager = buildX509TrustManager(certificates);
+            TrustManager[] trustManager = buildX509TrustManager(certificates);
             return buildSSLSocketFactory(trustManager);
         } catch (Exception e) {
             e.printStackTrace();
@@ -433,23 +474,14 @@ public class OkHttpUtils {
         return null;
     }
 
-    private static SSLSocketFactory buildSSLSocketFactory(TrustManager trustManager) {
+    private static SSLSocketFactory buildSSLSocketFactory(TrustManager[] trustManager) {
         try {
             if (trustManager == null) {
                 throw new IllegalStateException("TrustManager is null");
             }
 
-            SSLContext sslContext = SSLContext.getInstance("SSL");
-            sslContext.init(null, new TrustManager[]{new X509TrustManager() {
-                @Override
-                public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
-                @Override
-                public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {}
-                @Override
-                public X509Certificate[] getAcceptedIssuers() {
-                    return new X509Certificate[0];
-                }
-            }}, new SecureRandom());
+            SSLContext sslContext = SSLContext.getInstance(SSL);
+            sslContext.init(null, trustManager, new SecureRandom());
 
             return sslContext.getSocketFactory();
         } catch (Exception e) {
@@ -459,4 +491,6 @@ public class OkHttpUtils {
     }
 
 
+
+
 }

+ 2 - 2
kmall-common/src/main/resources/kmall-shiro.xml

@@ -71,10 +71,10 @@
                 /js/**=anon
                 /qz/**=anon
                 /login.html=anon
+                /cus/send=anon
+                /cus/platDataOpen=anon
                 /sys/login=anon
                 /captcha.jpg=anon
-                /cus/send=anon
-                /platDataOpen=anon
                 /**=authc
             </value>
         </property>

+ 3 - 3
kmall-common/src/main/resources/mybatis/mapper/CusReqRecordDao.xml

@@ -6,7 +6,7 @@
     <resultMap type="com.kmall.common.entity.CusReqRecordEntity" id="cusReqRecordMap">
         <result property="id" column="id"/>
         <result property="orderNo" column="order_no"/>
-        <result property="sessionId" column="session_id"/>
+        <result property="sessionID" column="session_id"/>
         <result property="serviceTime" column="service_time"/>
         <result property="status" column="status"/>
         <result property="message" column="message"/>
@@ -72,7 +72,7 @@
 			`mod_time`)
 		values(
 			#{orderNo},
-			#{sessionId},
+			#{sessionID},
 			#{serviceTime},
 			#{status},
 			#{createTime},
@@ -83,7 +83,7 @@
 		update cus_req_record 
 		<set>
 			<if test="orderNo != null">`order_no` = #{orderNo}, </if>
-			<if test="sessionId != null">`session_id` = #{sessionId}, </if>
+			<if test="sessionID != null">`session_id` = #{sessionID}, </if>
 			<if test="serviceTime != null">`service_time` = #{serviceTime}, </if>
 			<if test="status != null">`status` = #{status}, </if>
 			<if test="createTime != null">`create_time` = #{createTime}, </if>

+ 2 - 1
kmall-schedule/src/main/java/com/kmall/schedule/service/QzOrderService.java

@@ -1158,7 +1158,8 @@ public class QzOrderService {
         logger.info(">>>>>>>>>>>>>>>>>>>>realTimeDataUp is start ");
         logger.info(">>>>>>>>>>>>>>>>>>>>返回海关所需获取的支付相关实时数据 ");
         try {
-            String string = OkHttpUtils.post(null, CusPropertiesBuilder.instance().getSendUrl(), null);
+            logger.info(CusPropertiesBuilder.instance().getSendUrl());
+            String string = OkHttpUtils.post(new HashMap<>(), CusPropertiesBuilder.instance().getSendUrl(), null);
             logger.info(string);
         } catch (Exception e) {
             e.printStackTrace();