Browse Source

代码逻辑修改

hyq 7 years ago
parent
commit
63002d38f8

+ 4 - 0
build.gradle

@@ -55,6 +55,8 @@ ext {
 
     gson = '2.8.0'
 
+    dom4j = '1.6.1'
+
 }
 
 dependencies {
@@ -124,6 +126,8 @@ dependencies {
     //gson
     compile("com.google.code.gson:gson:${gson}")
 
+    compile("dom4j:dom4j:${dom4j}")
+
 }
 
 

+ 112 - 130
src/main/java/com/emato/cuspay/biz/wx/WxCusDeclareBiz.java

@@ -8,10 +8,12 @@ import com.emato.cuspay.entity.merch.MerchNoti;
 import com.emato.cuspay.entity.merch.MerchPayCfg;
 import com.emato.cuspay.service.MerchNotiService;
 import com.emato.cuspay.util.OkHttpUtils;
+import com.emato.cuspay.util.ReaderXmlForDOM4J;
 import com.emato.cuspay.util.XmlUtils;
 import com.emato.cuspay.wx.common.MerchNotiBuilder;
 import com.emato.cuspay.wx.common.WxContants;
 import com.emato.cuspay.wx.common.WxDict;
+import com.emato.cuspay.wx.dto.WxQueryResponseMsg;
 import com.emato.cuspay.wx.dto.WxResponseMsg;
 import com.emato.cuspay.wx.entity.WxCbPayDoc;
 import com.emato.cuspay.wx.entity.WxPayError;
@@ -23,20 +25,30 @@ import okhttp3.MediaType;
 import okhttp3.Request;
 import okhttp3.RequestBody;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.dom4j.DocumentHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
-
+import org.springframework.util.StringUtils;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import javax.swing.text.Document;
+import javax.xml.bind.Element;
 import javax.xml.bind.JAXB;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
 import java.io.IOException;
 import java.io.StringReader;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.SortedMap;
+import java.util.*;
 
 /**
  * 微信海关申报
@@ -53,7 +65,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
     @Value("${db.wx.declare.limit}")
     private Integer limit;
 
-    @Value("${db.merch.notice.count}")
+    @Value("${db.wx.declare.count}")
     private Integer count;
 
     @Value("${wx.payment.declare.url}")
@@ -121,32 +133,20 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
             builder.notiCount(count);
 
             if (merchPayCfg == null) {
-                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
-                wxCbPayDoc.setReturnCode(WxContants.ERROR_NO_INFOMATION);
+                wxCbPayDoc.setReturnCode("FAIL");
                 wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
-                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
                 wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
-
-                MerchNoti merchNoti = builder.code(WxContants.ERROR_NO_INFOMATION)
-                        .msg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在")
-                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
-                        .build();
-                merchNotis.add(merchNoti);
+                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
                 return;
             }
 
             if (merchPayCfg.getMerchWxApiKey() == null) {
-                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空");
                 wxCbPayDoc.setReturnCode(WxContants.ERROR_NO_INFOMATION);
-                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
-                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空");
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
                 wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
-
-                MerchNoti merchNoti = builder.code(WxContants.ERROR_NO_API_KEY)
-                        .msg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空")
-                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
-                        .build();
-                merchNotis.add(merchNoti);
+                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空");
                 return;
             }
             //设置商户配置信息
@@ -179,114 +179,94 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
                 wxCbPayDoc.setResultCode(wxResponseMsgDto.getResultCode());
                 wxCbPayDoc.setReturnCode(wxResponseMsgDto.getReturnCode());
                 wxCbPayDoc.setReturnMsg(wxResponseMsgDto.getReturnMsg());
-                ///返回状态码为失败
-                if (WxContants.RETURN_CODE_FAIL.equals(wxResponseMsgDto.getReturnCode()) ||
-                        WxContants.FAIL.equals(wxResponseMsgDto.getReturnCode())) {
-                    wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
-
-                    wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
-
-                    //通知商户
-                    MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
-                            .msg(wxResponseMsgDto.getReturnMsg())
-                            .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
-                            .build();
-                    merchNotis.add(merchNoti);
-                }
 
                 //返回这状态码为成功 业务结果成功
-                if (WxContants.SUCCESS.equals(wxResponseMsgDto.getReturnCode())
-                        && WxContants.SUCCESS.equals(wxResponseMsgDto.getResultCode())) {
-
-                    //订购人与支付人校验结果
-                    if (wxResponseMsgDto.getCertCheckResult() != null) {
-                        if ("UNCHECKED".equals(wxResponseMsgDto.getCertCheckResult())) { //未知
-                            builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem());
-                        }
-                        if ("SAME".equals(wxResponseMsgDto.getCertCheckResult())) {//一致
-                            builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_1.getItem());
+                if (WxContants.SUCCESS.equals(wxResponseMsgDto.getReturnCode())) {
+                    if (WxContants.SUCCESS.equals(wxResponseMsgDto.getResultCode())) {
+                        //订购人与支付人校验结果
+                        if (wxResponseMsgDto.getCertCheckResult() != null) {
+                            if ("UNCHECKED".equals(wxResponseMsgDto.getCertCheckResult())) { //未知
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem());
+                                wxCbPayDoc.setBuyerPayerCheck(MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem());
+                            }
+                            if ("SAME".equals(wxResponseMsgDto.getCertCheckResult())) {//一致
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_1.getItem());
+                                wxCbPayDoc.setBuyerPayerCheck(MerchNoticeDict.BuyerPayerCheckStatus.i_1.getItem());
+                            }
+                            if ("DIFFERENT".equals(wxResponseMsgDto.getCertCheckResult())) {//不一致
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_2.getItem());
+                                wxCbPayDoc.setBuyerPayerCheck(MerchNoticeDict.BuyerPayerCheckStatus.i_2.getItem());
+                            }
+                            if(StringUtils.isEmpty(wxResponseMsgDto.getCertCheckResult())){//校验异常
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_3.getItem());
+                                wxCbPayDoc.setBuyerPayerCheck(MerchNoticeDict.BuyerPayerCheckStatus.i_3.getItem());
+                            }
                         }
-                        if ("DIFFERENT".equals(wxResponseMsgDto.getCertCheckResult())) {//不一致
-                            builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_2.getItem());
+                        MerchNoti merchNoti = new MerchNoti();
+                        //返回状态未申报
+                        if (WxDict.ResponseMsgState.UNDECLARED.getItem().equals(wxResponseMsgDto.getState())) {
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(WxDict.ResponseMsgState.UNDECLARED.getItemName())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_10.getItem())
+                                    .build();
+                        } else if (WxDict.ResponseMsgState.PROCESSING.getItem().equals(wxResponseMsgDto.getState())) {//申报中
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_11.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(WxDict.ResponseMsgState.PROCESSING.getItemName())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                    .build();
+                        } else if (WxDict.ResponseMsgState.SUBMITTED.getItem().equals(wxResponseMsgDto.getState())) {//申报已提交
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(WxDict.ResponseMsgState.SUBMITTED.getItemName())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                    .build();
+
+                        } else if (WxDict.ResponseMsgState.SUCCESS.getItem().equals(wxResponseMsgDto.getState())) {//申报成功
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_12.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(wxResponseMsgDto.getErrCodeDes())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                    .build();
+                        } else if (WxDict.ResponseMsgState.FAIL.getItem().equals(wxResponseMsgDto.getState())) {//申报失败
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(WxDict.ResponseMsgState.FAIL.getItemName())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                    .build();
+                        } else if (WxDict.ResponseMsgState.EXCEPT.getItem().equals(wxResponseMsgDto.getState())) {//海关接口异常
+                            wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                            merchNoti = builder.code(wxResponseMsgDto.getErrCode())
+                                    .msg(WxDict.ResponseMsgState.EXCEPT.getItemName())
+                                    .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                    .build();
                         }
-                    }
-
-                    //返回状态未申报
-                    if (WxDict.ResponseMsgState.UNDECLARED.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_01.getItem());
-
-                        MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
-                                .msg("未申报")
-                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_10.getItem())
-                                .build();
                         merchNotis.add(merchNoti);
-                    }
-
-                    //申报中
-                    if (WxDict.ResponseMsgState.PROCESSING.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_01.getItem());
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+                    } else {//返回状态码为成功 业务结果失败
+                        wxCbPayDoc.setErrCode(wxResponseMsgDto.getErrCode());
+                        wxCbPayDoc.setErrCodeDes(wxResponseMsgDto.getErrCodeDes());
+                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
+                        wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
                         MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
                                 .msg(wxResponseMsgDto.getErrCodeDes())
-                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
-                                .build();
-                        merchNotis.add(merchNoti);
-                    }
-
-                    //申报已提交
-                    if (WxDict.ResponseMsgState.SUBMITTED.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
-
-                        MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
-                                .msg(wxResponseMsgDto.getErrCodeDes())
-                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
-                                .build();
-                        merchNotis.add(merchNoti);
-
-                    }
-                    //申报成功
-                    if (WxDict.ResponseMsgState.SUCCESS.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_11.getItem());
-
-                        MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
-                                .msg(wxResponseMsgDto.getErrCodeDes())
-                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
-                                .build();
-                        merchNotis.add(merchNoti);
-                    }
-                    //申报失败
-                    if (WxDict.ResponseMsgState.FAIL.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
-
-                        MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
-                                .msg("海关申报失败")
-                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
-                                .build();
-                        merchNotis.add(merchNoti);
-                    }
-                    //海关接口异常
-                    if (WxDict.ResponseMsgState.EXCEPT.getItem().equals(wxResponseMsgDto.getState())) {
-                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
-
-                        MerchNoti merchNoti = builder.code(WxContants.ERROR_EXCEPT)
-                                .msg("海关接口异常")
                                 .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
                                 .build();
                         merchNotis.add(merchNoti);
                     }
-                    wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
                 }
+                ///返回状态码为失败
+                if (WxContants.RETURN_CODE_FAIL.equals(wxResponseMsgDto.getReturnCode()) ||
+                        WxContants.FAIL.equals(wxResponseMsgDto.getReturnCode())) {
+                    wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
 
-                //返回状态码为成功 业务结果失败
-                if (WxContants.SUCCESS.equals(wxResponseMsgDto.getReturnCode())
-                        && WxContants.FAIL.equals(wxResponseMsgDto.getResultCode())) {
-                    wxCbPayDoc.setErrCode(wxResponseMsgDto.getErrCode());
-                    wxCbPayDoc.setErrCodeDes(wxResponseMsgDto.getErrCodeDes());
-                    wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_12.getItem());
                     wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
 
-                    MerchNoti merchNoti = builder.code(wxResponseMsgDto.getErrCode())
-                            .msg(wxResponseMsgDto.getErrCodeDes())
+                    //通知商户
+                    MerchNoti merchNoti = builder.code(WxContants.ERROR_FAIL)
+                            .msg(wxResponseMsgDto.getReturnMsg())
                             .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
                             .build();
                     merchNotis.add(merchNoti);
@@ -301,7 +281,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         //持久化商户通知数据
         try {
             int result = merchNotiService.insertBatch(merchNotis);
-            if (result < 0) {
+            if (result == 0) {
                 logger.error("持久化" + result + "条商户通知数据失败data:" + merchNotis);
                 throw new Exception("持久化" + result + "条商户通知数据失败data:" + merchNotis);
             }
@@ -313,7 +293,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         try {
             if (errors != null && !errors.isEmpty()) {
                 int errResult = wxPayErrorService.insertWxPayErrorBatch(errors);
-                if (errResult < 0) {
+                if (errResult == 0) {
                     logger.error("持久化支付申报异常信息数据失败data:" + errors);
                     throw new Exception("持久化支付申报异常信息数据失败data:" + errors);
                 }
@@ -356,8 +336,6 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
      * @return
      */
     protected Map<String, String> assemblyDeclareXml(WxCbPayDoc wxCbPayDoc, String key) {
-
-
         //1.选择报关数据,排序
         SortedMap<String, String> sorted = Maps.newTreeMap();
         sorted.put("appid", wxCbPayDoc.getAppid());
@@ -414,10 +392,10 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
 
         String queryURL = "https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclarequery";
         WxCbPayDoc wxCbPayDoc = new WxCbPayDoc();
-        wxCbPayDoc.setAppid("wx24013b34e349db3c");
+        wxCbPayDoc.setAppid("125453");
         wxCbPayDoc.setMchId("1501125641");
-        wxCbPayDoc.setOutTradeNo("670219011050");
-        wxCbPayDoc.setTransactionId("4200000137201805171532382342");
+        wxCbPayDoc.setOutTradeNo("701415011050");
+        wxCbPayDoc.setTransactionId("4200000114201805234418784392");
         wxCbPayDoc.setCustoms("SHENZHEN");
         wxCbPayDoc.setMchCustomsNo("4403160Z3Y");//中网科技(深圳)有限公司
 
@@ -428,11 +406,11 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         sorted.put("out_trade_no", wxCbPayDoc.getOutTradeNo());
         sorted.put("transaction_id", wxCbPayDoc.getTransactionId());
         sorted.put("customs", wxCbPayDoc.getCustoms());
-        sorted.put("mch_customs_no", wxCbPayDoc.getMchCustomsNo());
+//        sorted.put("mch_customs_no", wxCbPayDoc.getMchCustomsNo());
         //sorted.put("action_type", "MODIFY ");
-        sorted.put("cert_type", "IDCARD");
-        sorted.put("cert_id", "440301198012261939");
-        sorted.put("name", "司晓峰");
+//        sorted.put("cert_type", "IDCARD");
+//        sorted.put("cert_id", "440301198012261939");
+//        sorted.put("name", "司晓峰");
 
 
         //2.生成签名
@@ -451,7 +429,7 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
         System.out.println("xml:"+xml);
 
         //通过http post请求 发送xml数据
-        Request request = OkHttpUtils.buildRequest("https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder",
+        Request request = OkHttpUtils.buildRequest(queryURL,
                 RequestBody.create(MediaType.parse("application/xml; charset=utf-8"), xml));
         String result = null;
         try {
@@ -462,10 +440,14 @@ public class WxCusDeclareBiz extends AbstractCusDeclareBiz implements CuspayBiz
 
 
 
-        StringReader reader = new StringReader(result);
+        System.out.println(result);
+        System.out.println(ReaderXmlForDOM4J.parse(result,1));
 
-        WxResponseMsg wxResponseMsg = JAXB.unmarshal(reader, WxResponseMsg.class);
+        StringReader reader = new StringReader(result);
+        WxQueryResponseMsg wxResponseMsg = JAXB.unmarshal(reader, WxQueryResponseMsg.class);
 
         System.out.println(wxResponseMsg);
+
     }
+
 }

+ 354 - 0
src/main/java/com/emato/cuspay/biz/wx/WxCusDeclareQueryBiz.java

@@ -0,0 +1,354 @@
+package com.emato.cuspay.biz.wx;
+
+import com.emato.cuspay.biz.CuspayBiz;
+import com.emato.cuspay.common.contant.MerchNoticeDict;
+import com.emato.cuspay.common.contant.TablePrimaryKeyPrefix;
+import com.emato.cuspay.common.core.db.IdWorkerAide;
+import com.emato.cuspay.entity.merch.MerchNoti;
+import com.emato.cuspay.entity.merch.MerchPayCfg;
+import com.emato.cuspay.service.MerchNotiService;
+import com.emato.cuspay.util.OkHttpUtils;
+import com.emato.cuspay.util.ReaderXmlForDOM4J;
+import com.emato.cuspay.util.XmlUtils;
+import com.emato.cuspay.wx.common.MerchNotiBuilder;
+import com.emato.cuspay.wx.common.WxContants;
+import com.emato.cuspay.wx.common.WxDict;
+import com.emato.cuspay.wx.dto.WxQueryResponseMsg;
+import com.emato.cuspay.wx.dto.WxQuerySuccessResponseMsgDto;
+import com.emato.cuspay.wx.dto.WxResponseMsg;
+import com.emato.cuspay.wx.entity.WxCbPayDoc;
+import com.emato.cuspay.wx.entity.WxPayError;
+import com.emato.cuspay.wx.service.WxCbPayDocService;
+import com.emato.cuspay.wx.service.WxPayErrorService;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import okhttp3.MediaType;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+
+import javax.xml.bind.JAXB;
+import java.io.IOException;
+import java.io.StringReader;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.SortedMap;
+
+/**
+ * 微信订单信息查询
+ * @author hyq
+ * @version 1.0
+ * 2018-05-23 17:46
+ */
+@Component
+public class WxCusDeclareQueryBiz extends AbstractCusDeclareBiz implements CuspayBiz {
+    private static final Logger logger = LoggerFactory.getLogger(WxCusDeclareQueryBiz.class);
+
+    @Value("${db.wx.declare.limit}")
+    private Integer limit;
+
+    @Value("${db.wx.declare.count}")
+    private Integer count;
+
+    @Value("${wx.payment.query.url}")
+    private String queryURL;
+
+    @Autowired
+    private WxCbPayDocService wxCbPayDocService;
+
+    @Autowired
+    private WxPayErrorService wxPayErrorService;
+
+    @Autowired
+    private MerchNotiService merchNotiService;
+
+    /**
+     * 微信订单信息查询
+     */
+    public void biz() {
+        limit = (limit != null && limit > 0) ? limit : 20;
+        count = (count != null && count > 0) ? count : 10;
+
+        //查出等待处理、业务处理中的支付单证信息
+        List<WxCbPayDoc> wxCbPayDocs = null;
+        try {
+            wxCbPayDocs = wxCbPayDocService.selectPayDocByDocStatus(limit);
+            if (wxCbPayDocs == null || wxCbPayDocs.isEmpty()) {
+                logger.info("未查到等待处理、业务处理中微信推海关的支付数据");
+                return;
+            }
+        } catch (Exception e) {
+            logger.error("查询等待处理、业务处理中微信推海关的支付数据异常", e);
+            return;
+        }
+
+        //请求微信查询接口
+
+        //记录异常数据
+        List<WxPayError> errorList = Lists.newArrayList();
+
+        wxCbPayDocs.forEach(wxCbPayDoc -> {
+            //获取商户信息 从缓存中去  缓存不存在 从数据库重取
+            MerchPayCfg merchPayCfg = getMerchPayCfgCache(wxCbPayDoc.getMerchSn());
+
+            MerchNotiBuilder builder = new MerchNotiBuilder();
+
+            //设置支付信息
+            builder.wxCbPay(wxCbPayDoc);
+            //设置通知次数
+            builder.notiCount(count);
+
+            if (merchPayCfg == null) {
+                wxCbPayDoc.setReturnCode("FAIL");
+                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在");
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
+                wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付配置信息不存在 ");
+                return;
+            }
+
+            if (merchPayCfg.getMerchWxApiKey() == null) {
+                wxCbPayDoc.setReturnCode(WxContants.ERROR_NO_INFOMATION);
+                wxCbPayDoc.setReturnMsg("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空");
+                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
+                wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+                logger.error("商户编号为【"+wxCbPayDoc.getMerchSn()+"】的商户支付信息api密钥为空 ");
+                return;
+            }
+            //设置商户配置信息
+            builder.merchPay(merchPayCfg);
+
+            //组装xml 格式数据
+            String xml = XmlUtils.map2Xml(assemblyDeclareQueryXml(wxCbPayDoc, merchPayCfg.getMerchWxApiKey()));
+            logger.info("微信查询订单请求数xml据为:"+xml);
+
+            //通过http post请求 发送xml数据
+            Request request = OkHttpUtils.buildRequest(queryURL,
+                    RequestBody.create(MediaType.parse("application/xml; charset=utf-8"), xml));
+
+            WxQueryResponseMsg wxQueryResponseMsg = null;
+            String result = "";
+            try {
+                result = OkHttpUtils.post(request);
+                StringReader reader = new StringReader(result);
+                wxQueryResponseMsg = JAXB.unmarshal(reader, WxQueryResponseMsg.class);
+                logger.info("请求微信查询订单接口返回result:"+result + ";xml:"+wxQueryResponseMsg);
+                if (wxQueryResponseMsg == null) {
+                    throw new IOException("http请求["+queryURL+"]响应结果为空" );
+                }
+            } catch (IOException e) {
+                logger.error("数据请求异常,查询订单请求数据为xml{}", xml, e);
+                WxPayError wxPayError = createWxPayError(wxCbPayDoc);
+                errorList.add(wxPayError);
+            }
+            MerchNoti merchNoti = new MerchNoti();
+            try {
+                //返回状态码为成功
+                if(WxContants.SUCCESS.equals(wxQueryResponseMsg.getReturnCode())){
+
+                    wxCbPayDoc.setResultCode(wxQueryResponseMsg.getResultCode());
+                    wxCbPayDoc.setReturnCode(wxQueryResponseMsg.getReturnCode());
+                    wxCbPayDoc.setReturnMsg(wxQueryResponseMsg.getReturnMsg());
+                    //业务状态码为成功
+                    if(WxContants.SUCCESS.equals(wxQueryResponseMsg.getResultCode())){
+                        wxCbPayDoc.setTransactionId(wxQueryResponseMsg.getTransactionId());
+
+                        //订购人与支付人校验结果
+                        if (wxCbPayDoc.getBuyerPayerCheck() != null) {
+                            if (MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem().equals(wxCbPayDoc.getBuyerPayerCheck())) { //未知
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_0.getItem());
+                            }
+                            if (MerchNoticeDict.BuyerPayerCheckStatus.i_1.getItem().equals(wxCbPayDoc.getBuyerPayerCheck())) {//一致
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_1.getItem());
+                            }
+                            if (MerchNoticeDict.BuyerPayerCheckStatus.i_2.getItem().equals(wxCbPayDoc.getBuyerPayerCheck())) {//不一致
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_2.getItem());
+                            }
+                            if(MerchNoticeDict.BuyerPayerCheckStatus.i_3.getItem().equals(wxCbPayDoc.getBuyerPayerCheck())){//校验异常
+                                builder.certCheckResult(MerchNoticeDict.BuyerPayerCheckStatus.i_3.getItem());
+                                wxCbPayDoc.setBuyerPayerCheck(MerchNoticeDict.BuyerPayerCheckStatus.i_3.getItem());
+                            }
+                        }
+
+                        int msgCount = wxQueryResponseMsg.getCount();
+                        for (int i = 0; i < msgCount; i++){
+                            //解析xml获取WxQuerySuccessResponseMsgDto
+                            WxQuerySuccessResponseMsgDto querySuccessResponseDto = ReaderXmlForDOM4J.parse(result, i);
+                            wxCbPayDoc.setSubOrderNo(querySuccessResponseDto.getSubOrderNo());
+                            wxCbPayDoc.setMchCustomsNo(querySuccessResponseDto.getMchCustomsNo());
+                            wxCbPayDoc.setCustoms(querySuccessResponseDto.getCustoms());
+                            wxCbPayDoc.setFeeType(querySuccessResponseDto.getFeeType());
+                            wxCbPayDoc.setOrderFee(querySuccessResponseDto.getOrderFee());
+                            wxCbPayDoc.setDuty(querySuccessResponseDto.getDuty());
+                            wxCbPayDoc.setTransportFee(querySuccessResponseDto.getTransportFee());
+                            wxCbPayDoc.setProductFee(querySuccessResponseDto.getProductFee());
+
+                            String state = querySuccessResponseDto.getState();
+
+                            if (WxDict.ResponseMsgState.UNDECLARED.getItem().equals(state)) {//返回状态未申报
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(WxDict.ResponseMsgState.UNDECLARED.getItemName())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_10.getItem())
+                                        .build();
+                            }else if (WxDict.ResponseMsgState.PROCESSING.getItem().equals(state)) {// 申报中
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_11.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(WxDict.ResponseMsgState.PROCESSING.getItemName())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                        .build();
+                            }else if(WxDict.ResponseMsgState.SUBMITTED.getItem().equals(state)) {//申报已提交
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_10.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(WxDict.ResponseMsgState.SUBMITTED.getItemName())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_11.getItem())
+                                        .build();
+
+                            }else if (WxDict.ResponseMsgState.SUCCESS.getItem().equals(state)) {//申报成功
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_12.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(wxQueryResponseMsg.getErrCodeDes())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_12.getItem())
+                                        .build();
+                            }else if (WxDict.ResponseMsgState.FAIL.getItem().equals(state)) {//申报失败
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(WxDict.ResponseMsgState.FAIL.getItemName())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                        .build();
+                            }else if (WxDict.ResponseMsgState.EXCEPT.getItem().equals(state)) {//海关接口异常
+                                wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                                merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                        .msg(WxDict.ResponseMsgState.EXCEPT.getItemName())
+                                        .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                        .build();
+                            }
+                        }
+                    }else{//业务状态码失败
+                        wxCbPayDoc.setErrCode(wxQueryResponseMsg.getErrCode());
+                        wxCbPayDoc.setErrCodeDes(wxQueryResponseMsg.getErrCodeDes());
+                        wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_13.getItem());
+
+                        merchNoti = builder.code(wxQueryResponseMsg.getErrCode())
+                                .msg(wxQueryResponseMsg.getErrCodeDes())
+                                .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                                .build();
+                    }
+                }
+                ///返回状态码为失败
+                if (WxContants.RETURN_CODE_FAIL.equals(wxQueryResponseMsg.getReturnCode()) ||
+                        WxContants.FAIL.equals(wxQueryResponseMsg.getReturnCode())) {
+                    wxCbPayDoc.setDocStatus(WxDict.PaymentDocStatus.i_03.getItem());
+                    //通知商户
+                    merchNoti = builder.code(WxContants.ERROR_FAIL)
+                            .msg(wxQueryResponseMsg.getReturnMsg())
+                            .cusDeclStatus(WxDict.MerchNoticeStatus.i_13.getItem())
+                            .build();
+                }
+
+                wxCbPayDocService.updateWxCbPay(wxCbPayDoc);
+            } catch (Exception e) {
+                logger.error("更新支付单证入库信息状态异常", e);
+                return;
+            }
+
+            List<MerchNoti> mchNotiList = null;
+            try {
+                mchNotiList = merchNotiService.getMerchNotiByCode(wxQueryResponseMsg.getErrCode());
+            } catch (Exception e) {
+                logger.error("根据code查询商户通知信息异常", e);
+                return;
+            }
+
+            try {
+                if(mchNotiList != null && mchNotiList.size() > 0){
+                    merchNoti.setNotiSn(mchNotiList.get(0).getNotiSn());
+                    merchNotiService.update(merchNoti);
+                }else{
+                    merchNotiService.insert(merchNoti);//有问题
+                }
+            } catch (Exception e) {
+                logger.error("操作商户通知数据异常", e);
+                WxPayError wxPayError = createWxPayError(wxCbPayDoc);
+                wxPayError.setErrMsg("操作商户通知数据异常");
+                errorList.add(wxPayError);
+            }
+        });
+        //存储异常记录
+        try {
+            if (errorList != null && !errorList.isEmpty()) {
+                int errResult = wxPayErrorService.insertWxPayErrorBatch(errorList);//有问题
+                if (errResult == 0) {
+                    logger.error("持久化支付申报异常数据失败data:" + errorList);
+                    throw new Exception("持久化支付申报异常数据失败data:" + errorList);
+                }
+            }
+        } catch (Exception e) {
+            logger.error("持久化支付申报异常数据失败data:" + errorList, e);
+            throw new RuntimeException("持久化支付申报异常数据失败data:",e);
+        }
+
+    }
+    /**
+     * 记录异常的支付单证信息
+     * @param wxCbPayDoc
+     * @return
+     */
+    private WxPayError createWxPayError(WxCbPayDoc wxCbPayDoc) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        WxPayError wxPayError = new WxPayError();
+        wxPayError.setErrorSn(TablePrimaryKeyPrefix.wx_pay_error_type + IdWorkerAide.nextId());
+        wxPayError.setWxPaySn(wxCbPayDoc.getTransactionId());
+        wxPayError.setMerchSn(wxCbPayDoc.getMerchSn());
+        wxPayError.setMerchName(wxCbPayDoc.getMerchName());
+        wxPayError.setAppid(wxCbPayDoc.getAppid());
+        wxPayError.setMchId(wxCbPayDoc.getMchId());
+        wxPayError.setOutTradeNo(wxCbPayDoc.getOutTradeNo());
+        wxPayError.setTransactionId(wxCbPayDoc.getTransactionId());
+        wxPayError.setSubOrderNo(wxCbPayDoc.getSubOrderNo());
+        wxPayError.setCustoms(wxCbPayDoc.getCustoms());
+        wxPayError.setErrCode(wxCbPayDoc.getErrCode());
+        wxPayError.setErrMsg(wxCbPayDoc.getReturnMsg());
+        wxPayError.getCreateTime(sdf.format(new Date()));
+        return  wxPayError;
+    }
+
+    /**
+     * 组装微信查询订单所需要的参数数据
+     * @param wxCbPayDoc 微信支付数据
+     * @param key 微信Api密钥
+     * @return
+     */
+    protected Map<String, String> assemblyDeclareQueryXml(WxCbPayDoc wxCbPayDoc, String key) {
+        //1.选择报关数据,排序
+        SortedMap<String, String> sorted = Maps.newTreeMap();
+        sorted.put("sign_type", "MD5");
+        sorted.put("appid", wxCbPayDoc.getAppid());
+        sorted.put("mch_id", wxCbPayDoc.getMchId());
+        sorted.put("out_trade_no", wxCbPayDoc.getOutTradeNo());
+        sorted.put("transaction_id", wxCbPayDoc.getTransactionId());
+        sorted.put("customs", wxCbPayDoc.getCustoms());
+
+        //2.生成签名
+        StringBuilder sb = new StringBuilder();
+        for (Map.Entry<String,String> entry : sorted.entrySet()) {
+            sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
+        }
+        sb.append("key").append("=").append(key);
+        //签名MD5 加密
+        String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase();
+
+        sorted.put("sign", sign);
+        return sorted;
+    }
+
+
+}

+ 2 - 1
src/main/java/com/emato/cuspay/common/contant/MerchNoticeDict.java

@@ -41,7 +41,8 @@ public abstract class MerchNoticeDict {
     public enum BuyerPayerCheckStatus {
         i_0("0", "未知"),
         i_1("1", "一致"),
-        i_2("2", "不一致");
+        i_2("2", "不一致"),
+        i_3("3", "校验异常");;
 
         private String item;
         private String itemName;

+ 2 - 0
src/main/java/com/emato/cuspay/dao/mapper/merch/MerchNotiMapper.java

@@ -24,4 +24,6 @@ public interface MerchNotiMapper {
     int insertBatch(List<MerchNoti> records);
 
     int updateBatch(List<MerchNoti> records);
+
+    List<MerchNoti> getMerchNotiByCode(String code);
 }

+ 2 - 0
src/main/java/com/emato/cuspay/dao/mapper/wx/WxCbPayDocMapper.java

@@ -22,4 +22,6 @@ public interface WxCbPayDocMapper {
     int insertBatch(List<WxCbPayDoc> records);
 
     int updateBatch(List<WxCbPayDoc> records);
+
+    List<WxCbPayDoc> selectPayDocByDocStatus(Integer limit);
 }

+ 6 - 0
src/main/java/com/emato/cuspay/service/MerchNotiService.java

@@ -17,4 +17,10 @@ public interface MerchNotiService {
      * @return
      */
     int insertBatch(List<MerchNoti> merchNotis);
+
+    List<MerchNoti> getMerchNotiByCode(String code);
+
+    int insert(MerchNoti merchNoti);
+
+    int update(MerchNoti merchNoti);
 }

+ 13 - 0
src/main/java/com/emato/cuspay/service/impl/MerchNotiServiceImpl.java

@@ -24,4 +24,17 @@ public class MerchNotiServiceImpl implements MerchNotiService {
     public int insertBatch(List<MerchNoti> merchNotis) {
         return merchNotiMapper.insertBatch(merchNotis);
     }
+
+
+    public List<MerchNoti> getMerchNotiByCode(String code) {
+        return merchNotiMapper.getMerchNotiByCode(code);
+    }
+
+    public int insert(MerchNoti merchNoti){
+        return merchNotiMapper.insertSelective(merchNoti);
+    }
+
+    public int update(MerchNoti merchNoti){
+        return merchNotiMapper.updateByPrimaryKeySelective(merchNoti);
+    }
 }

+ 7 - 0
src/main/java/com/emato/cuspay/task/CuspayTask.java

@@ -2,6 +2,7 @@ package com.emato.cuspay.task;
 
 import com.emato.cuspay.biz.merch.MerchantNoticeBiz;
 import com.emato.cuspay.biz.wx.WxCusDeclareBiz;
+import com.emato.cuspay.biz.wx.WxCusDeclareQueryBiz;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -20,6 +21,9 @@ public class CuspayTask {
     @Autowired
     private WxCusDeclareBiz wxCusDeclareBiz;
 
+    @Autowired
+    private WxCusDeclareQueryBiz wxCusDeclareQueryBiz;
+
     @Scheduled(fixedRate = 10000)
     public void task() {
         //支付海关报关
@@ -28,5 +32,8 @@ public class CuspayTask {
         //商户通知请求回执
         merchantNoticeBiz.biz();
 
+        //查询微信订单信息
+//        wxCusDeclareQueryBiz.biz();
+
     }
 }

+ 90 - 0
src/main/java/com/emato/cuspay/util/ReaderXmlForDOM4J.java

@@ -0,0 +1,90 @@
+package com.emato.cuspay.util;
+
+import com.emato.cuspay.wx.dto.WxQuerySuccessResponseMsgDto;
+import com.google.common.collect.Lists;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * 获取请求微信订单查询接口返回xml中的state
+ * @author huangyq
+ * @version 1.0
+ * 2018-05-24 15:53
+ */
+public class ReaderXmlForDOM4J {
+
+    public static WxQuerySuccessResponseMsgDto parse(String protocolXML, int count) {
+        try {
+            WxQuerySuccessResponseMsgDto querySuccessResponseDto = new WxQuerySuccessResponseMsgDto();
+            Document doc=(Document) DocumentHelper.parseText(protocolXML);
+            Element books = doc.getRootElement();
+            // Iterator users_subElements = books.elementIterator("UID");//指定获取那个元素
+            Iterator Elements = books.elementIterator();
+            while(Elements.hasNext()){
+                Element user = (Element)Elements.next();
+                String state ="state_"+(count);
+                String subOrderNo ="sub_order_no_"+(count);
+                String subOrderId ="sub_order_id_"+(count);
+                String mchCustomsNo ="mch_customs_no_"+(count);
+                String customs ="customs_"+(count);
+                String feeType ="fee_type_"+(count);
+                String orderFee ="order_fee_"+(count);
+                String duty ="duty_"+(count);
+                String transportFee ="transport_fee_"+(count);
+                String productFee ="product_fee_"+(count);
+                String explanation ="explanation_"+(count);
+                String modifyTime ="modify_time_"+(count);
+                String certCheckResult ="cert_check_result_"+(count);
+                if(state.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setState(user.getText());
+                }
+                if(subOrderNo.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setSubOrderNo(user.getText());
+                }
+                if(subOrderId.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setSubOrderId(user.getText());
+                }
+                if(mchCustomsNo.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setMchCustomsNo(user.getText());
+                }
+                if(customs.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setCustoms(user.getText());
+                }
+                if(feeType.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setFeeType(user.getText());
+                }
+                if(orderFee.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setOrderFee(Integer.parseInt(user.getText()));
+                }
+                if(duty.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setDuty(Integer.parseInt(user.getText()));
+                }
+                if(transportFee.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setTransportFee(Integer.parseInt(user.getText()));
+                }
+                if(productFee.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setProductFee(Integer.parseInt(user.getText()));
+                }
+                if(explanation.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setExplanation(user.getText());
+                }
+                if(modifyTime.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setModifyTime(user.getText());
+                }
+                if(certCheckResult.equalsIgnoreCase(user.getName())){
+                    querySuccessResponseDto.setCertCheckResult(user.getText());
+                }
+
+                return querySuccessResponseDto;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+}

+ 3 - 2
src/main/java/com/emato/cuspay/wx/common/WxDict.java

@@ -15,8 +15,9 @@ public abstract class WxDict {
         i_01("01", "申报中"),
         i_03("03", "申报失败"),
         i_10("10", "等待处理"),
-        i_11("11","业务成功"),
-        i_12("12", "业务处理失败");
+        i_11("11","业务处理中"),
+        i_12("12","业务成功"),
+        i_13("13", "业务处理失败");
 
 
 

+ 147 - 0
src/main/java/com/emato/cuspay/wx/dto/WxQueryResponseMsg.java

@@ -0,0 +1,147 @@
+package com.emato.cuspay.wx.dto;
+
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
+/**
+ * 微信查询订单响应数据实体类
+ */
+@XmlRootElement(name = "xml")
+public class WxQueryResponseMsg {
+	//返回状态码
+	private String returnCode;
+	//返回信息
+	private String returnMsg;
+	//签名类型
+	private String signType;
+	//签名
+	private String sign;
+	//公众号ID
+	private String appid;
+	//商户号
+	private String mchId;
+	//业务结果
+	private String resultCode;
+	//错误代码
+	private String errCode;
+	//错误代码描述
+	private String errCodeDes;
+	//微信支付订单号
+	private String transactionId;
+	//笔数
+	private int count;
+
+	@Override
+	public String toString() {
+		return "WxResponseMsg{" +
+				"returnCode='" + returnCode + '\'' +
+				", returnMsg='" + returnMsg + '\'' +
+				", signType='" + signType + '\'' +
+				", sign='" + sign + '\'' +
+				", appid='" + appid + '\'' +
+				", mchId='" + mchId + '\'' +
+				", resultCode='" + resultCode + '\'' +
+				", errCode='" + errCode + '\'' +
+				", errCodeDes='" + errCodeDes + '\'' +
+				", transactionId='" + transactionId + '\'' ;
+	}
+
+	@XmlElement(name = "return_code")
+	public String getReturnCode() {
+		return returnCode;
+	}
+
+	public void setReturnCode(String returnCode) {
+		this.returnCode = returnCode;
+	}
+
+	@XmlElement(name = "return_msg")
+	public String getReturnMsg() {
+		return returnMsg;
+	}
+
+	public void setReturnMsg(String returnMsg) {
+		this.returnMsg = returnMsg;
+	}
+
+	@XmlElement(name = "sign_type")
+	public String getSignType() {
+		return signType;
+	}
+
+	public void setSignType(String signType) {
+		this.signType = signType;
+	}
+
+	@XmlElement(name = "sign")
+	public String getSign() {
+		return sign;
+	}
+
+	public void setSign(String sign) {
+		this.sign = sign;
+	}
+
+	@XmlElement(name = "appid")
+	public String getAppid() {
+		return appid;
+	}
+
+	public void setAppid(String appid) {
+		this.appid = appid;
+	}
+
+	@XmlElement(name = "mch_id")
+	public String getMchId() {
+		return mchId;
+	}
+
+	public void setMchId(String mchId) {
+		this.mchId = mchId;
+	}
+
+	@XmlElement(name = "result_code")
+	public String getResultCode() {
+		return resultCode;
+	}
+
+	public void setResultCode(String resultCode) {
+		this.resultCode = resultCode;
+	}
+
+	@XmlElement(name = "err_code")
+	public String getErrCode() {
+		return errCode;
+	}
+
+	public void setErrCode(String errCode) {
+		this.errCode = errCode;
+	}
+
+	@XmlElement(name = "err_code_des")
+	public String getErrCodeDes() {
+		return errCodeDes;
+	}
+
+	public void setErrCodeDes(String errCodeDes) {
+		this.errCodeDes = errCodeDes;
+	}
+
+	@XmlElement(name = "transaction_id")
+	public String getTransactionId() {
+		return transactionId;
+	}
+
+	public void setTransactionId(String transactionId) {
+		this.transactionId = transactionId;
+	}
+
+	@XmlElement(name = "count")
+	public int getCount() {
+		return count;
+	}
+
+	public void setCount(int count) {
+		this.count = count;
+	}
+}

+ 162 - 0
src/main/java/com/emato/cuspay/wx/dto/WxQuerySuccessResponseMsgDto.java

@@ -0,0 +1,162 @@
+package com.emato.cuspay.wx.dto;
+
+/**
+ * 微信查询订单响应成功后数据实体类
+ * @author huangyq
+ * @version 1.0
+ * 2018-05-24 16:55
+ */
+public class WxQuerySuccessResponseMsgDto {
+    //商户子订单号
+    private String subOrderNo;
+    //微信子订单号
+    private String subOrderId;
+    //商户海关备案号
+    private String mchCustomsNo;
+    //海关
+    private String customs;
+    //币种
+    private String feeType;
+    //应付金额
+    private int orderFee;
+    //关税
+    private int duty;
+    //物流费
+    private int transportFee;
+    //商品价格
+    private int productFee;
+    //状态码
+    private String state;
+    //申报结果说明
+    private String explanation;
+    //最后更新时间
+    private String modifyTime;
+    //订购人和支付人 校验结果
+    private String certCheckResult;
+
+    @Override
+    public String toString() {
+        return "WxResponseMsg{" +
+                "  state='" + state + '\'' +
+                ", subOrderNo='" + subOrderNo + '\'' +
+                ", subOrderId='" + subOrderId + '\'' +
+
+                ", mchCustomsNo='" + mchCustomsNo + '\'' +
+                ", customs='" + customs + '\'' +
+                ", feeType='" + feeType + '\'' +
+                ", orderFee='" + orderFee + '\'' +
+                ", duty='" + duty + '\'' +
+                ", transportFee='" + transportFee + '\'' +
+                ", productFee='" + productFee + '\'' +
+                ", explanation='" + explanation + '\'' +
+
+                ", modifyTime='" + modifyTime + '\'' +
+                ", certCheckResult='" + certCheckResult + '\'' +
+                '}';
+    }
+
+
+    public String getState() {
+        return state;
+    }
+
+    public void setState(String state) {
+        this.state = state;
+    }
+
+    public String getSubOrderNo() {
+        return subOrderNo;
+    }
+
+    public void setSubOrderNo(String subOrderNo) {
+        this.subOrderNo = subOrderNo;
+    }
+
+    public String getSubOrderId() {
+        return subOrderId;
+    }
+
+    public void setSubOrderId(String subOrderId) {
+        this.subOrderId = subOrderId;
+    }
+
+    public String getModifyTime() {
+        return modifyTime;
+    }
+
+    public void setModifyTime(String modifyTime) {
+        this.modifyTime = modifyTime;
+    }
+
+    public String getCertCheckResult() {
+        return certCheckResult;
+    }
+
+    public void setCertCheckResult(String certCheckResult) {
+        this.certCheckResult = certCheckResult;
+    }
+
+    public String getMchCustomsNo() {
+        return mchCustomsNo;
+    }
+
+    public void setMchCustomsNo(String mchCustomsNo) {
+        this.mchCustomsNo = mchCustomsNo;
+    }
+
+    public String getCustoms() {
+        return customs;
+    }
+
+    public void setCustoms(String customs) {
+        this.customs = customs;
+    }
+
+    public String getFeeType() {
+        return feeType;
+    }
+
+    public void setFeeType(String feeType) {
+        this.feeType = feeType;
+    }
+
+    public int getOrderFee() {
+        return orderFee;
+    }
+
+    public void setOrderFee(int orderFee) {
+        this.orderFee = orderFee;
+    }
+
+    public int getDuty() {
+        return duty;
+    }
+
+    public void setDuty(int duty) {
+        this.duty = duty;
+    }
+
+    public int getTransportFee() {
+        return transportFee;
+    }
+
+    public void setTransportFee(int transportFee) {
+        this.transportFee = transportFee;
+    }
+
+    public int getProductFee() {
+        return productFee;
+    }
+
+    public void setProductFee(int productFee) {
+        this.productFee = productFee;
+    }
+
+    public String getExplanation() {
+        return explanation;
+    }
+
+    public void setExplanation(String explanation) {
+        this.explanation = explanation;
+    }
+}

+ 10 - 0
src/main/java/com/emato/cuspay/wx/entity/WxCbPayDoc.java

@@ -86,12 +86,22 @@ public class WxCbPayDoc implements Serializable {
 
     private String merchErpOrderSn;
 
+    private String buyerPayerCheck;
+
     private static final long serialVersionUID = 1L;
 
     public WxCbPayDoc() {
         super();
     }
 
+    public String getBuyerPayerCheck() {
+        return buyerPayerCheck;
+    }
+
+    public void setBuyerPayerCheck(String buyerPayerCheck) {
+        this.buyerPayerCheck = buyerPayerCheck == null ? null : buyerPayerCheck.trim();
+    }
+
     public String getMerchErpOrderSn() {
         return merchErpOrderSn;
     }

+ 7 - 0
src/main/java/com/emato/cuspay/wx/service/WxCbPayDocService.java

@@ -41,4 +41,11 @@ public interface WxCbPayDocService {
      */
     int updateBatch(List<WxCbPayDoc> wxCbPayDocs);
 
+    /**
+     * 查找微信推海关 等待处理、业务处理中的数据
+     * @param limit
+     * @return
+     */
+    List<WxCbPayDoc> selectPayDocByDocStatus(Integer limit);
+
 }

+ 4 - 0
src/main/java/com/emato/cuspay/wx/service/impl/WxCbPayDocServiceImpl.java

@@ -91,4 +91,8 @@ public class WxCbPayDocServiceImpl implements WxCbPayDocService {
     public int updateBatch(List<WxCbPayDoc> wxCbPayDocs) {
         return  wxCbPayDocMapper.updateBatch(wxCbPayDocs);
     }
+
+    public List<WxCbPayDoc> selectPayDocByDocStatus(Integer limit) {
+        return wxCbPayDocMapper.selectPayDocByDocStatus(limit);
+    }
 }

+ 77 - 0
src/main/resources/application-test.yml

@@ -0,0 +1,77 @@
+#---------- Spring Boot 项目 ----------#
+# 测试环境服务配置
+server:
+    address: 192.168.1.251
+    port: 9999
+
+
+# 使用环境
+spring:
+    profiles: test
+
+
+    # 测试环境rabbitmq配置
+    rabbitmq:
+        host: 192.168.1.248
+        port: 5672
+        username: guest
+        password: guest
+        virtual-host: /
+        # Requested heartbeat timeout, in seconds; zero for none.
+        requested-heartbeat: 50
+        cache:
+            channel:
+                size: 50
+
+
+    # 数据源
+    datasource:
+        primary:
+            # 数据源zaxxer HikariCP
+            type: com.zaxxer.hikari.HikariDataSource
+            driver-class-name: org.mariadb.jdbc.Driver
+            url: jdbc:mysql://192.168.1.251:3306/cuspay?useSSL=false&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull
+            username: ceshi
+            password: abc-123
+            # hikari连接池配置
+            hikari:
+                connection-timeout: 10000
+                validation-timeout: 5000
+                idle-timeout: 600000
+                max-lifetime: 1200000
+                maximum-pool-size: 3
+                minimum-idle: 3
+
+
+redis:
+    # JedisCluster
+    jedis-cluster:
+        # Redis Cluster 主机列表
+        redis-cluster-host-list:
+            - host: 192.168.1.248
+              port: 7000
+            - host: 192.168.1.248
+              port: 7001
+            - host: 192.168.1.248
+              port: 7002
+            - host: 192.168.1.249
+              port: 7003
+            - host: 192.168.1.249
+              port: 7004
+            - host: 192.168.1.249
+              port: 7005
+        # 连接超时时间(秒), 默认 2*1000
+        connection-timeout: 5000
+        # so-timeout:
+        # 最大重试次数
+        max-attempts: 5
+        # password:
+        pool-config:
+            # 连接池管理的对象实例最大数, 默认 8
+            max-total: 8
+            # 连接池中最大闲置连接数, 默认 8
+            max-idle: 8
+            # 连接池中最小闲置连接数, 默认 0
+            min-idle: 0
+
+

+ 6 - 6
src/main/resources/logback.xml

@@ -6,7 +6,7 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
 -->
 <configuration scan="false" scanPeriod="60 seconds" debug="false">
 
-    <property name="LOG_HOME" value="d:/logs/ccnet-weimob"/>
+    <property name="LOG_HOME" value="/data/project/logs/cuspay/"/>
     <!-- 定义日志的根目录 -->
     <property name="TRACE_DIR" value="trace" />
     <property name="DEBUG_DIR" value="debug" />
@@ -14,11 +14,11 @@ debug:当此属性设置为true时,将打印出logback内部日志信息,
     <property name="WARN_DIR" value="warn" />
     <property name="ERROR_DIR" value="error" />
     <!-- 定义日志文件名称 -->
-    <property name="TRACE_FILE_NAME" value="ccnet-weimob-trace"></property>
-    <property name="DEBUG_FILE_NAME" value="ccnet-weimob-debug"></property>
-    <property name="INFO_FILE_NAME" value="ccnet-weimob-info"></property>
-    <property name="WARN_FILE_NAME" value="ccnet-weimob-warn"></property>
-    <property name="ERROR_FILE_NAME" value="ccnet-weimob-error"></property>
+    <property name="TRACE_FILE_NAME" value="cuspay-trace"></property>
+    <property name="DEBUG_FILE_NAME" value="cuspay-debug"></property>
+    <property name="INFO_FILE_NAME" value="cuspay-info"></property>
+    <property name="WARN_FILE_NAME" value="cuspay-warn"></property>
+    <property name="ERROR_FILE_NAME" value="cuspay-error"></property>
 
     <!-- 定义日志级别颜色 -->
     <property name="CONSOLE_LOG_PATTERN"

+ 7 - 0
src/main/resources/mybatis/mapper/MerchNotiMapper.xml

@@ -43,6 +43,13 @@
     from merch_noti
     where noti_sn = #{notiSn,jdbcType=VARCHAR}
   </select>
+  <select id="getMerchNotiByCode" resultMap="BaseResultMap" parameterType="java.lang.String" >
+    select
+    <include refid="Base_Column_List" />
+    from merch_noti
+    where code = #{code,jdbcType=VARCHAR}
+  </select>
+
   <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
     delete from merch_noti
     where noti_sn = #{notiSn,jdbcType=VARCHAR}

+ 19 - 1
src/main/resources/mybatis/mapper/wx/WxCbPayDocMapper.xml

@@ -43,6 +43,7 @@
     <result column="ex_field4" property="exField4" jdbcType="VARCHAR" />
     <result column="ex_field5" property="exField5" jdbcType="VARCHAR" />
     <result column="merch_erp_order_sn" property="merchErpOrderSn" jdbcType="VARCHAR" />
+    <result column="buyer_payer_check" property="buyerPayerCheck" jdbcType="VARCHAR" />
   </resultMap>
   <sql id="Base_Column_List" >
     wx_pay_sn, merch_sn, merch_name, merch_erp_order_sn, plat_sn, plat_name, third_party_merch_code, third_party_merch_name,
@@ -50,7 +51,7 @@
     sub_order_no, fee_type, order_fee, transport_fee, product_fee, cert_type, cert_id, 
     name, doc_status, remark, return_code, return_msg, result_code, err_code, err_code_des,
     creater_sn, create_time, moder_sn, mod_time, tstm, ex_field, ex_field2, ex_field3, 
-    ex_field4, ex_field5
+    ex_field4, ex_field5, buyer_payer_check
   </sql>
 
   <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
@@ -79,6 +80,9 @@
       <if test="merchErpOrderSn != null" >
         merch_erp_order_sn,
       </if>
+      <if test="buyerPayerCheck != null" >
+        buyer_payer_check,
+      </if>
       <if test="platSn != null" >
         plat_sn,
       </if>
@@ -330,6 +334,9 @@
       <if test="merchErpOrderSn != null" >
         merch_erp_order_sn = #{merchErpOrderSn,jdbcType=VARCHAR},
       </if>
+      <if test="buyerPayerCheck != null" >
+        buyer_payer_check = #{buyerPayerCheck,jdbcType=VARCHAR},
+      </if>
       <if test="platSn != null" >
         plat_sn = #{platSn,jdbcType=VARCHAR},
       </if>
@@ -460,6 +467,7 @@
       merch_sn,
       merch_name,
       merch_erp_order_sn,
+      buyer_payer_check,
       plat_sn,
       plat_name,
       third_party_merch_code,
@@ -557,6 +565,9 @@
         <if test="item.merchErpOrderSn != null" >
           merch_erp_order_sn = #{item.merchErpOrderSn,jdbcType=VARCHAR},
         </if>
+        <if test="item.buyerPayerCheck != null" >
+          buyer_payer_check = #{item.buyerPayerCheck,jdbcType=VARCHAR},
+        </if>
         <if test="item.platSn != null" >
           plat_sn = #{item.platSn,jdbcType=VARCHAR},
         </if>
@@ -672,4 +683,11 @@
       where wx_pay_sn = #{item.wxPaySn,jdbcType=VARCHAR}
     </foreach>
   </update>
+
+  <select id="selectPayDocByDocStatus" resultMap="BaseResultMap" parameterType="java.lang.Integer">
+    select
+    <include refid="Base_Column_List" />
+    from wx_cb_pay_doc
+    where doc_status in ('10','11') limit #{limit}
+  </select>
 </mapper>