diff --git a/build.gradle b/build.gradle
index ea080fb..381e261 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,11 +25,14 @@
     providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
 
+    compile group: 'com.sun.jersey', name: 'jersey-client', version:'1.19'
     compile group: 'javax.servlet', name: 'jstl', version: '1.2'
     compile group: 'taglibs', name: 'standard', version: '1.1.2'
     compile group: 'javax.servlet.jsp', name: 'jsp-api', version: '2.1'
     compile group: 'log4j', name: 'log4j', version: '1.2.16'
     compile files ('libs/ojdbc6.jar')
+
+    compile group: 'com.google.code.gson', name: 'gson', version: '2.8.5'
 }
 
 compileKotlin {
diff --git a/src/main/java/com/supwisdom/dlpay/consume/bean/BaseResp.java b/src/main/java/com/supwisdom/dlpay/consume/bean/BaseResp.java
index 8c4c8a1..1df37a7 100644
--- a/src/main/java/com/supwisdom/dlpay/consume/bean/BaseResp.java
+++ b/src/main/java/com/supwisdom/dlpay/consume/bean/BaseResp.java
@@ -1,31 +1,38 @@
 package com.supwisdom.dlpay.consume.bean;
 
+import com.supwisdom.dlpay.util.Code;
+
 public class BaseResp {
-  private String retcode;
-  private String retmsg;
-  private Object data;
+    private String retcode;
+    private String retmsg;
+    private Object data;
 
-  public String getRetcode() {
-    return retcode;
-  }
+    public String getRetcode() {
+        return retcode;
+    }
 
-  public void setRetcode(String retcode) {
-    this.retcode = retcode;
-  }
+    public void setRetcode(String retcode) {
+        this.retcode = retcode;
+    }
 
-  public String getRetmsg() {
-    return retmsg;
-  }
+    public String getRetmsg() {
+        return retmsg;
+    }
 
-  public void setRetmsg(String retmsg) {
-    this.retmsg = retmsg;
-  }
+    public void setRetmsg(String retmsg) {
+        this.retmsg = retmsg;
+    }
 
-  public Object getData() {
-    return data;
-  }
+    public Object getData() {
+        return data;
+    }
 
-  public void setData(Object data) {
-    this.data = data;
-  }
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    public void setCode(Code code) {
+        this.retcode = code.getCode();
+        this.retmsg = code.getRetmsg();
+    }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/consume/bean/ReqParam.java b/src/main/java/com/supwisdom/dlpay/consume/bean/ReqParam.java
new file mode 100644
index 0000000..31fac50
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/bean/ReqParam.java
@@ -0,0 +1,147 @@
+package com.supwisdom.dlpay.consume.bean;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class ReqParam {
+    /**
+    * 交易流水号
+    * */
+    private String refno;
+    /**
+     * 交易金额(分)
+     * */
+    private Integer amount;
+    /**
+     * 支付渠道
+     * */
+    private String paytype;
+    /**
+     * 订单信息
+     * */
+    private String payinfo;
+    /**
+     * 订单详细
+     * */
+    private String transdesc;
+    /**
+     * 交易日期
+     * */
+    private String transdate;
+    /**
+     * 交易时间
+     * */
+    private String transtime;
+    /**
+     * 账号
+     * */
+    private String accno;
+    /**
+     * 商户号
+     * */
+    private String shopaccno;
+    /**
+     * 签名
+     * */
+    private String sign;
+
+
+    private String yktshopid;
+    private String devphyid;
+
+    public String getYktshopid() {
+        return yktshopid;
+    }
+
+    public void setYktshopid(String yktshopid) {
+        this.yktshopid = yktshopid;
+    }
+
+    public String getDevphyid() {
+        return devphyid;
+    }
+
+    public void setDevphyid(String devphyid) {
+        this.devphyid = devphyid;
+    }
+
+    public String getRefno() {
+        return refno;
+    }
+
+    public void setRefno(String refno) {
+        this.refno = refno;
+    }
+
+    public Integer getAmount() {
+        return amount;
+    }
+
+    public void setAmount(Integer amount) {
+        this.amount = amount;
+    }
+
+    public String getPaytype() {
+        return paytype;
+    }
+
+    public void setPaytype(String paytype) {
+        this.paytype = paytype;
+    }
+
+    public String getPayinfo() {
+        return payinfo;
+    }
+
+    public void setPayinfo(String payinfo) {
+        this.payinfo = payinfo;
+    }
+
+    public String getTransdesc() {
+        return transdesc;
+    }
+
+    public void setTransdesc(String transdesc) {
+        this.transdesc = transdesc;
+    }
+
+    public String getTransdate() {
+        return transdate;
+    }
+
+    public void setTransdate(String transdate) {
+        this.transdate = transdate;
+    }
+
+    public String getTranstime() {
+        return transtime;
+    }
+
+    public void setTranstime(String transtime) {
+        this.transtime = transtime;
+    }
+
+    public String getAccno() {
+        return accno;
+    }
+
+    public void setAccno(String accno) {
+        this.accno = accno;
+    }
+
+    public String getShopaccno() {
+        return shopaccno;
+    }
+
+    public void setShopaccno(String shopaccno) {
+        this.shopaccno = shopaccno;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/bean/SupStatusRevResp.java b/src/main/java/com/supwisdom/dlpay/consume/bean/SupStatusRevResp.java
new file mode 100644
index 0000000..355fd3d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/bean/SupStatusRevResp.java
@@ -0,0 +1,25 @@
+package com.supwisdom.dlpay.consume.bean;
+
+/**
+ * Created by shuwei on 2018/10/18.
+ */
+public class SupStatusRevResp {
+    private Integer status;
+    private Boolean revflag;
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Boolean getRevflag() {
+        return revflag;
+    }
+
+    public void setRevflag(Boolean revflag) {
+        this.revflag = revflag;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/bean/SupYktResp.java b/src/main/java/com/supwisdom/dlpay/consume/bean/SupYktResp.java
new file mode 100644
index 0000000..32caa3e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/bean/SupYktResp.java
@@ -0,0 +1,92 @@
+package com.supwisdom.dlpay.consume.bean;
+
+/**
+ * Created by shuwei on 2018/8/28.
+ */
+public class SupYktResp {
+    private String retcode;
+    private String retmsg;
+    private String tradeno;
+    private String refno;
+    private String sign;
+    private String timestamp;
+    private String sign_method;
+    private Integer balance;
+    private String other;
+
+    public String getOther() {
+        return other;
+    }
+
+    public void setOther(String other) {
+        this.other = other;
+    }
+
+    public String getRetcode() {
+        return retcode;
+    }
+
+    public void setRetcode(String retcode) {
+        this.retcode = retcode;
+    }
+
+    public String getRetmsg() {
+        return retmsg;
+    }
+
+    public void setRetmsg(String retmsg) {
+        this.retmsg = retmsg;
+    }
+
+    public String getTradeno() {
+        return tradeno;
+    }
+
+    public void setTradeno(String tradeno) {
+        this.tradeno = tradeno;
+    }
+
+    public String getRefno() {
+        return refno;
+    }
+
+    public void setRefno(String refno) {
+        this.refno = refno;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(String timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getSign_method() {
+        return sign_method;
+    }
+
+    public void setSign_method(String sign_method) {
+        this.sign_method = sign_method;
+    }
+
+    public Integer getBalance() {
+        return balance;
+    }
+
+    public void setBalance(Integer balance) {
+        this.balance = balance;
+    }
+
+    public boolean checkSign(String appid,String key){
+        return true;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java b/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java
new file mode 100644
index 0000000..ac7d7fe
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/controller/PayapiAction.java
@@ -0,0 +1,98 @@
+package com.supwisdom.dlpay.consume.controller;
+
+import com.supwisdom.dlpay.consume.bean.BaseResp;
+import com.supwisdom.dlpay.consume.bean.ReqParam;
+import com.supwisdom.dlpay.consume.service.PayapiService;
+import com.supwisdom.dlpay.consume.service.PaytypeService;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.util.Code;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 统一支付入口
+ * 1.支付
+ * 2.冲正
+ * 3.充值
+ *
+ * 校验
+ * -参数
+ * -签名
+ */
+@RestController
+@RequestMapping("/unified")
+public class PayapiAction {
+    @Autowired
+    private PayapiService payapiService;
+
+    /**
+     * 公共参数校验
+     * */
+
+    private boolean checkCommonParam(BaseResp resp,ReqParam param){
+        if(param.getAmount()==null){
+            resp.setRetcode("1");
+            resp.setRetmsg("参数错误[amount]");
+            return false;
+        }
+        if(StringUtils.isEmpty(param.getPayinfo())){
+            resp.setRetcode("1");
+            resp.setRetmsg("参数错误[payinfo]");
+            return false;
+        }
+        if(StringUtils.isEmpty(param.getPaytype())){
+            resp.setRetcode("1");
+            resp.setRetmsg("参数错误[paytype]");
+            return false;
+        }
+        if(StringUtils.isEmpty(param.getRefno())){
+            resp.setRetcode("1");
+            resp.setRetmsg("参数错误[refno]");
+            return false;
+        }
+        return true;
+    }
+    /**
+     *
+     * 统一消费接口
+     *
+     *
+     * */
+    @RequestMapping("/consume")
+    public BaseResp consume(@RequestBody ReqParam param) {
+        BaseResp resp = new BaseResp();
+        if(!checkCommonParam(resp,param)){
+            return resp;
+        }
+        payapiService.doConsume(param,resp);
+        return resp;
+    }
+
+    /**
+     *
+     * 统一冲正接口
+     *
+     *
+     * */
+    @RequestMapping("/reverse")
+    public BaseResp reverse() {
+        BaseResp resp = new BaseResp();
+        resp.setCode(Code.SUCCESS);
+        return resp;
+    }
+
+    /**
+     *
+     * 统一充值接口
+     *
+     * */
+    @RequestMapping("/recharge")
+    public BaseResp recharge() {
+        BaseResp resp = new BaseResp();
+        resp.setCode(Code.SUCCESS);
+        return resp;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeConfigDao.java b/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeConfigDao.java
new file mode 100644
index 0000000..62afecc
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeConfigDao.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.consume.dao;
+
+import com.supwisdom.dlpay.consume.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.consume.domain.TPaytypeConfigPK;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import java.util.List;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public interface PaytypeConfigDao extends JpaRepository<TPaytypeConfig, TPaytypeConfigPK> {
+    List<TPaytypeConfig> getByPaytype(String paytype);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeDao.java b/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeDao.java
new file mode 100644
index 0000000..79e97c1
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/dao/PaytypeDao.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.consume.dao;
+
+import com.supwisdom.dlpay.consume.domain.TPaytype;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public interface PaytypeDao extends JpaRepository<TPaytype, String> {
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java b/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java
index a7c2c4f..ff74e33 100644
--- a/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/consume/dao/TransdtlDao.java
@@ -22,4 +22,12 @@
       "where t.status='success' and t.feetype!='none' and t.accdate=:settledate " +
       "group by a.drsubjno,a.crsubjno,a.summary,t.shopaccno ", nativeQuery = true)
   List<VoucherTemp> getFeeVoucherData(@RequestParam("settledate") String settledate);
+
+  TTransdtl getByOuttradenoAndStatus(String outtradeno,String status);
+
+  @Query(value = " select to_char(sysdate,'yyyyMMddhh24missSSS')||to_char(SEQ_REFNO.nextval,'FM0000000') as billno from dual ",nativeQuery = true)
+  String getReno();
+
+  @Query(value = " select to_char(CURRENT_TIMESTAMP,'yyyyMMddhh24missSS')||to_char(nextval('SEQ_REFNO'),'FM0000000') as billno ",nativeQuery = true)
+  String getRenoPG();
 }
diff --git a/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytype.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytype.java
new file mode 100644
index 0000000..07d4679
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytype.java
@@ -0,0 +1,55 @@
+package com.supwisdom.dlpay.consume.domain;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Entity
+@Table(name = "TB_PAYTYPE")
+public class TPaytype {
+    @Id
+    @Column(name = "PAYTYPE", nullable = false, length = 20)
+    private String paytype;
+
+    @Column(name = "ENABLE", nullable = false, length = 20)
+    private String enable;
+
+    @Column(name = "DPS_ENABLE",  length = 20)
+    private String dpsEnable;
+
+    @Column(name = "REVERSE_ENABLE", length = 20)
+    private String reverseEnable;
+
+    public String getPaytype() {
+        return paytype;
+    }
+
+    public void setPaytype(String paytype) {
+        this.paytype = paytype;
+    }
+
+    public String getEnable() {
+        return enable;
+    }
+
+    public void setEnable(String enable) {
+        this.enable = enable;
+    }
+
+    public String getDpsEnable() {
+        return dpsEnable;
+    }
+
+    public void setDpsEnable(String dpsEnable) {
+        this.dpsEnable = dpsEnable;
+    }
+
+    public String getReverseEnable() {
+        return reverseEnable;
+    }
+
+    public void setReverseEnable(String reverseEnable) {
+        this.reverseEnable = reverseEnable;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytypeConfig.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytypeConfig.java
new file mode 100644
index 0000000..65cf896
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytypeConfig.java
@@ -0,0 +1,56 @@
+package com.supwisdom.dlpay.consume.domain;
+
+import javax.persistence.*;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Entity
+@Table(name = "TB_PAYTYPE_CONFIG")
+@IdClass(TPaytypeConfigPK.class)
+public class TPaytypeConfig {
+    @Id
+    @Column(name = "PAYTYPE", nullable = false, length = 20)
+    private String paytype;
+    @Id
+    @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 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/consume/domain/TPaytypeConfigPK.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytypeConfigPK.java
new file mode 100644
index 0000000..5046c0b
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/domain/TPaytypeConfigPK.java
@@ -0,0 +1,53 @@
+package com.supwisdom.dlpay.consume.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Id;
+import java.io.Serializable;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Embeddable
+public class TPaytypeConfigPK implements Serializable {
+    @Id
+    @Column(name = "PAYTYPE", nullable = false, length = 20)
+    private String paytype;
+    @Id
+    @Column(name = "CONFIGID", nullable = false, length = 40)
+    private String configid;
+
+    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;
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        TPaytypeConfigPK that = (TPaytypeConfigPK) o;
+
+        if (!paytype.equals(that.paytype)) return false;
+        return configid.equals(that.configid);
+    }
+
+    @Override
+    public int hashCode() {
+        int result = paytype.hashCode();
+        result = 31 * result + configid.hashCode();
+        return result;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtlOrder.java b/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtlOrder.java
new file mode 100644
index 0000000..edc005e
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/domain/TTransdtlOrder.java
@@ -0,0 +1,38 @@
+package com.supwisdom.dlpay.consume.domain;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+*
+* 流水明细表
+* */
+
+@Entity
+@Table(name = "TB_TRANSDTL_ORDER")
+public class TTransdtlOrder {
+  @Id
+  @Column(name = "REFNO", nullable = false, length = 32)
+  private String refno;
+
+  @Column(name = "ERRMSG", length = 100)
+  private String errmsg;
+
+  public String getRefno() {
+    return refno;
+  }
+
+  public void setRefno(String refno) {
+    this.refno = refno;
+  }
+
+  public String getErrmsg() {
+    return errmsg;
+  }
+
+  public void setErrmsg(String errmsg) {
+    this.errmsg = errmsg;
+  }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java b/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java
new file mode 100644
index 0000000..0c8bec0
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/service/PayapiService.java
@@ -0,0 +1,14 @@
+package com.supwisdom.dlpay.consume.service;
+
+import com.supwisdom.dlpay.consume.bean.BaseResp;
+import com.supwisdom.dlpay.consume.bean.ReqParam;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public interface PayapiService {
+    @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
+    boolean doConsume(ReqParam param, BaseResp resp);
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/PaytypeService.java b/src/main/java/com/supwisdom/dlpay/consume/service/PaytypeService.java
new file mode 100644
index 0000000..7c6821d
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/service/PaytypeService.java
@@ -0,0 +1,16 @@
+package com.supwisdom.dlpay.consume.service;
+
+import com.supwisdom.dlpay.consume.domain.TPaytype;
+
+import java.util.Map;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public interface PaytypeService {
+
+    TPaytype getByPaytype(String paytype);
+
+    Map<String,String> getPaytypeConfigByPaytype(String pattype);
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java
new file mode 100644
index 0000000..382d821
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PayapiServiceImpl.java
@@ -0,0 +1,186 @@
+package com.supwisdom.dlpay.consume.service.impl;
+
+import com.google.gson.Gson;
+import com.sun.jersey.api.client.Client;
+import com.sun.jersey.api.client.ClientResponse;
+import com.sun.jersey.api.client.WebResource;
+import com.supwisdom.dlpay.consume.bean.BaseResp;
+import com.supwisdom.dlpay.consume.bean.ReqParam;
+import com.supwisdom.dlpay.consume.bean.SupStatusRevResp;
+import com.supwisdom.dlpay.consume.bean.SupYktResp;
+import com.supwisdom.dlpay.consume.dao.TransdtlDao;
+import com.supwisdom.dlpay.consume.domain.TPaytype;
+import com.supwisdom.dlpay.consume.domain.TTransdtl;
+import com.supwisdom.dlpay.consume.service.PayapiService;
+import com.supwisdom.dlpay.consume.service.PaytypeService;
+import com.supwisdom.dlpay.framework.data.SystemDateTime;
+import com.supwisdom.dlpay.framework.service.SystemUtilService;
+import com.supwisdom.dlpay.framework.util.DateUtil;
+import com.supwisdom.dlpay.framework.util.TradeCode;
+import com.supwisdom.dlpay.util.*;
+import org.apache.log4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Service
+public class PayapiServiceImpl implements PayapiService {
+    @Autowired
+    private TransdtlDao transdtlDao;
+    @Autowired
+    private SystemUtilService systemUtilService;
+    @Autowired
+    private PaytypeService paytypeService;
+    private static final Logger logger = Logger.getLogger(PayapiServiceImpl.class);
+    private static final Gson gson = new Gson();
+
+    @Override
+    public boolean doConsume(ReqParam param, BaseResp resp) {
+        TTransdtl tTransdtl = transdtlDao.getByOuttradenoAndStatus(param.getRefno(), ConstUtil.STATUS_SUCCESS);
+        if (tTransdtl != null) {
+            resp.setRetcode("1");
+            resp.setRetmsg("流水号重复");
+            return false;
+        }
+        String refno = transdtlDao.getReno();
+        if (StringUtils.isEmpty(refno)) {
+            resp.setCode(Code.SYS_ERROR);
+            return false;
+        }
+        tTransdtl = new TTransdtl();
+        tTransdtl.setAccno(param.getAccno());
+        tTransdtl.setAmount(MoneyUtil.FenToYuan(param.getAmount()));
+        tTransdtl.setPaidamt(MoneyUtil.FenToYuan(param.getAmount()));
+        tTransdtl.setShopaccno(param.getShopaccno());
+        tTransdtl.setOuttradeno(param.getRefno());
+        tTransdtl.setPaytype(param.getPaytype());
+        tTransdtl.setTransdate(DateUtil.getNow("yyyyMMdd"));
+        tTransdtl.setTranstime(DateUtil.getNow("hhmmss"));
+        tTransdtl.setCreatetime(DateUtil.getNow());
+        tTransdtl.setPayinfo(param.getPayinfo());
+        tTransdtl.setStatus(ConstUtil.STATUS_INIT);
+        tTransdtl.setRefno(refno);
+        transdtlDao.save(tTransdtl);
+        switch (param.getPaytype()) {
+            case PaytypeUtil.YKTPAY:
+                return doYKTPay(param, tTransdtl, resp);
+        }
+        resp.setCode(Code.PAYTYPE_NOT_SUPPORT);
+        return false;
+    }
+
+    /**
+     * 一卡通支付
+     */
+
+    private boolean doYKTPay(ReqParam param, TTransdtl dtl, BaseResp resp) {
+        //TODO
+        TPaytype paytype = paytypeService.getByPaytype(PaytypeUtil.YKTPAY);
+        if (paytype == null || !ConstUtil.ENABLE_YES.equals(paytype.getEnable())) {
+            resp.setCode(Code.PAYTYPE_NOT_SUPPORT);
+            return false;
+        }
+        Map<String, String> config = paytypeService.getPaytypeConfigByPaytype(PaytypeUtil.YKTPAY);
+        String appid = config.get("appid");
+        String appkey = config.get("appkey");
+        String orderurl = config.get("orderurl");
+        if (config.size() == 0
+                || StringUtils.isEmpty(appid)
+                || StringUtils.isEmpty(appkey)
+                || StringUtils.isEmpty(orderurl)) {
+            resp.setCode(Code.PAYTYPE_CONFIG_ERROR);
+            logger.error("支付方式未配置,appid=" + appid + ",appkey=" + appkey + ",orderurl=" + orderurl);
+            return false;
+        }
+        SystemDateTime systemDateTime = systemUtilService.getSysdatetime();
+        dtl.setAccdate(systemDateTime.getHostdate());
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("partner_id", appid);
+        params.put("stuempno", param.getAccno());
+        params.put("tradeno", dtl.getRefno());
+        params.put("tradename", param.getPayinfo());
+        params.put("amount", param.getAmount() + "");
+        params.put("shopid", param.getYktshopid());
+        params.put("devphyid", param.getDevphyid());
+        params.put("calcmanagefee", "T");//是否计算费率
+        params.put("timestamp", systemDateTime.getHostdatetime());
+
+        params.put("sign_method", "HMAC");
+        params.put("limitflag", "off"); //是否判断消费限额，on-判断；off-不判断。默认on（判断限额）。为空或不为off都是on；
+        String signstr = HmacUtil.createLinkString(HmacUtil.paraFilter(params));
+        String sign = HmacUtil.HMACSHA1(signstr, appkey);
+        signstr += "&sign=" + sign + "&sourcetype=food";
+        Client c = Client.create();
+        c.setConnectTimeout(20000);
+        dtl.setTranstype(TradeCode.TRANSTYPE_YKTPAY);
+        dtl.setTranscode(TradeCode.TRANSCODE_YKTPAY);
+
+        WebResource r = c.resource(orderurl);
+        ClientResponse respClient = r.post(ClientResponse.class, signstr);
+        if (200 == respClient.getStatus()) {
+            String ret = respClient.getEntity(String.class);
+            logger.error("***************yktpay.ret=" + ret + "*************************");
+            if (ret != null) {
+                try {
+                    SupYktResp result = gson.fromJson(ret, SupYktResp.class);
+                    if (result == null) {
+                        resp.setCode(Code.RESPNOSE_CONTENT_ERROR);
+                        logger.error("支付内容转换失败:null");
+                        return false;
+                    }
+                    if (!"0".equals(result.getRetcode())) {
+                        if ("30".equals(result.getRetcode())) {
+                            if (result.getOther() != null) {
+                                try {
+                                    SupStatusRevResp supStatusRevResp = gson.fromJson(result.getOther(), SupStatusRevResp.class);
+                                    if (supStatusRevResp != null) {
+                                        //同流水号，同一笔已经支付完成的，不重复支付。
+                                        if (3 == supStatusRevResp.getStatus() && supStatusRevResp.getRevflag() != null && !supStatusRevResp.getRevflag()) {
+                                            dtl.setStatus(ConstUtil.STATUS_SUCCESS);
+                                            dtl.setAccdate(systemDateTime.getHostdate());
+                                            transdtlDao.save(dtl);
+                                            resp.setCode(Code.SUCCESS);
+                                            return true;
+                                        }
+                                    }
+                                } catch (Exception e) {
+                                    e.printStackTrace();
+                                    logger.error("返回内容转换失败:" + e.getMessage());
+                                }
+                            }
+                        }
+                        resp.setRetcode("1");
+                        resp.setRetmsg("交易失败:" + result.getRetmsg());
+                        logger.error(result.getRetmsg());
+                        //dtl.setErrmsg(result.getRetmsg());
+                        //payApiDTLDao.save(dtl);
+                        return false;
+                    }
+                    dtl.setStatus(ConstUtil.STATUS_SUCCESS);
+                    dtl.setAccdate(systemDateTime.getHostdate());
+                    transdtlDao.save(dtl);
+                    resp.setCode(Code.SUCCESS);
+                    return true;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                    resp.setCode(Code.RESPNOSE_CONTENT_ERROR);
+                    logger.error("支付内容转换失败:" + e.getMessage());
+                    return false;
+                }
+            } else {
+                resp.setCode(Code.REQUEST_ERROR);
+                return false;
+            }
+        } else {
+            resp.setCode(Code.REQUEST_ERROR);
+            logger.error("请求返回失败:" + respClient.getEntity(String.class) + ",code=" + respClient.getStatus());
+            return false;
+        }
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java
new file mode 100644
index 0000000..5aad223
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/consume/service/impl/PaytypeServiceImpl.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.consume.service.impl;
+
+import com.supwisdom.dlpay.consume.dao.PaytypeConfigDao;
+import com.supwisdom.dlpay.consume.dao.PaytypeDao;
+import com.supwisdom.dlpay.consume.domain.TPaytype;
+import com.supwisdom.dlpay.consume.domain.TPaytypeConfig;
+import com.supwisdom.dlpay.consume.service.PaytypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+@Service
+public class PaytypeServiceImpl implements PaytypeService {
+    @Autowired
+    private PaytypeDao paytypeDao;
+    @Autowired
+    private PaytypeConfigDao paytypeConfigDao;
+
+    @Override
+    public TPaytype getByPaytype(String paytype) {
+        return paytypeDao.getOne(paytype);
+    }
+
+    @Override
+    public Map<String, String> getPaytypeConfigByPaytype(String pattype) {
+        List<TPaytypeConfig> list = paytypeConfigDao.getByPaytype(pattype);
+        Map<String, String> map = new HashMap<>(list.size());
+        for (TPaytypeConfig paytypeConfig : list) {
+            map.put(paytypeConfig.getConfigid(), paytypeConfig.getConfigValue());
+        }
+        return map;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
index b206704..2c9d7df 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeCode.java
@@ -5,5 +5,9 @@
  * */
 public class TradeCode {
   public static final int TRANSCODE_PAY = 6630;
+  public static final int TRANSCODE_YKTPAY=1000;
+
+
   public static final int TRANSTYPE_PAY = 311;
+  public static final int TRANSTYPE_YKTPAY=1000;
 }
diff --git a/src/main/java/com/supwisdom/dlpay/util/Code.java b/src/main/java/com/supwisdom/dlpay/util/Code.java
new file mode 100644
index 0000000..8f05ecd
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/Code.java
@@ -0,0 +1,39 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public enum Code {
+    SUCCESS("0","OK"),
+    PARAM_ERROR("1","参数错误"),
+    SYS_ERROR("2","系统异常"),
+    PAYTYPE_NOT_SUPPORT("10","支付方式不支持"),
+    PAYTYPE_CONFIG_ERROR("11","支付方式未配置或配置错误"),
+    REQUEST_ERROR("20","响应内容错误"),
+    RESPNOSE_CONTENT_ERROR("21","响应内容错误")
+    ;
+
+    private String code;
+    private String retmsg;
+
+    private Code(String code,String retmsg){
+        this.code = code;
+        this.retmsg = retmsg;
+    }
+
+    public String getCode() {
+        return code;
+    }
+
+    public void setCode(String code) {
+        this.code = code;
+    }
+
+    public String getRetmsg() {
+        return retmsg;
+    }
+
+    public void setRetmsg(String retmsg) {
+        this.retmsg = retmsg;
+    }
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java
new file mode 100644
index 0000000..4a54efa
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/ConstUtil.java
@@ -0,0 +1,15 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class ConstUtil {
+    public static final String STATUS_INIT = "init";
+    public static final String STATUS_SUCCESS = "success";
+    public static final String STATUS_FAIL = "fail";
+
+    public static final String ENABLE_YES = "yes";
+
+    public static final String ENABLE_NO = "no";
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/HmacUtil.java b/src/main/java/com/supwisdom/dlpay/util/HmacUtil.java
new file mode 100644
index 0000000..832c699
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/HmacUtil.java
@@ -0,0 +1,130 @@
+package com.supwisdom.dlpay.util;
+
+import com.supwisdom.dlpay.framework.util.DateUtil;
+
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.util.*;
+
+public class HmacUtil {
+    /**
+     * 除去数组中的空值和签名参数
+     *
+     * @param sArray 签名参数组
+     * @return 去掉空值与签名参数后的新签名参数组
+     */
+    public static Map<String, String> paraFilter(Map<String, String> sArray) {
+
+        Map<String, String> result = new HashMap<String, String>();
+
+        if (sArray == null || sArray.size() <= 0) {
+            return result;
+        }
+
+        for (String key : sArray.keySet()) {
+            String value = sArray.get(key);
+            if (value == null || value.equals("") || "null".equals(value) || key.equalsIgnoreCase("sign")) {
+                continue;
+            }
+            result.put(key, value);
+        }
+
+        return result;
+    }
+
+    /**
+     * 把数组所有元素排序，并按照“参数=参数值”的模式用“&”字符拼接成字符串
+     *
+     * @param params 需要排序并参与字符拼接的参数组
+     * @return 拼接后字符串
+     */
+    public static String createLinkString(Map<String, String> params) {
+
+        List<String> keys = new ArrayList<String>(params.keySet());
+        Collections.sort(keys);
+
+        String prestr = "";
+
+        for (int i = 0; i < keys.size(); i++) {
+            String key = keys.get(i);
+            String value = params.get(key);
+
+            if (i == keys.size() - 1) {//拼接时，不包括最后一个&字符
+                prestr = prestr + key + "=" + value;
+            } else {
+                prestr = prestr + key + "=" + value + "&";
+            }
+        }
+
+        return prestr;
+    }
+
+    public static String HMACSHA1(String data, String key) {
+        byte[] byteHMAC = null;
+        try {
+            Mac mac = Mac.getInstance("HmacSHA1");
+            SecretKeySpec spec = new SecretKeySpec(key.getBytes(), "HmacSHA1");
+            mac.init(spec);
+            byteHMAC = mac.doFinal(data.getBytes("UTF-8"));
+        } catch (InvalidKeyException e) {
+            e.printStackTrace();
+        } catch (NoSuchAlgorithmException ignore) {
+            ignore.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        if (byteHMAC != null) {
+            try {
+                String hexMac = getHexString(byteHMAC);
+                return hexMac;
+            } catch (Exception e) {
+                // TODO Auto-generated catch block
+                e.printStackTrace();
+            }
+            return null;
+        }
+        return null;
+
+    }
+
+    public static String getHexString(byte[] b) throws Exception {
+        String result = "";
+        for (int i = 0; i < b.length; i++) {
+            result += Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1);
+        }
+        return result;
+    }
+
+    public static boolean checkHmacSign(String data, String key, String sign) {
+        String asign = HMACSHA1(data, key);
+        if (asign == null) {
+            return false;
+        }
+        if (asign.equalsIgnoreCase(sign)) {
+            return true;
+        }
+
+        return false;
+    }
+
+    public static void main(String[] args) {
+        String refno = DateUtil.getNow();
+        Map<String, String> mapValue = new HashMap<String, String>();
+        mapValue.put("tradeaccount", "10000097");
+        mapValue.put("tradename", "在线点餐");
+        mapValue.put("tradeamount", "1");
+        mapValue.put("paidamount", "1");
+        mapValue.put("outtradeno", refno);
+        mapValue.put("yktshopid", "2");
+        mapValue.put("shopid", "68512084");
+        String signstr = createLinkString(HmacUtil.paraFilter(mapValue));
+        String sign = HmacUtil.HMACSHA1(signstr, "adc4ac6822fd462780f878b86cb94688");
+        System.out.println("{\"tradeaccount\":\"10000097\",\"tradename\":\"在线点餐\",\"tradeamount\":\"1\"," +
+                "\"paidamount\": \"1\",\"outtradeno\":\""+refno+"\",\"yktshopid\": \"2\",\"shopid\":\"68512084\",\"sign\": \""+sign+"\"}");
+    }
+
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java b/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java
new file mode 100644
index 0000000..2fb8b73
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/MoneyUtil.java
@@ -0,0 +1,28 @@
+package com.supwisdom.dlpay.util;
+
+
+import java.text.DecimalFormat;
+
+public class MoneyUtil {
+
+	public static int YuanToFen(double yuan) {
+		return (int) (Math.round(yuan * 100));
+	}
+
+	public static boolean moneyCompare(double x1, double x2) {
+		return YuanToFen(x1) == YuanToFen(x2);
+	}
+	public static double formatYuan(double yuan) {
+		DecimalFormat df = new DecimalFormat("##0.00");
+		double money = ((double) YuanToFen(yuan)) / 100;
+		return Double.valueOf(df.format(money));
+	}
+
+	public static double FenToYuan(int fen) {
+		return formatYuan(fen / 100.0);
+	}
+	public static String format(double num,String format) {
+		DecimalFormat df = new DecimalFormat(format);
+		return df.format(num);
+	}
+}
diff --git a/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java b/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
new file mode 100644
index 0000000..8222e90
--- /dev/null
+++ b/src/main/java/com/supwisdom/dlpay/util/PaytypeUtil.java
@@ -0,0 +1,10 @@
+package com.supwisdom.dlpay.util;
+
+/**
+ * Created by shuwei on 2019/4/9.
+ */
+public class PaytypeUtil {
+    public static final String YKTPAY = "yktpay";
+
+    public static final String WECHAT = "wechat";
+}
