diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
similarity index 92%
rename from payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java
rename to payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
index f992df5..dd83c93 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizParam.java
@@ -9,7 +9,7 @@
 
 import javax.validation.constraints.NotNull;
 
-public class PublishCardParam extends APIRequestParam {
+public class CardBizParam extends APIRequestParam {
   @NotNull(message = "操作员ID不能为空", groups = {InitAction.class, ConfirmAction.class, QueryAction.class})
   private String operid;
 
@@ -23,6 +23,9 @@
 
   private String userid;
 
+  @NotNull(message = "资金方向不能为空", groups = {InitAction.class})
+  private String inOrOut;
+
   @NotNull
   private Integer totalAmount;
 
@@ -150,6 +153,14 @@
     this.charge = charge;
   }
 
+  public String getInOrOut() {
+    return inOrOut;
+  }
+
+  public void setInOrOut(String inOrOut) {
+    this.inOrOut = inOrOut;
+  }
+
   @Override
   public boolean checkParam() throws RequestParamCheckException {
     return true;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
similarity index 91%
rename from payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java
rename to payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
index 77be206..5ee85f0 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/PublishCardResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/CardBizResponse.java
@@ -5,7 +5,7 @@
 
 @AllArgsConstructor
 @NoArgsConstructor
-public class PublishCardResponse extends ApiResponse {
+public class CardBizResponse extends ApiResponse {
   private String refno;
 
   private String accdate;
diff --git a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
index e023ec7..1b1bcd7 100644
--- a/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
+++ b/payapi-sdk/src/main/java/com/supwisdom/dlpay/paysdk/proxy/UserProxy.java
@@ -1,9 +1,7 @@
 package com.supwisdom.dlpay.paysdk.proxy;
 
 import com.supwisdom.dlpay.api.bean.*;
-import org.reactivestreams.Publisher;
 import org.springframework.cloud.openfeign.FeignClient;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 
@@ -28,14 +26,14 @@
   ApiResponse testmsg();
 
   @PostMapping("/api/user/biz_init")
-  PublishCardResponse bizInit(@RequestBody PublishCardParam param);
+  CardBizResponse bizInit(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_confirm")
-  PublishCardResponse bizConfirm(@RequestBody PublishCardParam param);
+  CardBizResponse bizConfirm(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_refund")
-  PublishCardResponse bizRefund(@RequestBody PublishCardParam param);
+  CardBizResponse bizRefund(@RequestBody CardBizParam param);
 
   @PostMapping("/api/user/biz_query")
-  PublishCardResponse bizQuery(@RequestBody PublishCardParam param);
+  CardBizResponse bizQuery(@RequestBody CardBizParam param);
 }
diff --git a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
index 8a0ad65..77a02bc 100644
--- a/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
+++ b/payapi-sdk/src/test/java/com/supwisdom/dlpay/paysdktest/CitizenCardPayProxyTest.java
@@ -5,7 +5,6 @@
 import com.supwisdom.dlpay.api.util.DateUtil;
 import com.supwisdom.dlpay.paysdk.ApiLoginHelper;
 import com.supwisdom.dlpay.paysdk.proxy.*;
-import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -17,10 +16,8 @@
 import org.springframework.cloud.openfeign.FeignAutoConfiguration;
 import org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.http.ResponseEntity;
 import org.springframework.test.context.junit4.SpringRunner;
 
-import java.util.LinkedHashMap;
 import java.util.List;
 
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -235,7 +232,7 @@
     ApiLoginHelper helper = new ApiLoginHelper(apiLoginProxy);
     helper.login(appid, secret);
 
-    PublishCardParam param = new PublishCardParam();
+    CardBizParam param = new CardBizParam();
     param.setTransdate(DateUtil.getNow("yyyyMMdd"));
     param.setTranstime(DateUtil.getNow("HHmmss"));
     param.setOperid("1001");
@@ -248,7 +245,7 @@
     param.setCashPledge(0);
     param.setUserid("ff8080816dd8f3a6016dd8f5e5d80002");
 
-    PublishCardResponse response = userProxy.bizInit(param);
+    CardBizResponse response = userProxy.bizInit(param);
 
     assertThat("user card biz init " + response.getRetcode() + response.getRetmsg() + response.getException(),
         response.getRetcode(), equalTo(0));
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
index ef0018a..90199c8 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/controller/user_api_controller.kt
@@ -169,7 +169,7 @@
     }
 
     @PostMapping("/biz_init")
-    fun userBizInit(@RequestBody @Validated(InitAction::class) request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizInit(@RequestBody @Validated(InitAction::class) request: CardBizParam): ResponseEntity<Any> {
         val builder = TransactionBuilder().apply {
             setTransInfo(request.transdate, request.transtime, TradeCode.TRANSCODE_CARD_BIZ, "balance")
             setOutTransInfo(request.operid, request.operSeqno)
@@ -177,7 +177,7 @@
         }
         val transDesc = arrayListOf<String>()
         transDesc.add(request.summary)
-        val result = PublishCardResponse()
+        val result = CardBizResponse()
 
         val user = useService.findAccountByUserid(request.userid, null)
                 ?: return ResponseBodyBuilder.failEntity(result,
@@ -197,39 +197,76 @@
             setOpposite(capitalSubj.subjno, capitalSubj.subjname)
         }
 
+
         val depositAmount = request.totalAmount - request.cost - request.cashPledge - request.charge
 
-        if (depositAmount < 0) {
+        when (request.inOrOut) {
+            TradeDict.TRADE_FLAG_IN -> {
+                request.totalAmount != 0
+            }
+            TradeDict.TRADE_FLAG_OUT -> {
+                request.totalAmount != 0
+            }
+            else -> false
+        }.takeIf {
+            !it
+        }?.apply {
             return ResponseBodyBuilder.failEntity(result,
-                    TradeErrorCode.INPUT_DATA_ERROR,
-                    "交易金额错误")
+                    TradeErrorCode.INPUT_DATA_ERROR, "资金方案向错误或交易金额有误")
         }
         if (request.totalAmount != 0) {
-            if (depositAmount > 0) {
-                builder.addDebitCreditRecord(capitalSubj.subjno, capitalSubj.subjno,
-                        user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, request.totalAmount / 100.0, request.summary)
-            }
-            if (request.cost > 0) {
-                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_CARD_COST)
-                builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
-                        subject.subjno, subject.subjno, request.cost / 100.0,
-                        request.summary)
-                transDesc.add("卡成本费" + "%.2f".format(request.cost / 100.0) + " 元")
-
-            }
-            if (request.cashPledge > 0) {
-                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_FOREGIFT)
-                builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
-                        subject.subjno, subject.subjno, request.cashPledge / 100.0,
-                        request.summary)
-                transDesc.add("卡押金" + "%.2f".format(request.cashPledge / 100.0) + " 元")
-            }
-            if (request.charge > 0) {
-                val subject = accountUtilServcie.readSubject(Subject.SUBJNO_SERVICEFEE_DEFAULT)
-                builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
-                        subject.subjno, subject.subjno, request.charge / 100.0,
-                        request.summary)
-                transDesc.add("手续费" + "%.2f".format(request.charge / 100.0) + " 元")
+            if (request.inOrOut == TradeDict.TRADE_FLAG_IN) {
+                if (depositAmount != 0) {
+                    builder.addDebitCreditRecord(capitalSubj.subjno, capitalSubj.subjno,
+                            user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT, request.totalAmount / 100.0, request.summary)
+                }
+                if (request.cost != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_CARD_COST)
+                    builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            subject.subjno, subject.subjno, request.cost / 100.0,
+                            request.summary)
+                    transDesc.add("收%s %.2f 元".format(subject.subjname, request.cost / 100.0))
+                }
+                if (request.cashPledge != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_FOREGIFT)
+                    builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            subject.subjno, subject.subjno, request.cashPledge / 100.0,
+                            request.summary)
+                    transDesc.add("收%s %.2f 元".format(subject.subjname, request.cashPledge / 100.0))
+                }
+                if (request.charge != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_SERVICEFEE_DEFAULT)
+                    builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            subject.subjno, subject.subjno, request.charge / 100.0,
+                            request.summary)
+                    transDesc.add("收%s %.2f 元".format(request.charge / 100.0))
+                }
+            } else {
+                if (depositAmount != 0) {
+                    builder.addDebitCreditRecord(user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            capitalSubj.subjno, capitalSubj.subjno, request.totalAmount / 100.0, request.summary)
+                }
+                if (request.cost != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_CARD_COST)
+                    builder.addDebitCreditRecord(subject.subjno, subject.subjno,
+                            user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            request.cost / 100.0, request.summary)
+                    transDesc.add("退%s %.2f 元".format(subject.subjname, request.cost / 100.0))
+                }
+                if (request.cashPledge != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_FOREGIFT)
+                    builder.addDebitCreditRecord(subject.subjno, subject.subjno,
+                            user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            request.cashPledge / 100.0, request.summary)
+                    transDesc.add("退%s %.2f 元".format(subject.subjname, request.cashPledge / 100.0))
+                }
+                if (request.charge != 0) {
+                    val subject = accountUtilServcie.readSubject(Subject.SUBJNO_SERVICEFEE_DEFAULT)
+                    builder.addDebitCreditRecord(subject.subjno, subject.subjno,
+                            user.accno, Subject.SUBJNO_PERSONAL_DEPOSIT,
+                            request.charge / 100.0, request.summary)
+                    transDesc.add("退%s %.2f 元".format(subject.subjname, request.charge / 100.0))
+                }
             }
         }
         builder.description = transDesc.joinToString(";")
@@ -244,9 +281,9 @@
     }
 
     @PostMapping("/biz_confirm")
-    fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizConfirm(@RequestBody @Validated(ConfirmAction::class) request: CardBizParam): ResponseEntity<Any> {
         val transaction = transactionService.success(request.refno)
-        val response = PublishCardResponse().apply {
+        val response = CardBizResponse().apply {
             accdate = transaction.accdate
             refno = transaction.refno
             description = transaction.personDtl.transdesc
@@ -255,12 +292,12 @@
     }
 
     @PostMapping("/biz_refund")
-    fun userBizRefund(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizRefund(@RequestBody @Valid request: CardBizParam): ResponseEntity<Any> {
         return ResponseEntity.ok(ResponseBodyBuilder.create().success())
     }
 
     @GetMapping("/biz_query")
-    fun userBizQuery(@RequestBody @Valid request: PublishCardParam): ResponseEntity<Any> {
+    fun userBizQuery(@RequestBody @Valid request: CardBizParam): ResponseEntity<Any> {
         return ResponseEntity.ok(ResponseBodyBuilder.create().success())
     }
 }
\ No newline at end of file
