diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
index 79bd0be..0906293 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/AgentResponse.java
@@ -1,14 +1,41 @@
 package com.supwisdom.dlpay.agent;
 
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
 public class AgentResponse {
   private AgentCode code;
   private String agentCode;
   private String agentMsg;
 
   private String agentRefno;
+
+  public AgentCode getCode() {
+    return code;
+  }
+
+  public void setCode(AgentCode code) {
+    this.code = code;
+  }
+
+  public String getAgentCode() {
+    return agentCode;
+  }
+
+  public void setAgentCode(String agentCode) {
+    this.agentCode = agentCode;
+  }
+
+  public String getAgentMsg() {
+    return agentMsg;
+  }
+
+  public void setAgentMsg(String agentMsg) {
+    this.agentMsg = agentMsg;
+  }
+
+  public String getAgentRefno() {
+    return agentRefno;
+  }
+
+  public void setAgentRefno(String agentRefno) {
+    this.agentRefno = agentRefno;
+  }
 }
diff --git a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
index b1512d5..6fdd230 100644
--- a/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
+++ b/payapi/src/main/java/com/supwisdom/dlpay/agent/citizencard/YnrccRespCode.java
@@ -1,13 +1,27 @@
 package com.supwisdom.dlpay.agent.citizencard;
 
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import lombok.Setter;
-
-@Getter
-@Setter
-@AllArgsConstructor
 public class YnrccRespCode {
   private String code;
   private String msg;
+
+  public YnrccRespCode(String code, String msg) {
+    this.code = code;
+    this.msg = msg;
+  }
+
+  public String getCode() {
+    return code;
+  }
+
+  public void setCode(String code) {
+    this.code = code;
+  }
+
+  public String getMsg() {
+    return msg;
+  }
+
+  public void setMsg(String msg) {
+    this.msg = msg;
+  }
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
index 8e02f9d..93ec750 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/agent/service/citizencard_service.kt
@@ -26,7 +26,7 @@
 
 }
 
-@Component
+@Component("citizenCardAgent")
 class CitizenCardPayAgent : AgentPayService {
     @Autowired
     private lateinit var citizencardPayService: CitizencardPayService
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
index 2760298..45022c4 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/consume_api_controller.kt
@@ -1,6 +1,7 @@
 package com.supwisdom.dlpay.api.controller
 
 import com.supwisdom.dlpay.agent.AgentCode
+import com.supwisdom.dlpay.agent.AgentPayService
 import com.supwisdom.dlpay.api.*
 import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.service.*
@@ -12,6 +13,7 @@
 import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
 import com.supwisdom.dlpay.agent.service.CitizenCardPayAgent
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.context.ApplicationContext
 import org.springframework.http.ResponseEntity
 import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RequestBody
@@ -36,9 +38,9 @@
     lateinit var cardService: CardService
     @Autowired
     lateinit var citizencardPayService: CitizencardPayService
-
     @Autowired
-    private lateinit var citizenCardPayAgent: CitizenCardPayAgent
+    private lateinit var applicationContext: ApplicationContext
+
     @Autowired
     lateinit var citizencardQueryResultTask: CitizencardQueryResultTask
 
@@ -201,6 +203,13 @@
                 .fail(TradeErrorCode.BUSINESS_PAYTYPE_NOSUPPORT, "不支持支付方式<市民卡代扣>"))
     }
 
+    fun createAgentService(sourceType: String): AgentPayService {
+        return applicationContext.getBean(sourceType + "Agent")?.let {
+            it as AgentPayService
+        } ?: throw TransactionCheckException(TradeErrorCode.BUSINESS_DEAL_ERROR,
+                "支付类型<$sourceType>未定义")
+    }
+
     /**
      * ============================================================================
      *                           市民卡【交易确认】
@@ -209,7 +218,8 @@
     @PostMapping("/citizencard/payfinish")
     fun citizencardPayinit(@Valid @RequestBody param: CitizenCardPayfinishParam): ResponseEntity<Any> {
         val dtl = transactionService.wip(param.refno)
-        val resp = citizenCardPayAgent.pay(dtl)
+        val service = createAgentService(TradeDict.PAYTYPE_CITIZEN_CARD)
+        val resp = service.pay(dtl)
         when (resp.code) {
             AgentCode.SUCCESS ->
                 transactionService.success(dtl.refno, resp.agentRefno, false).let {
@@ -261,48 +271,32 @@
 
             val cancelTrans = builder.cancelInit(mainDtl.refno, transactionService)
             transactionService.wip(cancelTrans.refno)
-            when {
-                TradeDict.PAYTYPE_BALANCE == mainDtl.sourceType -> {
-                    //余额支付，直接撤销
-                    transactionService.success(cancelTrans.refno)
+            val service = createAgentService(mainDtl.sourceType)
+            val resp = service.pay(cancelTrans)
+            when (resp.code) {
+                AgentCode.SUCCESS -> {
+                    transactionService.success(cancelTrans.refno, resp.agentRefno, false)
 
                     return ResponseEntity.ok(ResponseBodyBuilder.create()
                             .success(PayReverseResponse(cancelTrans.refno), "交易撤销成功"))
-
                 }
-                TradeDict.PAYTYPE_CITIZEN_CARD == mainDtl.sourceType -> {
-                    val resp = citizenCardPayAgent.pay(cancelTrans)
-                    when (resp.code) {
-                        AgentCode.SUCCESS -> {
-                            transactionService.success(cancelTrans.refno, resp.agentRefno, false)
-
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .success(PayReverseResponse(cancelTrans.refno), "交易撤销成功"))
-                        }
-                        AgentCode.NEED_QUERY -> {
-                            //待查询
-                            citizencardQueryResultTask.queryResult(cancelTrans.refno, 0)
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(PayReverseResponse(cancelTrans.refno),
-                                            TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
-                        }
-                        else -> transactionService.fail(cancelTrans.refno,
-                                "${resp.agentCode}-${resp.agentMsg}").let {
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(PayReverseResponse(cancelTrans.refno),
-                                            TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
-                        }
-                    }
+                AgentCode.NEED_QUERY -> {
+                    //待查询
+                    citizencardQueryResultTask.queryResult(cancelTrans.refno, 0)
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(cancelTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
                 }
-                else -> return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(PayReverseResponse(cancelTrans.refno),
-                                TradeErrorCode.BUSINESS_DEAL_ERROR, "暂不支持支付方式[${mainDtl.sourceType}]的流水撤销"))
+                else -> transactionService.fail(cancelTrans.refno,
+                        "${resp.agentCode}-${resp.agentMsg}").let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(cancelTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
+                }
             }
 
-
-        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
-                .fail(PayReverseResponse(),
-                        TradeErrorCode.BUSINESS_DEAL_ERROR, "流水不存在"))
+        } ?: return ResponseEntity.ok(ResponseBodyBuilder.create().fail(PayReverseResponse(),
+                TradeErrorCode.BUSINESS_DEAL_ERROR, "流水不存在"))
     }
 
     /**
@@ -331,41 +325,31 @@
             }
             val refundTrans = builder.refundInit(mainDtl.refno, param.refundAmount / 100.0, transactionService)
             transactionService.wip(refundTrans.refno)
-            when {
-                TradeDict.PAYTYPE_BALANCE == mainDtl.sourceType -> {
-                    //余额支付，直接撤销
-                    transactionService.success(refundTrans.refno)
+            val service = createAgentService(mainDtl.sourceType)
+            val resp = service.refund(refundTrans)
+
+            when (resp.code) {
+                AgentCode.SUCCESS -> {
+                    transactionService.success(refundTrans.refno, resp.agentRefno, false)
 
                     return ResponseEntity.ok(ResponseBodyBuilder.create()
-                            .success(PayReverseResponse(refundTrans.refno), "交易退款成功"))
-
+                            .success(PayReverseResponse(refundTrans.refno), "交易撤销成功"))
                 }
-                TradeDict.PAYTYPE_CITIZEN_CARD == mainDtl.sourceType -> {
-
-                    val resp = citizencardPayService.cardPayRefund(refundTrans.refno, refundTrans.accdate, mainDtl.refno, MoneyUtil.YuanToFen(mainDtl.personDtl.amount))
-                    when {
-                        YnrccUtil.CODE_SUCCESS == resp.code -> {
-                            transactionService.success(refundTrans.refno, resp.bankjourno, false)
-
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .success(PayReverseResponse(refundTrans.refno), "交易退款成功"))
-                        }
-                        YnrccUtil.CODE_EXCEPTION == resp.code -> {
-                            //待查询
-                            citizencardQueryResultTask.queryResult(refundTrans.refno, 0)
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .data("refundRefno", refundTrans.refno)
-                                    .fail(TradeErrorCode.WAIT_QUERY_RESULT, "请查询退款结果"))
-                        }
-                        else -> transactionService.fail(refundTrans.refno, resp.message).let {
-                            return ResponseEntity.ok(ResponseBodyBuilder.create()
-                                    .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "交易退款失败-${resp.message}"))
-                        }
-                    }
+                AgentCode.NEED_QUERY -> {
+                    //待查询
+                    citizencardQueryResultTask.queryResult(refundTrans.refno, 0)
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(refundTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
                 }
-                else -> return ResponseEntity.ok(ResponseBodyBuilder.create()
-                        .fail(TradeErrorCode.BUSINESS_DEAL_ERROR, "暂不支持支付方式[${mainDtl.sourceType}]的流水退款"))
+                else -> transactionService.fail(refundTrans.refno,
+                        "${resp.agentCode}-${resp.agentMsg}").let {
+                    return ResponseEntity.ok(ResponseBodyBuilder.create()
+                            .fail(PayReverseResponse(refundTrans.refno),
+                                    TradeErrorCode.WAIT_QUERY_RESULT, "请查询撤销结果"))
+                }
             }
+
         } ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
                 .fail(TradeErrorCode.TRANSACTION_NOT_EXISTS, "流水不存在"))
     }
