商户支付方式参数关系表
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
index 15178a8..65f8e1a 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeConfigDao.java
@@ -3,12 +3,14 @@
 import com.supwisdom.dlpay.api.domain.TPaytypeConfig;
 import com.supwisdom.dlpay.api.domain.TPaytypeConfigPK;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
 import java.util.List;
 
 /**
  * Created by shuwei on 2019/4/9.
  */
+@Repository
 public interface PaytypeConfigDao extends JpaRepository<TPaytypeConfig, TPaytypeConfigPK> {
     List<TPaytypeConfig> getByPaytype(String paytype);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
index ab493bb..f782db4 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PaytypeDao.java
@@ -2,9 +2,12 @@
 
 import com.supwisdom.dlpay.api.domain.TPaytype;
 import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
 /**
  * Created by shuwei on 2019/4/9.
  */
+@Repository
 public interface PaytypeDao extends JpaRepository<TPaytype, String> {
+  TPaytype getByPaytype(String paytype);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
index 03fbfcd..9b03661 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersonDao.java
@@ -3,11 +3,13 @@
 import com.supwisdom.dlpay.api.domain.TPerson;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
 
 
 /**
  * Created by shuwei on 2019/4/12.
  */
+@Repository
 public interface PersonDao extends JpaRepository<TPerson, String> {
     @Query(value = "from TPerson where idtype=?1 and idno=?2 ")
     TPerson findByIdentity(String idtype, String idno);
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
new file mode 100644
index 0000000..036161a
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeConfigDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TShopPaytypeConfig;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface ShopPaytypeConfigDao extends JpaRepository<TShopPaytypeConfig, String> {
+  @Query("select a from TShopPaytypeConfig a where a.paytype=?1 and a.shopaccno=?2 ")
+  List<TShopPaytypeConfig> getShopPaytypeConfigs(String paytype, String shopaccno);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java
new file mode 100644
index 0000000..750f8ac
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/ShopPaytypeDao.java
@@ -0,0 +1,13 @@
+package com.supwisdom.dlpay.api.dao;
+
+import com.supwisdom.dlpay.api.domain.TShopPaytype;
+import com.supwisdom.dlpay.api.domain.TShopPaytypePK;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface ShopPaytypeDao extends JpaRepository<TShopPaytype,TShopPaytypePK> {
+  @Query("select a from TShopPaytype a where a.paytype=?1 and a.shopaccno=?2 ")
+  TShopPaytype getById(String paytype, String shopaccno);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java b/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
index c0c1e60..5872560 100644
--- a/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TPaytype.java
@@ -15,11 +15,14 @@
     @Column(name = "ENABLE", nullable = false, length = 20)
     private String enable;
 
-    @Column(name = "DPS_ENABLE",  length = 20)
-    private String dpsEnable;
+    @Column(name = "CHARGE_ENABLE", nullable = false, length = 10)
+    private String chargeEnable;
 
-    @Column(name = "REVERSE_ENABLE", length = 20)
-    private String reverseEnable;
+    @Column(name = "CONSUME_ENABLE",nullable = false, length = 10)
+    private String consumeEnable;
+
+    @Column(name = "PAYDESC",  length = 200)
+    private String paydesc;
 
     public String getPaytype() {
         return paytype;
@@ -37,19 +40,27 @@
         this.enable = enable;
     }
 
-    public String getDpsEnable() {
-        return dpsEnable;
+    public String getChargeEnable() {
+        return chargeEnable;
     }
 
-    public void setDpsEnable(String dpsEnable) {
-        this.dpsEnable = dpsEnable;
+    public void setChargeEnable(String chargeEnable) {
+        this.chargeEnable = chargeEnable;
     }
 
-    public String getReverseEnable() {
-        return reverseEnable;
+    public String getConsumeEnable() {
+        return consumeEnable;
     }
 
-    public void setReverseEnable(String reverseEnable) {
-        this.reverseEnable = reverseEnable;
+    public void setConsumeEnable(String consumeEnable) {
+        this.consumeEnable = consumeEnable;
+    }
+
+    public String getPaydesc() {
+        return paydesc;
+    }
+
+    public void setPaydesc(String paydesc) {
+        this.paydesc = paydesc;
     }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
new file mode 100644
index 0000000..81c893c
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytype.java
@@ -0,0 +1,65 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_SHOP_PAYTYPE")
+@IdClass(TShopPaytypePK.class)
+public class TShopPaytype {
+  @Id
+  @Column(name = "SHOPACCNO", nullable = false, length = 10)
+  private String shopaccno;
+
+  @Id
+  @Column(name = "PAYTYPE", nullable = false, length = 20)
+  private String paytype;
+
+  @Column(name = "CONSUME_ENABLE", nullable = false, length = 10)
+  private String consumeEnable;
+
+  @Column(name = "REVERSE_ENABLE", nullable = false, length = 10)
+  private String reverseEnable;
+
+  @Column(name = "CREATETIME", length = 14)
+  private String createtime;
+
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
+  public String getPaytype() {
+    return paytype;
+  }
+
+  public void setPaytype(String paytype) {
+    this.paytype = paytype;
+  }
+
+  public String getConsumeEnable() {
+    return consumeEnable;
+  }
+
+  public void setConsumeEnable(String consumeEnable) {
+    this.consumeEnable = consumeEnable;
+  }
+
+  public String getReverseEnable() {
+    return reverseEnable;
+  }
+
+  public void setReverseEnable(String reverseEnable) {
+    this.reverseEnable = reverseEnable;
+  }
+
+  public String getCreatetime() {
+    return createtime;
+  }
+
+  public void setCreatetime(String createtime) {
+    this.createtime = createtime;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
new file mode 100644
index 0000000..4d9fd72
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypeConfig.java
@@ -0,0 +1,89 @@
+package com.supwisdom.dlpay.api.domain;
+
+import org.hibernate.annotations.GenericGenerator;
+
+import javax.persistence.*;
+
+@Entity
+@Table(name = "TB_SHOP_PAYTYPE_CONFIG", indexes = {@Index(name = "shop_paytype_config_uk", unique = true, columnList = "shopaccno,paytype,configid")})
+public class TShopPaytypeConfig {
+  @Id
+  @GenericGenerator(name = "idGenerator", strategy = "uuid")
+  @GeneratedValue(generator = "idGenerator")
+  @Column(name = "CFGID", nullable = false, length = 32)
+  private Integer cfgid;
+
+  @Column(name = "SHOPACCNO", nullable = false, length = 10)
+  private String shopaccno;
+
+  @Column(name = "PAYTYPE", nullable = false, length = 20)
+  private String paytype;
+
+  @Column(name = "CONFIGID", nullable = false, length = 40)
+  private String configid;
+
+  @Column(name = "CONFIG_VALUE", length = 2000)
+  private String configValue;
+
+  @Column(name = "CONFIG_NAME", length = 200)
+  private String configName;
+
+  public TShopPaytypeConfig() {
+  }
+
+  public TShopPaytypeConfig(String shopaccno, String paytype, String configid, String configValue, String configName) {
+    this.shopaccno = shopaccno;
+    this.paytype = paytype;
+    this.configid = configid;
+    this.configValue = configValue;
+    this.configName = configName;
+  }
+
+  public Integer getCfgid() {
+    return cfgid;
+  }
+
+  public void setCfgid(Integer cfgid) {
+    this.cfgid = cfgid;
+  }
+
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
+  public String getPaytype() {
+    return paytype;
+  }
+
+  public void setPaytype(String paytype) {
+    this.paytype = paytype;
+  }
+
+  public String getConfigid() {
+    return configid;
+  }
+
+  public void setConfigid(String configid) {
+    this.configid = configid;
+  }
+
+  public String getConfigValue() {
+    return configValue;
+  }
+
+  public void setConfigValue(String configValue) {
+    this.configValue = configValue;
+  }
+
+  public String getConfigName() {
+    return configName;
+  }
+
+  public void setConfigName(String configName) {
+    this.configName = configName;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java
new file mode 100644
index 0000000..4196b55
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/api/domain/TShopPaytypePK.java
@@ -0,0 +1,61 @@
+package com.supwisdom.dlpay.api.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+@Embeddable
+public class TShopPaytypePK implements Serializable {
+  @Id
+  @Column(name = "SHOPACCNO", nullable = false, length = 10)
+  private String shopaccno;
+
+  @Id
+  @Column(name = "PAYTYPE", nullable = false, length = 20)
+  private String paytype;
+
+  public TShopPaytypePK() {
+  }
+
+  public TShopPaytypePK(String shopaccno, String paytype) {
+    this.shopaccno = shopaccno;
+    this.paytype = paytype;
+  }
+
+  public String getShopaccno() {
+    return shopaccno;
+  }
+
+  public void setShopaccno(String shopaccno) {
+    this.shopaccno = shopaccno;
+  }
+
+  public String getPaytype() {
+    return paytype;
+  }
+
+  public void setPaytype(String paytype) {
+    this.paytype = paytype;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    TShopPaytypePK tShopPaytypePK = (TShopPaytypePK) o;
+    if (shopaccno != null ? !shopaccno.equals(tShopPaytypePK.getShopaccno()) : shopaccno != null)
+      return false;
+    if (paytype != null ? !paytype.equals(tShopPaytypePK.getPaytype()) : paytype != null)
+      return false;
+
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    int result = shopaccno != null ? shopaccno.hashCode() : 0;
+    result = 31 * result + (paytype != null ? paytype.hashCode() : 0);
+    return result;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 22b0d9e..a6b733e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -11,6 +11,9 @@
 
 public class DateUtil {
   private static final Logger logger = Logger.getLogger(DateUtil.class);
+  public static final String DATE_FMT = "yyyyMMdd";
+  public static final String TIME_FMT = "HHmmss";
+  public static final String DATETIME_FMT = "yyyyMMddHHmmss";
 
   /**
    * Description: 返回一个当前时间 @return String 格式:yyyyMMddHHmmss @exception Modify
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
index 6411cac..7ef7051 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeErrorCode.java
@@ -107,4 +107,5 @@
 
   public static final int BUSINESS_SHOP_EXISTS = 30001; //商户已经存在
 
+
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
index e3ab38e..d1f8c99 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/bean/api_request_param.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.bean
 
 import com.supwisdom.dlpay.exception.RequestParamCheckException
+import com.supwisdom.dlpay.framework.util.DateUtil
 import com.supwisdom.dlpay.framework.util.MD5
 import com.supwisdom.dlpay.framework.util.StringUtil
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
@@ -11,6 +12,7 @@
 
     open fun checkSign(key: String): Boolean {
         val sign = param_map["sign"]
+        val signType = param_map["sign_type"] ?: "MD5"
         if (StringUtil.isEmpty(sign)) return false //未签名
 
         //判断签名
@@ -23,6 +25,8 @@
     }
 }
 
+
+
 // ============================ USER ============================ //
 class OpenUserParam : APIRequestParam() {
     var syscode: String = "" //必传
@@ -37,6 +41,7 @@
     var address: String? = null
     var zipcode: String? = null
     var sign: String = "" //必传
+    var sign_type: String? = null
 
     fun checkParam(): Boolean {
         if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
@@ -49,7 +54,7 @@
         if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误")
         if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
 
-        param_map.plus(mapOf("syscode" to syscode, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign))
+        param_map.plus(mapOf("syscode" to syscode, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
@@ -59,12 +64,13 @@
     var userid: String? = null  // 用户ID二选一 (两者都传取userid)
     var uid: String? = null    // 用户ID二选一
     var sign: String = "" //必传
+    var sign_type: String? = null
 
     fun checkParam(): Boolean {
         if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
         if (StringUtil.isEmpty(userid) && StringUtil.isEmpty(uid)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "用户唯一号不能为空")
 
-        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "sign" to sign))
+        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
@@ -83,6 +89,7 @@
     var address: String? = null
     var zipcode: String? = null
     var sign: String = "" //必传
+    var sign_type: String? = null
 
     fun checkParam(): Boolean {
         if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
@@ -96,12 +103,13 @@
         if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
 
 
-        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign))
+        param_map.plus(mapOf("syscode" to syscode, "userid" to userid, "uid" to uid, "name" to name, "sex" to sex, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "tel" to tel, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
 
 
+
 // ============================ SHOP ============================ //
 class OpenShopParam : APIRequestParam() {
     var syscode: String = "" //必传
@@ -117,6 +125,7 @@
     var address: String? = null
     var zipcode: String? = null
     var sign: String = "" //必传
+    var sign_type: String? = null
 
     fun checkParam(): Boolean {
         if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
@@ -129,7 +138,7 @@
         if (!StringUtil.isEmpty(mobile) && !StringUtil.isMobile(mobile)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "手机号格式错误")
         if (!StringUtil.isEmpty(email) && !StringUtil.isEmail(email)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "邮箱格式错误")
 
-        param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign))
+        param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shoptype" to shoptype, "fshopid" to fshopid, "shopname" to shopname, "contactman" to contactman, "idtype" to idtype, "idno" to idno, "mobile" to mobile, "email" to email, "address" to address, "zipcode" to zipcode, "sign" to sign, "sign_type" to sign_type))
         return true
     }
 }
@@ -140,12 +149,46 @@
     var shopaccno: String? = null  //注册时返回的shopaccno
     var shopUniqueId: String? = null //注册传的商户唯一号
     var sign: String = "" //必传
+    var sign_type: String? = null
 
     fun checkParam(): Boolean {
         if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
         if (StringUtil.isEmpty(shopUniqueId) && null == shopid && StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "商户唯一标志不能为空")
 
-        param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign))
+        param_map.plus(mapOf("syscode" to syscode, "shopUniqueId" to shopUniqueId, "shopid" to shopid, "shopaccno" to shopaccno, "sign" to sign, "sign_type" to sign_type))
         return true
     }
-}
\ No newline at end of file
+}
+
+
+// ============================ CONSUME ============================ //
+class BankcardPayinitParam :  APIRequestParam() {
+    var syscode: String = "" //必传
+    var cardNo: String = "" //必传
+    var amount: Int = 0 //必传
+    var shopaccno: String = "" //必传
+    var paytype: String ="" //必传
+    var billno: String ="" //必传
+    var transdate: String="" //必传
+    var transtime: String="" //必传
+    var sign: String = "" //必传
+    var sign_type: String? = null
+
+    fun checkParam(): Boolean {
+        if (StringUtil.isEmpty(syscode)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "子系统注册代码不能为空")
+        if (StringUtil.isEmpty(cardNo)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "卡唯一号不能为空")
+        if (amount <= 0) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易金额必须大于零")
+        if(StringUtil.isEmpty(shopaccno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定交易商户")
+        if(StringUtil.isEmpty(paytype)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "请指定支付方式")
+        if(StringUtil.isEmpty(billno)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "对接系统唯一订单号不能为空")
+        if(!DateUtil.checkDatetimeValid(transdate, DateUtil.DATE_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易日期错误[yyyyMMdd]")
+        if(!DateUtil.checkDatetimeValid(transtime,DateUtil.TIME_FMT)) throw RequestParamCheckException(TradeErrorCode.REQUEST_PARAM_ERROR, "交易时间错误[HHmmss]")
+
+        param_map.plus(mapOf("syscode" to syscode, "cardNo" to cardNo, "amount" to amount, "shopaccno" to shopaccno,"paytype" to paytype,"billno" to billno,"transdate" to transdate,"transtime" to transtime, "sign" to sign, "sign_type" to sign_type))
+        return true
+    }
+}
+
+
+
+
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 66cdb7d..3717a2b 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -3,35 +3,69 @@
 import com.supwisdom.dlpay.api.AccountHolder
 import com.supwisdom.dlpay.api.CallService
 import com.supwisdom.dlpay.api.PersonTransBuilder
-import com.supwisdom.dlpay.api.service.AccountUtilServcie
-import com.supwisdom.dlpay.api.service.PaytypeService
-import com.supwisdom.dlpay.api.service.PersonBalancePayService
-import com.supwisdom.dlpay.api.service.PersonService
+import com.supwisdom.dlpay.api.bean.BankcardPayinitParam
+import com.supwisdom.dlpay.api.service.*
+import com.supwisdom.dlpay.exception.RequestParamCheckException
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.util.ConstantUtil
 import com.supwisdom.dlpay.util.PaytypeUtil
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.http.ResponseEntity
-import org.springframework.web.bind.annotation.GetMapping
-import org.springframework.web.bind.annotation.PostMapping
-import org.springframework.web.bind.annotation.RequestMapping
-import org.springframework.web.bind.annotation.RestController
+import org.springframework.web.bind.annotation.*
 
 @RestController
 @RequestMapping("/api/consume")
 class ConsumeController {
     @Autowired
     lateinit var accountUtilServcie: AccountUtilServcie
-
     @Autowired
     lateinit var personBalancePayService: PersonBalancePayService
-
     @Autowired
     lateinit var paytypeService: PaytypeService
     @Autowired
-    lateinit var personService: PersonService
+    lateinit var userService: UserService
+    @Autowired
+    lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    lateinit var consumePayService: ConsumePayService
+
+    @PostMapping("/bankcard/payinit")
+    fun bankcardPayinit(@RequestBody request: BankcardPayinitParam): ResponseEntity<Any> {
+        return try{
+            if (request.checkParam() && request.checkSign(systemUtilService.getSubsystemSignKey(request.syscode))) {
+                ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(TradeErrorCode.REQUEST_SIGN_ERROR, "参数签名错误"))
+            }
+            if (!consumePayService.checkShopPaytype(request.shopaccno, request.paytype)) {
+                ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(TradeErrorCode.INPUT_DATA_ERROR, "支付方式不支持"))
+            }
+
+
+
+
+
+
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .data("refno","")
+                    .success("交易初始化成功"))
+        }catch (ex: RequestParamCheckException) {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .requestException(ex, "请求参数错误"))
+        } catch (et: TransactionException) {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .transException(et, "业务处理错误"))
+        }
+
+    }
+
+
+
+
+// ============================================== //
 
     @PostMapping("/account/pay")
     fun accountPay(userid: String, amount: Int, manageFee: Int): ResponseEntity<Any> {
@@ -80,12 +114,14 @@
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(1, "支付方式未开启"))
             }
-            val person = personService.getPersonByThirdUniqueIdenty(stuempno)
+            val person = userService.findByThirdUniqueIdenty(stuempno,"")
             val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
                     .setTransDatetime(transdate, transtime)
                     .selectPaytype(PaytypeUtil.YKTPAY, payinfo)
                     .setOuttradeno(outtradeno)
-                    .setOwner(person)
+                    .also {
+                        if (null != person) it.setOwner(person)
+                    }
                     .tryLock(true)
                     .setTransinfo(TradeCode.TRANSCODE_YKTPAY, "一卡通支付")
                     .chooseTradetype(Tradetype.CONSUME)
@@ -127,7 +163,7 @@
     fun yktPayFinish(refno: String, yktshopid: String, devphyid: String?): ResponseEntity<Any> {
         return try {
             val dtl = personBalancePayService.wip(refno)
-            val person = personService.getPersonByUserid(dtl.userid)
+            val person = userService.findPersonByUserid(dtl.userid)
             val code = CallService.callYktPay(paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY),
                     dtl, DateUtil.getNow(), "", yktshopid, devphyid)
             if (code.retcode == "0") {
@@ -168,12 +204,14 @@
                 ResponseEntity.ok(ResponseBodyBuilder.create()
                         .fail(1, "支付方式未开启"))
             }
-            val person = personService.getPersonByThirdUniqueIdenty(stuempno)
+            val person = userService.findByThirdUniqueIdenty(stuempno,"")
             val dtl = PersonTransBuilder.newBuilder(accountUtilServcie)
                     .setTransDatetime(transdate, transtime)
                     .selectPaytype(PaytypeUtil.WECHAT, payinfo)
                     .setOuttradeno(outtradeno)
-                    .setOwner(person)
+                    .also {
+                        if (null != person) it.setOwner(person)
+                    }
                     .tryLock(true)
                     .setTransinfo(TradeCode.TRANSCODE_WECHAT, "微信支付")
                     .chooseTradetype(Tradetype.CONSUME)
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt b/src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
similarity index 100%
rename from src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_controller.kt
rename to src/main/kotlin/com/supwisdom/dlpay/api/controller/notify_api_controller.kt
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
new file mode 100644
index 0000000..5d85e0f
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/consume_pay_service.kt
@@ -0,0 +1,12 @@
+package com.supwisdom.dlpay.api.service
+
+import org.springframework.transaction.annotation.Propagation
+import org.springframework.transaction.annotation.Transactional
+
+interface ConsumePayService{
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+    fun checkShopPaytype(shopaccno: String, paytype: String): Boolean
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class))
+    fun getPaytypeConfig(paytype: String, shopaccno: String, ignoreStatus: Boolean? = false): Map<String, String?>
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
new file mode 100644
index 0000000..cdb134b
--- /dev/null
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/Consume_pay_service_impl.kt
@@ -0,0 +1,76 @@
+package com.supwisdom.dlpay.api.service.impl
+
+import com.supwisdom.dlpay.api.dao.PaytypeConfigDao
+import com.supwisdom.dlpay.api.dao.PaytypeDao
+import com.supwisdom.dlpay.api.dao.ShopPaytypeConfigDao
+import com.supwisdom.dlpay.api.dao.ShopPaytypeDao
+import com.supwisdom.dlpay.api.service.ConsumePayService
+import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.util.ConstantUtil
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class ConsumePayServiceImpl: ConsumePayService{
+    @Autowired
+    lateinit var paytypeDao: PaytypeDao
+    @Autowired
+    lateinit var shopPaytypeDao: ShopPaytypeDao
+    @Autowired
+    lateinit var shopPaytypeConfigDao: ShopPaytypeConfigDao
+
+    override fun checkShopPaytype(shopaccno: String, paytype: String): Boolean{
+        paytypeDao.getByPaytype(paytype).let {
+            if (null == it) {
+                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
+            } else {
+                if (ConstantUtil.ENABLE_YES != it.enable || ConstantUtil.ENABLE_YES != it.consumeEnable) {
+                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
+                }
+            }
+        }
+        shopPaytypeDao.getById(paytype, shopaccno).let {
+            if (null == it) {
+                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+            } else {
+                if (ConstantUtil.ENABLE_YES != it.consumeEnable) {
+                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+                }
+            }
+        }
+        return true
+    }
+
+    override fun getPaytypeConfig(paytype: String, shopaccno: String, ignoreStatus: Boolean?): Map<String, String?> {
+        paytypeDao.getByPaytype(paytype).let {
+            if (null == it) {
+                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统不支持支付方式[$paytype]")
+            } else {
+                if (true != ignoreStatus && (ConstantUtil.ENABLE_YES != it.enable || ConstantUtil.ENABLE_YES != it.consumeEnable)) {
+                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "系统未启用支付方式[$paytype]消费")
+                }
+            }
+        }
+
+        shopPaytypeDao.getById(paytype, shopaccno).let {
+            if (null == it) {
+                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+            } else {
+                if (true != ignoreStatus && ConstantUtil.ENABLE_YES != it.consumeEnable) {
+                    throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]未启用支付方式[$paytype]")
+                }
+            }
+        }
+
+        shopPaytypeConfigDao.getShopPaytypeConfigs(paytype, shopaccno)?.let {
+            if (it.size < 1) {
+                throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
+            } else {
+                val result = mutableMapOf<String, String?>()
+                it.forEach { result.plus(mapOf(it.configid to it.configValue)) }
+                return result
+            }
+        } ?: throw TransactionProcessException(TradeErrorCode.INPUT_DATA_ERROR, "该商户[$shopaccno]的支付方式[$paytype]未配置参数")
+    }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt
deleted file mode 100644
index 6d05a8d..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/person_service_impl.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.supwisdom.dlpay.api.service.impl
-
-import com.supwisdom.dlpay.api.dao.PersonDao
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.service.PersonService
-import org.springframework.beans.factory.annotation.Autowired
-import org.springframework.stereotype.Service
-
-/**
- * Created by shuwei on 2019/4/12.
- */
-@Service
-class PersonServiceImpl : PersonService {
-    @Autowired
-    lateinit var personDao: PersonDao
-
-    override fun getPersonByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson {
-        return personDao.findByUserid(thirdUniqueIdenty)
-    }
-
-    override fun getPersonByUserid(userid: String): TPerson {
-        return personDao.getOne(userid)
-    }
-}
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/person_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/person_service.kt
deleted file mode 100644
index 1ea08ba..0000000
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/person_service.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package com.supwisdom.dlpay.api.service
-
-import com.supwisdom.dlpay.api.domain.TPerson
-import org.springframework.transaction.annotation.Propagation
-import org.springframework.transaction.annotation.Transactional
-
-/**
- * Created by shuwei on 2019/4/12.
- */
-interface PersonService {
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun getPersonByThirdUniqueIdenty(thirdUniqueIdenty: String): TPerson
-
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
-    fun getPersonByUserid(userid: String): TPerson
-
-}
\ No newline at end of file
diff --git a/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt b/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
index a9b27ae..b4347fa 100644
--- a/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
+++ b/src/test/kotlin/com/supwisdom/dlpay/controller/ShopControllerTest.kt
@@ -2,8 +2,9 @@
 
 import com.google.gson.Gson
 import com.supwisdom.dlpay.MvcBaseTest
+import com.supwisdom.dlpay.api.bean.OpenShopParam
+import com.supwisdom.dlpay.api.bean.QueryShopParam
 import com.supwisdom.dlpay.framework.domain.TShop
-import com.supwisdom.dlpay.shop.bean.ShopParam
 import org.junit.Assert
 import org.junit.Test
 import org.springframework.http.MediaType
@@ -27,8 +28,9 @@
 
     @Test
     fun open() {
-        val shopParam = ShopParam()
-        shopParam.uniqueId = ""//random req
+        val shopParam = OpenShopParam()
+        shopParam.syscode = "ykt"//random req
+        shopParam.shopUniqueId = "ykt_shop_20001"
         shopParam.shopname = "测试名称"
         val gson = Gson()
         val ret = mvc.perform(post("/api/shop/open").content(gson.toJson(shopParam))
@@ -47,9 +49,9 @@
 
     @Test
     fun get() {
-        val shopParam = ShopParam()
-        shopParam.uniqueId = "testuniqueId"//测试用
-        shopParam.shopname = "测试名称:testuniqueId"
+        val shopParam = QueryShopParam()
+        shopParam.syscode = "ykt"//random req
+        shopParam.shopUniqueId = "ykt_shop_20001"
         val gson = Gson()
         val ret = mvc.perform(post("/shop/open").content(gson.toJson(shopParam))
                 .contentType(MediaType.APPLICATION_JSON))