修改绑定签约、解约接口
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/BindCardParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/BindCardParam.java
new file mode 100644
index 0000000..92428f0
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/BindCardParam.java
@@ -0,0 +1,34 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+@Getter
+@Setter
+public class BindCardParam extends APIRequestParam {
+  @Sign
+  @NotEmpty(message = "卡号不能为空")
+  private String cardno;
+  @Sign
+  @NotEmpty(message = "姓名不能为空")
+  private String name;
+  @Sign
+  @NotEmpty(message = "证件类型不能为空")
+  private String idtype;
+  @Sign
+  @NotEmpty(message = "证件号不能为空")
+  private String idno;
+  @Sign
+  @NotEmpty(message = "手机号不能为空")
+  private String phone;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    return true;
+  }
+}
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodeParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodeParam.java
new file mode 100644
index 0000000..cca7278
--- /dev/null
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/QrcodeParam.java
@@ -0,0 +1,31 @@
+package com.supwisdom.dlpay.api.bean;
+
+import com.supwisdom.dlpay.api.APIRequestParam;
+import com.supwisdom.dlpay.api.annotation.Sign;
+import com.supwisdom.dlpay.api.exception.RequestParamCheckException;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+
+@Getter
+@Setter
+public class QrcodeParam extends APIRequestParam {
+  @Sign
+  @NotEmpty(message = "用户id不能为空")
+  private String userid;
+  @Sign
+  @NotEmpty(message = "手机用户id不能为空")
+  private String uid;
+  @Sign
+  @NotEmpty(message = "secertkey不能为空")
+  private String secertkey;
+  @Sign
+  @NotEmpty(message = "rsapublic不能为空")
+  private String rsapublic;
+
+  @Override
+  public boolean checkParam() throws RequestParamCheckException {
+    return true;
+  }
+}
\ No newline at end of file
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 55aa02e..39a759e 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
@@ -55,4 +55,15 @@
   @PostMapping("/api/user/updateCardTransStatus")
   ApiResponse updateCardTransStatus(@RequestParam("cardno") String cardno,@RequestParam("status") String status);
 
+  @PostMapping("/api/user/bindcard")
+  Map<String, Object> bindCard(@RequestBody BindCardParam param);
+
+  @PostMapping("/api/user/signbxy")
+  ApiResponse signbxy(@RequestParam("userid") String userid,@RequestParam("code") String code,@RequestParam("phone") String phone);
+
+  @PostMapping("/api/user/unsignbxy")
+  ApiResponse unsignbxy(@RequestParam("userid") String userid,@RequestParam("phone") String phone);
+
+  @PostMapping("/api/user/qrcode")
+  Map<String, Object> qrcode(@RequestBody QrcodeParam param);
 }
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 14a7bf8..d20d616 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
@@ -1,13 +1,18 @@
 package com.supwisdom.dlpay.api.controller
 
+import com.supwisdom.dlpay.agent.citizencard.YnrccUtil
+import com.supwisdom.dlpay.agent.service.CitizencardPayService
 import com.supwisdom.dlpay.api.bean.*
 import com.supwisdom.dlpay.api.exception.RequestParamCheckException
 import com.supwisdom.dlpay.api.service.CardService
 import com.supwisdom.dlpay.api.service.KafkaSendMsgService
+import com.supwisdom.dlpay.api.service.QRCodeService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.exception.TransactionException
 import com.supwisdom.dlpay.framework.ResponseBodyBuilder
+import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.framework.util.TradeErrorCode
+import com.supwisdom.dlpay.mobile.service.MobileApiService
 import com.supwisdom.dlpay.system.bean.LevelBean
 import com.supwisdom.dlpay.system.service.PointsService
 import org.apache.commons.beanutils.BeanUtils
@@ -27,6 +32,15 @@
     private lateinit var kafkaSendMsgService: KafkaSendMsgService
     @Autowired
     private lateinit var pointsService: PointsService
+    @Autowired
+    private lateinit var mobileApiService: MobileApiService
+    @Autowired
+    private lateinit var userService: UserService
+    @Autowired
+    private lateinit var citizencardPayService: CitizencardPayService
+    @Autowired
+    private lateinit var qrcodeService: QRCodeService
+
 
 
     @PostMapping("/open")
@@ -263,4 +277,101 @@
                     .fail(ret.retcode, ret.retmsg))
         }
     }
+
+    /**
+     * 用户绑卡
+     */
+    @PostMapping("/bindcard")
+    fun bindCard(@RequestBody param: BindCardParam):ResponseEntity<Any>{
+        val card = mobileApiService.findCardByNo(param.cardno)
+                ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(400, "银行卡号有误"))
+        if (card.userid.isNullOrEmpty() || card.status != TradeDict.STATUS_NORMAL) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, "银行卡号信息有误"))
+        }
+        val person = userService.findOnePersonByUserid(card.userid)
+        if (person.name != param.name) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(400, "绑定信息有误[姓名]"))
+        }
+        if (person.idtype != param.idtype || person.idno != param.idno) {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(400, "绑定信息有误[证件类型/证件号]"))
+        }
+        var signed = ""
+        //call api
+        val resp = citizencardPayService.bindCard(param.cardno, param.name, param.idtype, param.idno, param.phone)
+        if (resp.code != "0000") {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, resp.message))
+        }
+        if (resp.sinstatus == YnrccUtil.TRANSTYPE_SIGNCARD ) {
+            signed = TradeDict.STATUS_YES
+            if(!card.signed){
+                card.signed = true
+                mobileApiService.saveCard(card)
+            }
+        }
+        return  ResponseEntity.ok(ResponseBodyBuilder.create().data("signed", signed)
+                .success("ok"))
+    }
+
+    /**
+     * 签约银行协议
+     */
+    @PostMapping("/signbxy")
+    fun signbxy(userid: String, code: String, phone: String): ResponseEntity<Any> {
+        val card = mobileApiService.findCardByUserid(userid)
+                ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(400, "卡片不存在,请重新绑定"))
+        //call sign api
+        val person = userService.findOnePersonByUserid(card.userid)
+        val resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, phone, YnrccUtil.TRANSTYPE_SIGNCARD, code)
+        if (resp.code != "0000") {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, resp.message))
+        }
+        card.signed = true
+        mobileApiService.saveCard(card)
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .success("ok"))
+    }
+
+    /**
+     * 用户解约
+     */
+    @PostMapping("/unsignbxy")
+    fun unsignbxy(userid: String,phone:String): ResponseEntity<Any> {
+        val card = mobileApiService.findCardByUserid(userid)
+                ?: return ResponseEntity.ok(ResponseBodyBuilder.create()
+                        .fail(400, "银行卡不存在,不能解除代扣协议"))
+        //call sign api
+        val person = userService.findOnePersonByUserid(card.userid)
+        val captcha = ""//此处为验证码,暂由此参数代替
+        var resp = citizencardPayService.signCard(card.cardno, person.name, person.idtype, person.idno, phone, YnrccUtil.TRANSTYPE_UNSIGNCARD, captcha)
+        if (resp.code != "0000") {
+            return ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, resp.message))
+        }
+        card.signed = false
+        mobileApiService.saveCard(card)
+        return ResponseEntity.ok(ResponseBodyBuilder.create()
+                .success("ok"))
+    }
+
+    /**
+     * 二维码
+     */
+    @PostMapping("/qrcode")
+    fun qrcode(@RequestBody param: QrcodeParam): ResponseEntity<Any> {
+        val resp = qrcodeService.encodeCode(param)
+        return if (resp.retcode == 0) {
+            ResponseEntity.ok(ResponseBodyBuilder.create().data("qrcode", resp.retmsg)
+                    .success("ok"))
+        } else {
+            ResponseEntity.ok(ResponseBodyBuilder.create()
+                    .fail(500, resp.retmsg))
+        }
+    }
 }
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
index f26dafa..31da5df 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/qrcode_srvice_impl.kt
@@ -3,6 +3,7 @@
 import com.google.gson.Gson
 import com.supwisdom.dlpay.api.bean.ApiResponse
 import com.supwisdom.dlpay.api.bean.DoorQrcodeResponse
+import com.supwisdom.dlpay.api.bean.QrcodeParam
 import com.supwisdom.dlpay.api.service.QRCodeService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.framework.service.SystemUtilService
@@ -30,8 +31,9 @@
 
     val logger = KotlinLogging.logger { }
 
-    override fun encodeCode(uid:String): ApiResponse {
+    override fun encodeCode(param: QrcodeParam): ApiResponse {
         var resp = ApiResponse()
+        val uid = param.uid
         val rootkey = systemUtilService.getBusinessValue("aes.cfb.rootkey")
         val iv = systemUtilService.getBusinessValue("aes.cfb.iv")
         if (rootkey.isNullOrEmpty()||iv.isNullOrEmpty()) {
@@ -39,23 +41,12 @@
             resp.retmsg = "秘钥未配置"
             return resp
         }
-        val muser = mobileApiService.findUserById(uid)
-        if(muser==null||TradeDict.STATUS_NORMAL!=muser.status){
-            resp.retcode = 1
-            resp.retmsg = "用户不存在或状态异常"
-            return resp
-        }
-        if(muser.userid.isNullOrEmpty()){
-            resp.retcode = 1
-            resp.retmsg = "用户未绑定身份"
-            return resp
-        }
-        val totp = QrCodeTotpUtil.generateTOTP(muser.secertkey)
+        val totp = QrCodeTotpUtil.generateTOTP(param.secertkey)
         val rowdata = QrcodeRawData()
-        rowdata.userid = muser.userid
+        rowdata.userid = param.userid
         rowdata.setTotp(totp)
         val orgData = Gson().toJson(rowdata)
-        val publicKey = RSAKeysGenerate.getPublicKey(muser.rsapublic)
+        val publicKey = RSAKeysGenerate.getPublicKey(param.rsapublic)
         val encdata = org.apache.commons.codec.binary.Base64.encodeBase64String(RSAKeysGenerate.encryptbyte(publicKey, orgData))
         val qrcode = AesUtil.encryptCFB("$uid:$encdata", rootkey, iv, "AES/CFB/NoPadding")
 
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
index 029f6a8..b5facd8 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/api/service/qrcode_service.kt
@@ -2,8 +2,9 @@
 
 import com.supwisdom.dlpay.api.bean.ApiResponse
 import com.supwisdom.dlpay.api.bean.DoorQrcodeResponse
+import com.supwisdom.dlpay.api.bean.QrcodeParam
 
 interface QRCodeService {
-    fun encodeCode(uid: String): ApiResponse
+    fun encodeCode(param: QrcodeParam): ApiResponse
     fun decodeCode(qrcode: String): DoorQrcodeResponse
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index 299fd7f..417e852 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -857,18 +857,18 @@
      *
      * 二维码在线生成
      * */
-    @RequestMapping("/qrcode")
-    fun qrcode(): JsonResult {
-        val p = SecurityContextHolder.getContext().authentication
-        val user = mobileApiService.findUserById(p.name)
-                ?: return JsonResult.error("用户不存在,请注册")
-        val resp = qrcodeService.encodeCode(user.uid)
-        return if(resp.retcode==0){
-            JsonResult.ok("ok").put("qrcode", resp.retmsg)!!
-        }else{
-            JsonResult.error(resp.retmsg)
-        }
-    }
+//    @RequestMapping("/qrcode")
+//    fun qrcode(): JsonResult {
+//        val p = SecurityContextHolder.getContext().authentication
+//        val user = mobileApiService.findUserById(p.name)
+//                ?: return JsonResult.error("用户不存在,请注册")
+//        val resp = qrcodeService.encodeCode(user.uid)
+//        return if(resp.retcode==0){
+//            JsonResult.ok("ok").put("qrcode", resp.retmsg)!!
+//        }else{
+//            JsonResult.error(resp.retmsg)
+//        }
+//    }
 
     /**
      *