diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/swykt_service_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/swykt_service_impl.kt
new file mode 100644
index 0000000..6b64727
--- /dev/null
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/impl/swykt_service_impl.kt
@@ -0,0 +1,131 @@
+package com.supwisdom.dlpay.agent.service.impl
+
+import com.google.gson.Gson
+import com.sun.jersey.api.client.Client
+import com.sun.jersey.api.client.ClientResponse
+import com.supwisdom.dlpay.agent.service.SWYKTV5Service
+import com.supwisdom.dlpay.api.bean.BaseResp
+import com.supwisdom.dlpay.api.bean.SupStatusRevResp
+import com.supwisdom.dlpay.api.bean.SupYktResp
+import com.supwisdom.dlpay.api.service.SourceTypeService
+import com.supwisdom.dlpay.api.service.UserService
+import com.supwisdom.dlpay.framework.service.SystemUtilService
+import com.supwisdom.dlpay.framework.util.*
+import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.stereotype.Service
+
+@Service
+class SWYKTV5ServiceImpl :SWYKTV5Service {
+    @Autowired
+    lateinit var sourceTypeService: SourceTypeService
+    @Autowired
+    lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    lateinit var userService: UserService
+
+    override fun onLineThirdPay(shopaccno: String, userid: String, accdate: String, amount: Int, refno: String): BaseResp {
+        val code = BaseResp()
+        val config = sourceTypeService.getConsumePaytypeConfig(TradeDict.PAYTYPE_YKT_CARD, shopaccno, false, false)
+        val appid = config["appid"]
+        if (appid.isNullOrEmpty()) {
+            code.retcode = "1"
+            code.retmsg = "一卡通支付方式未启用或未配置[appid]"
+            return code
+        }
+        val appkey = config["appkey"]
+        if (appkey.isNullOrEmpty()) {
+            code.retcode = "1"
+            code.retmsg = "一卡通支付方式未启用或未配置[appkey]"
+            return code
+        }
+        val orderurl = config["orderurl"]
+        if (orderurl.isNullOrEmpty()) {
+            code.retcode = "1"
+            code.retmsg = "一卡通支付方式未启用或未配置[orderurl]"
+            return code
+        }
+        val person = userService.findOnePersonByUserid(userid)
+
+        val params = hashMapOf<String, String?>()
+        params.put("partner_id", appid)
+        params.put("stuempno", person.idno)
+        params.put("tradeno",refno)
+        params.put("tradename", "校园卡支付")
+        params.put("amount", amount.toString())
+        //TODO 解决一卡通商户号问题
+        //params.put("shopid", yktshopid)
+        //params.put("devphyid", devphyid)
+        params.put("calcmanagefee", "T") //是否计算费率
+        params.put("timestamp", DateUtil.getNow())
+        params.put("sign_method", "HMAC");
+        params.put("limitflag", "off") //是否判断消费限额，on-判断；off-不判断。默认on（判断限额）。为空或不为off都是on；
+        var signstr = StringUtil.createLinkString(HmacUtil.paraFilter(params))
+        val sign = HmacUtil.HMACSHA1(signstr, appkey)
+        signstr = "$signstr&sign=$sign&sourcetype=food"
+        val c = Client.create()
+        c.setConnectTimeout(20000)
+        val r = c.resource(orderurl)
+        val respClient = r.post(ClientResponse::class.java, signstr)
+        if (200 == respClient.status) {
+            val ret = respClient.getEntity(String::class.java)
+            if (ret != null) {
+                try {
+                    val gson = Gson()
+                    val result = gson.fromJson(ret, SupYktResp::class.java)
+                    if (result == null) {
+                        code.retcode = "1"
+                        code.retmsg = "返回内容为空"
+                        return code
+                    }
+                    if ("0" != result.retcode) {
+                        if ("30" == result.retcode) {
+                            if (result.other != null) {
+                                try {
+                                    val supStatusRevResp = gson.fromJson(result.other,
+                                            SupStatusRevResp::class.java)
+                                    if (supStatusRevResp != null) {
+                                        //同流水号，同一笔已经支付完成的，不重复支付。
+                                        if (3 == supStatusRevResp.status
+                                                && supStatusRevResp.revflag != null
+                                                && !supStatusRevResp.revflag) {
+                                            code.retcode = "0"
+                                            code.retmsg = "成功"
+                                            return code
+                                        }
+                                    }
+                                } catch (e: Exception) {
+                                    e.printStackTrace()
+                                }
+                            }
+                        }
+                        code.retcode = "1"
+                        code.retmsg = "交易失败:" + result.retmsg
+                        return code
+                    }
+                    code.retcode = "0"
+                    code.retmsg = "成功"
+                    return code
+                } catch (e: Exception) {
+                    e.printStackTrace()
+                }
+            }
+        }
+        code.retcode = "1"
+        code.retmsg = "请求失败"
+        return code
+    }
+
+    override fun onLineCardPay(): BaseResp {
+        TODO("not implemented")
+    }
+
+    override fun onLineCardPayConfirm(): BaseResp {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+    override fun offLineCardTransdtl(): BaseResp {
+        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
+    }
+
+
+}
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
index ed323c3..7f96f22 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/swykt_service.kt
@@ -2,9 +2,35 @@
 
 import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.agent.AgentResponse
+import com.supwisdom.dlpay.api.bean.BaseResp
+import com.supwisdom.dlpay.api.domain.TPersondtl
 import com.supwisdom.dlpay.api.domain.TTransactionMain
 import org.springframework.stereotype.Component
 
+interface SWYKTV5Service{
+
+    /**
+     * 调用一卡通V5第三方支付接口
+     * */
+    fun onLineThirdPay(shopaccno: String, userid: String, accdate: String, amount: Int, refno: String):BaseResp
+
+    /**
+     * 调用一卡通V5卡片联机支付接口
+     * */
+    fun onLineCardPay():BaseResp
+
+    /**
+     * 调用一卡通V5卡片联机密码确认支付接口
+     * */
+    fun onLineCardPayConfirm():BaseResp
+
+    /**
+     * 调用一卡通V5卡片脱机上传授信流水接口
+     * */
+    fun offLineCardTransdtl():BaseResp
+
+}
+
 @Component("swyktv5Agent")
 class SWYktV5AgentService : AgentPayService {
     override fun pay(transaction: TTransactionMain?): AgentResponse {
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
index 2397e3b..3d3cbae 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/ThirdPayCall.kt
@@ -10,99 +10,13 @@
 import com.supwisdom.dlpay.util.Code
 import mu.KotlinLogging
 
-class CallBackResp {
-    var retcode: String = "99"
-    var retmsg: String? = null
-    val data = mutableMapOf<String, String>()
-    fun add(key: String, value: String) {
-        this.data.plus(mapOf(key to value))
-    }
-}
+
 
 class CallService {
 
     companion object {
         private val logger = KotlinLogging.logger { }
 
-        fun callYktPay(config: Map<String, String?>, paydtl: TPersondtl, time: String, stuempno: String, yktshopid: String, devphyid: String?): CallBackResp {
-            val code = CallBackResp()
-            val appid = config["appid"]
-            if (appid.isNullOrEmpty()) {
-                code.retcode = "1"
-                code.retmsg = "一卡通支付方式未启用或未配置"
-                return code
-            }
-
-            val appkey = config["appkey"]
-            val orderurl = config["orderurl"]
-
-            val params = hashMapOf<String, String?>()
-            params.put("partner_id", appid)
-            params.put("stuempno", stuempno)
-            params.put("tradeno", paydtl.refno)
-            params.put("tradename", paydtl.payinfo)
-            params.put("amount", MoneyUtil.YuanToFen(paydtl.amount).toString())
-            params.put("shopid", yktshopid)
-            params.put("devphyid", devphyid)
-            params.put("calcmanagefee", "T") //是否计算费率
-            params.put("timestamp", time)
-            params.put("sign_method", "HMAC");
-            params.put("limitflag", "off") //是否判断消费限额，on-判断；off-不判断。默认on（判断限额）。为空或不为off都是on；
-            var signstr = StringUtil.createLinkString(HmacUtil.paraFilter(params))
-            val sign = HmacUtil.HMACSHA1(signstr, appkey)
-            signstr = "$signstr&sign=$sign&sourcetype=food"
-            val c = Client.create()
-            c.setConnectTimeout(20000)
-            val r = c.resource(orderurl)
-            val respClient = r.post(ClientResponse::class.java, signstr)
-            if (200 == respClient.status) {
-                val ret = respClient.getEntity(String::class.java)
-                if (ret != null) {
-                    try {
-                        val gson = Gson()
-                        val result = gson.fromJson(ret, SupYktResp::class.java)
-                        if (result == null) {
-                            code.retcode = "1"
-                            code.retmsg = "返回内容为空"
-                            return code
-                        }
-                        if ("0" != result.retcode) {
-                            if ("30" == result.retcode) {
-                                if (result.other != null) {
-                                    try {
-                                        val supStatusRevResp = gson.fromJson(result.other,
-                                                SupStatusRevResp::class.java)
-                                        if (supStatusRevResp != null) {
-                                            //同流水号，同一笔已经支付完成的，不重复支付。
-                                            if (3 == supStatusRevResp.status
-                                                    && supStatusRevResp.revflag != null
-                                                    && !supStatusRevResp.revflag) {
-                                                code.retcode = "0"
-                                                code.retmsg = "成功"
-                                                return code
-                                            }
-                                        }
-                                    } catch (e: Exception) {
-                                        e.printStackTrace()
-                                    }
-                                }
-                            }
-                            code.retcode = "1"
-                            code.retmsg = "交易失败:" + result.retmsg
-                            return code
-                        }
-                        code.retcode = "0"
-                        code.retmsg = "成功"
-                        return code
-                    } catch (e: Exception) {
-                        e.printStackTrace()
-                    }
-                }
-            }
-            code.retcode = "1"
-            code.retmsg = "请求失败"
-            return code
-        }
 
         fun callWechatPay(config: Map<String, String>, paydtl: TPersondtl, time: String, wechattype: String,
                           realip: String?, qrcode: String?, openid: String?): BaseResp {
@@ -614,12 +528,5 @@
         }
 
         */
-
-        fun CallCitizenCardPay(config: Map<String, String?>, paydtl: TShopdtl): CallBackResp {
-            val resp = CallBackResp()
-            resp.retcode = "0"
-            // TODO: 代扣逻辑
-            return resp
-        }
     }
 }
\ No newline at end of file
