diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
index c54c0a1..2f2af64 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/Util/DlpayUtil.java
@@ -19,6 +19,9 @@
   public static final String OPTYPE_PAYREFUND = "payrefund"; //消费退款
   public static final String OPTYPE_QUERYRESULT = "queryresult"; //消费结果查询
   public static final String OPTYPE_CHKDTL = "chkdtl"; //流水对账
+  public static final String OPTYPE_CHK_MAKESURE = "chkmakesure"; //流水对账
+  public static final String OPTYPE_BANKCARD_LOSS = "bankcardloss"; //流水对账
+
 
   public static final String TRANSTYPE_SIGNCARD = "1"; //签约
 
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
index bc5954f..c1b8ca5 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/bean/DlpayReq.java
@@ -38,6 +38,10 @@
   private String captcha; //签约验证码
   private String scenario;//消费场景
 
+  private String stltrxdate; //（核心记账日期）不允许为当前营业日期
+  private Long stlamt; //清算金额
+  private Integer jnlcount; //交易流水笔数
+
   /**
    * 市民卡绑定请求XML
    */
@@ -158,6 +162,43 @@
     return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
   }
 
+  /**
+   * 对账确认接口请求报文
+   * */
+  public String getChkMakeSureXml() throws UnsupportedEncodingException {
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(transcode).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<STLTRXDATE>").append(stltrxdate).append("</STLTRXDATE>")
+        .append("<STLAMT>").append(stlamt/100.00).append("</STLAMT>")
+        .append("<JNLCOUNT>").append(jnlcount).append("</JNLCOUNT>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
+  }
+
+  /**
+   * 银行口挂请求报文
+   * */
+  public String getLossBankcardXml()throws UnsupportedEncodingException {
+    StringBuffer xml = new StringBuffer();
+    xml.append(prefix)
+        .append("<root>")
+        .append("<TRANSCODE>").append(transcode).append("</TRANSCODE>")
+        .append("<TRANSDATE>").append(transdate).append("</TRANSDATE>")
+        .append("<TRANSTIME>").append(transtime).append("</TRANSTIME>")
+        .append("<SN>").append(sn).append("</SN>")
+        .append("<BC_NO>").append(bcNo).append("</BC_NO>")
+        .append("<NAME>").append(name).append("</NAME>")
+        .append("<ID_TYPE>").append(idType).append("</ID_TYPE>")
+        .append("<ID_NO>").append(idNo).append("</ID_NO>")
+        .append("</root>");
+    return String.format("%08d", xml.toString().getBytes("GBK").length) + xml.toString();
+  }
+
   public String getTransdate() {
     return transdate;
   }
@@ -309,4 +350,28 @@
   public void setScenario(String scenario) {
     this.scenario = scenario;
   }
+
+  public String getStltrxdate() {
+    return stltrxdate;
+  }
+
+  public void setStltrxdate(String stltrxdate) {
+    this.stltrxdate = stltrxdate;
+  }
+
+  public Long getStlamt() {
+    return stlamt;
+  }
+
+  public void setStlamt(Long stlamt) {
+    this.stlamt = stlamt;
+  }
+
+  public Integer getJnlcount() {
+    return jnlcount;
+  }
+
+  public void setJnlcount(Integer jnlcount) {
+    this.jnlcount = jnlcount;
+  }
 }
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
index 398cd67..5b34717 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/controller/YnrccApiController.java
@@ -524,4 +524,107 @@
     };
     return new ResponseEntity(stream, HttpStatus.OK);
   }
+
+  /**
+   * 对账确认接口BC5516
+   * */
+  @PostMapping("/checkmakesure")
+  public DlpayResp makeCheckdtlSure(@FormParam("transcode") String transcode, @FormParam("transdate") String transdate,
+                                    @FormParam("transtime") String transtime, @FormParam("refno") String refno,
+                                    @FormParam("stltrxdate") String stltrxdate, @FormParam("stlamt") Long stlamt,
+                                    @FormParam("jnlcount") Integer jnlcount, @FormParam("sign_type") String sign_type,
+                                    @FormParam("sign") String sign){
+    DlpayResp resp = new DlpayResp();
+    if (!ynrccParamCheckService.checkChkMakesureParam(transcode, transdate, transtime, refno, stltrxdate, stlamt, jnlcount, sign_type, sign, resp)) {
+      logger.error(resp.errPrint());
+      return resp;
+    }
+
+    Map<String, String> params = new HashMap<>(0);
+    params.put("transcode", transcode);
+    params.put("transdate", transdate);
+    params.put("transtime", transtime);
+    params.put("refno", refno);
+    params.put("stltrxdate", stltrxdate);
+    params.put("stlamt", stlamt.toString());
+    params.put("jnlcount", jnlcount.toString());
+    params.put("sign_type", sign_type);
+    params.put("sign", sign);
+    if (!checkYnrccSign(params, resp)) {
+      return resp;
+    }
+
+    try{
+      DlpayReq req = new DlpayReq();
+      req.setTranscode(transcode);
+      req.setTransdate(transdate);
+      req.setTranstime(transtime);
+      req.setSn(refno);
+      req.setStltrxdate(stltrxdate);
+      req.setStlamt(stlamt);
+      req.setJnlcount(jnlcount);
+      return ynrccApiService.sendToYnrcc(DlpayUtil.OPTYPE_CHK_MAKESURE, req);
+    } catch (BussinessException be) {
+      resp.setCode(ErrorCode.BUSSINESS_ERROR);
+      resp.setMessage(be.getMessage());
+      logger.error(resp.errPrint());
+      return resp;
+    }catch (Exception e){
+      doSystemError(e, resp);
+      return resp;
+    }
+  }
+
+  /**
+   * 口挂接口 BC5517
+   * */
+  @PostMapping("/bankcardloss")
+  public DlpayResp bankcardLoss(@FormParam("transcode") String transcode, @FormParam("transdate") String transdate,
+                                @FormParam("transtime") String transtime, @FormParam("refno") String refno,
+                                @FormParam("bankcardno") String bankcardno, @FormParam("username") String username,
+                                @FormParam("idtype") String idtype, @FormParam("idno") String idno,
+                                @FormParam("sign_type") String sign_type, @FormParam("sign") String sign){
+    DlpayResp resp = new DlpayResp();
+    if (!ynrccParamCheckService.checkLossBankcardParam(transcode, transdate, transtime, refno, bankcardno, username, idtype, idno, sign_type, sign, resp)) {
+      logger.error(resp.errPrint());
+      return resp;
+    }
+
+    Map<String, String> params = new HashMap<>(0);
+    params.put("transcode", transcode);
+    params.put("transdate", transdate);
+    params.put("transtime", transtime);
+    params.put("refno", refno);
+    params.put("bankcardno", bankcardno);
+    params.put("username", username);
+    params.put("idtype", idtype);
+    params.put("idno", idno);
+    params.put("sign_type", sign_type);
+    params.put("sign", sign);
+    if (!checkYnrccSign(params, resp)) {
+      return resp;
+    }
+
+    try{
+      DlpayReq req = new DlpayReq();
+      req.setTranscode(transcode);
+      req.setTransdate(transdate);
+      req.setTranstime(transtime);
+      req.setSn(refno);
+      req.setBcNo(bankcardno);
+      req.setName(username);
+      req.setIdType(idtype);
+      req.setIdNo(idno);
+      return ynrccApiService.sendToYnrcc(DlpayUtil.OPTYPE_BANKCARD_LOSS, req);
+    } catch (BussinessException be) {
+      resp.setCode(ErrorCode.BUSSINESS_ERROR);
+      resp.setMessage(be.getMessage());
+      logger.error(resp.errPrint());
+      return resp;
+    }catch (Exception e){
+      doSystemError(e, resp);
+      return resp;
+    }
+  }
+
 }
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/YnrccParamCheckService.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/YnrccParamCheckService.java
index 9673aff..35b38ed 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/YnrccParamCheckService.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/YnrccParamCheckService.java
@@ -24,4 +24,9 @@
   boolean checkQueryResultParam(String transcode, String transdate, String transtime, String refno, String orignRefno, String sign_type, String sign, DlpayResp resp);
 
   boolean checkChkfileParam(String transcode, String transdate, String transtime, String refno, String checkdate, String merchant_bankcardno, String sign_type, String sign, DlpayResp resp);
+
+  boolean checkChkMakesureParam(String transcode, String transdate, String transtime, String refno, String stltrxdate, Long stlamt, Integer jnlcount, String sign_type, String sign, DlpayResp resp);
+
+  boolean checkLossBankcardParam(String transcode, String transdate, String transtime, String refno, String bankcardno, String username, String idtype, String idno, String sign_type, String sign, DlpayResp resp);
+
 }
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
index 1d492e0..5c80430 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccApiServiceImpl.java
@@ -64,6 +64,14 @@
       sendXml = req.getChkfileXml();
       logger.error("请求【获取对账单=" + req.getChkdate() + "】发送报文：\n" + sendXml);
 
+    } else if (DlpayUtil.OPTYPE_CHK_MAKESURE.equals(optype)){
+      sendXml = req.getChkMakeSureXml();
+      logger.error("请求【对账确认="+req.getStltrxdate()+"】发送报文：\n"+ sendXml);
+
+    } else if(DlpayUtil.OPTYPE_BANKCARD_LOSS.equals(optype)){
+      sendXml = req.getLossBankcardXml();
+      logger.error("请求【银行卡口挂】发送报文：\n"+ sendXml);
+
     } else {
       throw new BussinessException("请求类型[" + optype + "]错误!");
     }
diff --git a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
index cd6429e..6b925f7 100644
--- a/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
+++ b/ynrcc-agent/src/main/java/com/supwisdom/agent/api/service/impl/YnrccParamCheckServiceImpl.java
@@ -244,4 +244,60 @@
 
     return true;
   }
+
+  @Override
+  public boolean checkChkMakesureParam(String transcode, String transdate, String transtime, String refno, String stltrxdate, Long stlamt, Integer jnlcount, String sign_type, String sign, DlpayResp resp) {
+    if (!checkYnrccBaseParam(transcode, transdate, transtime, refno, sign_type, sign, resp)) {
+      return false;
+    }
+
+    if (!StringUtil.checkDatetimeValid(stltrxdate, "yyyyMMdd")) {
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[待清算流水日期]");
+      return false;
+    }
+
+    if(null == stlamt){
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[清算金额]");
+      return false;
+    }
+
+    if(null==jnlcount || jnlcount<0){
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[交易流水笔数]");
+      return false;
+    }
+
+    return true;
+  }
+
+  @Override
+  public boolean checkLossBankcardParam(String transcode, String transdate, String transtime, String refno, String bankcardno, String username, String idtype, String idno, String sign_type, String sign, DlpayResp resp) {
+    if (!checkYnrccBaseParam(transcode, transdate, transtime, refno, sign_type, sign, resp)) {
+      return false;
+    }
+    if (StringUtil.isEmpty(bankcardno)) {
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[用户银行卡号为空]");
+      return false;
+    }
+    if (StringUtil.isEmpty(username)) {
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[用户名为空]");
+      return false;
+    }
+    if(StringUtil.isEmpty(idtype)){
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[证件类型为空]");
+      return false;
+    }
+    if (StringUtil.isEmpty(idno)) {
+      resp.setCode(ErrorCode.REQ_PARAM_ERROR);
+      resp.setMessage("请求参数错误[证件号为空]");
+      return false;
+    }
+
+    return true;
+  }
 }
