一卡通支付
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";
+}