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 6694d81..cf71a6d 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -11,6 +11,7 @@
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.service.MobileApiService
+import com.supwisdom.dlpay.system.service.DictionaryProxy
 import com.supwisdom.dlpay.util.ConstantUtil
 import org.apache.commons.lang.StringUtils
 import org.springframework.beans.factory.annotation.Autowired
@@ -187,10 +188,10 @@
         if (!user.paypwd.isNullOrEmpty()) {
             payseted = true
         }
-        var signed=""
-        if(!user.userid.isNullOrEmpty()){
+        var signed = ""
+        if (!user.userid.isNullOrEmpty()) {
             val card = mobileApiService.findCardByUserid(user.userid!!)
-            if(card!=null&&card.signed){
+            if (card != null && card.signed) {
                 signed = TradeDict.STATUS_YES
             }
         }
@@ -215,6 +216,14 @@
     lateinit var userService: UserService
     @Autowired
     lateinit var redisTemplate: RedisTemplate<String, String>
+    @Autowired
+    lateinit var dictionaryProxy: DictionaryProxy
+
+    @RequestMapping("/idtypes")
+    fun idtypes(): JsonResult {
+        var dict = dictionaryProxy.getDictionaryAsMap(Dictionary.IDTYPE)
+        return JsonResult.ok("OK").put("idtypes", dict)!!
+    }
 
     /**
      * 用户信息
@@ -248,7 +257,7 @@
     }
 
     @RequestMapping("/checkcode")
-    fun check(@RequestParam code: String
+    fun check(@RequestParam code: String, @RequestParam personid: String?
     ): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
         val user = mobileApiService.findUserById(p.name)
@@ -261,6 +270,13 @@
             val newCode = RandomUtils.getRandomString(30)
             redisTemplate.opsForValue().set(user.uid, newCode, Duration.ofHours(1))
             redisTemplate.delete(user.phone)
+            if (!personid.isNullOrEmpty()) {
+                //绑定用户
+                val person = userService.findOnePersonByUserid(personid)
+                user.bindtime = DateUtil.getNow()
+                user.userid = person.userid
+                mobileApiService.saveUser(user)
+            }
             return JsonResult.ok("OK").put("randcode", newCode)!!
         } else {
             return JsonResult.error(-1, "验证码无效或已过期，请重新获取")
@@ -271,51 +287,41 @@
      * 绑卡
      * */
     @RequestMapping("/bindcard")
-    fun bindcard(cardno: String, name: String, code: String): JsonResult {
+    fun bindcard(cardno: String, name: String, idtype: String, idno: String): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
         val phone = user.phone
-        val temp = redisTemplate.opsForValue().get(phone)
-        if (!temp.isNullOrEmpty()) {
-            if (temp != code) {
-                return JsonResult.error("验证码错误")
-            }
-            val card = mobileApiService.findCardByNo(cardno)
-                    ?: return JsonResult.error("银行卡号有误")
-            if (card.userid.isNullOrEmpty() || card.status != TradeDict.STATUS_NORMAL) {
-                return JsonResult.error("银行卡号信息有误")
-            }
-            if (card.transStatus==TradeDict.STATUS_NORMAL) {
-                return JsonResult.error("该卡片非正常卡，无法绑定，请联系客服人员，更新卡状态")
-            }
-            val person = userService.findOnePersonByUserid(card.userid)
-            if(name!=person.name){
-                return JsonResult.error("姓名错误")
-            }
-            val exsitUser = mobileApiService.findUserById(card.userid)
-            if (exsitUser != null) {
-                return JsonResult.error("该银行卡号已被绑定，如有疑问，请联系客服")
-            }
-            user.bindtime = DateUtil.getNow()
-            user.userid = card.userid
-            mobileApiService.saveUser(user)
-            redisTemplate.delete(phone)
-            var payseted = false
-            if (!user.paypwd.isNullOrEmpty()) {
-                payseted = true
-            }
-            var signed=""
-            if(card.signed){
-                signed = TradeDict.STATUS_YES
-            }
-            return JsonResult.ok("OK").put("userid", user.userid)
-                    ?.put("paypwdset", payseted)
-                    ?.put("signed", signed)!!
-
-        } else {
-            return JsonResult.error(-1, "验证码无效或已过期，请重新获取")
+        val card = mobileApiService.findCardByNo(cardno)
+                ?: return JsonResult.error("银行卡号有误")
+        if (card.userid.isNullOrEmpty() || card.status != TradeDict.STATUS_NORMAL) {
+            return JsonResult.error("银行卡号信息有误")
         }
+        val exsitUser = mobileApiService.findUserById(card.userid)
+        if (exsitUser != null) {
+            return JsonResult.error("该银行卡号已被绑定，如有疑问，请联系客服")
+        }
+        //TODO call api
+        //user.bindtime = DateUtil.getNow()
+        //user.userid = card.userid
+        //mobileApiService.saveUser(user)
+        val code = RandomUtils.randomNumber(6)
+        System.out.println(code)
+        redisTemplate.opsForValue().set(user.phone, code, Duration.ofMinutes(5))
+        var payseted = false
+        if (!user.paypwd.isNullOrEmpty()) {
+            payseted = true
+        }
+        var signed = ""
+        if (card.signed) {
+            signed = TradeDict.STATUS_YES
+        }
+        return JsonResult.ok("OK").put("personid", card.userid)
+                ?.put("paypwdset", payseted)
+                ?.put("phonex", StringUtil.phoneReplace(phone))
+                ?.put("signed", signed)!!
+
+
     }
 
     /**
@@ -349,19 +355,19 @@
                         return JsonResult.error("原支付密码错误")
                     }
                     val paypwdtimes = user.checkPaypwdtime()
-                    if(paypwdtimes==-1){
+                    if (paypwdtimes == -1) {
                         return JsonResult.error("密码错误次数过多，请30分钟后再试")
-                    }else if(paypwdtimes==1){
+                    } else if (paypwdtimes == 1) {
                         mobileApiService.saveUser(user)
                     }
-                    if(!encoder.matches(oldpwd, user.paypwd)){
+                    if (!encoder.matches(oldpwd, user.paypwd)) {
                         user.updatePaypwderror(false).also {
-                            if(it) mobileApiService.saveUser(user)
+                            if (it) mobileApiService.saveUser(user)
                         }
                         return JsonResult.error("原支付密码错误")
-                    }else{
+                    } else {
                         user.updatePaypwderror(true).also {
-                            if(it) mobileApiService.saveUser(user)
+                            if (it) mobileApiService.saveUser(user)
                         }
                     }
                     user.paypwd = encoder.encode(pwd)
@@ -398,16 +404,17 @@
             val p = SecurityContextHolder.getContext().authentication
             val user = mobileApiService.findUserById(p.name)
                     ?: return JsonResult.error("用户不存在，请注册")
-            var signed=""
-            if(!user.userid.isNullOrEmpty()){
-                var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1,"卡片不存在，请重新绑定")
-                if(card.signed){
+            var signed = ""
+            if (!user.userid.isNullOrEmpty()) {
+                var card = mobileApiService.findCardByUserid(user.userid!!)
+                        ?: return JsonResult.error(-1, "卡片不存在，请重新绑定")
+                if (card.signed) {
                     signed = TradeDict.STATUS_YES
                 }
-            }else{
-                return JsonResult.error(-1,"请先绑定银行卡")
+            } else {
+                return JsonResult.error(-1, "请先绑定银行卡")
             }
-            return JsonResult.ok("OK").put("page", page.pageContent)?.put("signed",signed)!!
+            return JsonResult.ok("OK").put("page", page.pageContent)?.put("signed", signed)!!
         }
         return JsonResult.error("页面未配置")
     }
@@ -423,17 +430,21 @@
                 ?: return JsonResult.error("用户不存在，请注册")
         user.issigned = TradeDict.STATUS_YES
         user.signedtime = DateUtil.getNow()
-        var signed=""
-        if(!user.userid.isNullOrEmpty()){
+        var signed: String
+        if (!user.userid.isNullOrEmpty()) {
             var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error("卡片不存在，请重新绑定")
-            if(card.signed){
+            if (card.signed) {
+                signed = TradeDict.STATUS_YES
+            }else{
+                //TODO call sign api
+                card.signed = true
+                mobileApiService.saveCard(card)
                 signed = TradeDict.STATUS_YES
             }
-            card.signed = true
-            mobileApiService.saveCard(card)
+        }else{
+            return JsonResult.error("请先绑定银行卡")
         }
         mobileApiService.saveUser(user)
-        //TODO 调用第三方接口签约
         return JsonResult.ok("ok")
                 .put("signed", signed)!!
     }
@@ -478,12 +489,12 @@
         val person = userService.findOnePersonByUserid(user.userid!!)
         val card = mobileApiService.findCardByUserid(user.userid!!)
         var needrebind = false
-        var signed=""
-        if(card==null){
+        var signed = ""
+        if (card == null) {
             //卡片已补办，或绑定失败，需要重新绑定
             needrebind = true
-        }else{
-            if(card.signed){
+        } else {
+            if (card.signed) {
                 signed = TradeDict.STATUS_YES
             }
         }
@@ -496,7 +507,7 @@
                 ?.put("amount", amount)
                 ?.put("paypwdset", payseted)
                 ?.put("name", name)
-                ?.put("needrebind",needrebind)
+                ?.put("needrebind", needrebind)
                 ?.put("signed", signed)
                 ?.put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)!!.put("t", t)!!
     }
@@ -531,24 +542,25 @@
             return JsonResult.error("请重新设置密码，密码不能小于6位字符")
         }
         val pwdtimes = user.checkLoginpwdtime()
-        if(pwdtimes==-1){
-            return JsonResult.error(-1,"原密码错误次数过多，将退出系统，请重新登录系统或点击忘记密码功能找回密码")
-        }else if(pwdtimes==1){
+        if (pwdtimes == -1) {
+            return JsonResult.error(-1, "原密码错误次数过多，将退出系统，请重新登录系统或点击忘记密码功能找回密码")
+        } else if (pwdtimes == 1) {
             mobileApiService.saveUser(user)
         }
         val encoder = BCryptPasswordEncoder()
-        if(!encoder.matches(oldpwd, user.loginpwd)){
+        if (!encoder.matches(oldpwd, user.loginpwd)) {
             user.updateLoginpwderror(false).also {
-                if(it) mobileApiService.saveUser(user)
+                if (it) mobileApiService.saveUser(user)
             }
             return JsonResult.error("原密码错误")
-        }else{
+        } else {
             user.updateLoginpwderror(true)
         }
         user.loginpwd = encoder.encode(newpwd)
         mobileApiService.saveUser(user)
         return JsonResult.ok("密码修改成功")
     }
+
     /**
      *
      * 市民卡挂失
@@ -558,23 +570,24 @@
         val p = SecurityContextHolder.getContext().authentication
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
-        if(user.userid.isNullOrEmpty()){
-            return JsonResult.error(-1,"银行卡未绑定，请先绑定")
+        if (user.userid.isNullOrEmpty()) {
+            return JsonResult.error(-1, "银行卡未绑定，请先绑定")
         }
         val person = userService.findOnePersonByUserid(user.userid!!)
-        val card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1,"银行卡未绑定，请先绑定")
-        var status=""
+        val card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1, "银行卡未绑定，请先绑定")
+        var status = ""
         //normal/loss/frozen/locked
-        when(card.transStatus){
-            TradeDict.STATUS_NORMAL-> status = "正常"
-            TradeDict.STATUS_LOST-> status = "已挂失"
-            TradeDict.STATUS_LOCKED-> status = "已锁定"
-            TradeDict.STATUS_FROZEN-> status = "已冻结"
+        when (card.transStatus) {
+            TradeDict.STATUS_NORMAL -> status = "正常"
+            TradeDict.STATUS_LOST -> status = "已挂失"
+            TradeDict.STATUS_LOCKED -> status = "已锁定"
+            TradeDict.STATUS_FROZEN -> status = "已冻结"
         }
-        return JsonResult.ok("ok").put("name",person.name)
-                ?.put("cardno",card.cardno)
-                ?.put("cardstatus",status)!!
+        return JsonResult.ok("ok").put("name", person.name)
+                ?.put("cardno", card.cardno)
+                ?.put("cardstatus", status)!!
     }
+
     /**
      *
      * 市民卡挂失
@@ -585,27 +598,27 @@
         val user = mobileApiService.findUserById(p.name)
                 ?: return JsonResult.error("用户不存在，请注册")
         val paypwdtimes = user.checkPaypwdtime()
-        if(paypwdtimes==-1){
+        if (paypwdtimes == -1) {
             return JsonResult.error("支付密码错误次数过多，请30分钟后再试")
-        }else if(paypwdtimes==1){
+        } else if (paypwdtimes == 1) {
             mobileApiService.saveUser(user)
         }
         val encoder = BCryptPasswordEncoder()
-        if(!encoder.matches(paypwd, user.paypwd)){
+        if (!encoder.matches(paypwd, user.paypwd)) {
             user.updatePaypwderror(false).also {
-                if(it) mobileApiService.saveUser(user)
+                if (it) mobileApiService.saveUser(user)
             }
             return JsonResult.error("支付密码错误")
-        }else{
+        } else {
             user.updatePaypwderror(true).also {
-                if(it) mobileApiService.saveUser(user)
+                if (it) mobileApiService.saveUser(user)
             }
         }
-        var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1,"银行卡未绑定，请先绑定")
-        if(card.transStatus!=TradeDict.STATUS_NORMAL){
+        var card = mobileApiService.findCardByUserid(user.userid!!) ?: return JsonResult.error(-1, "银行卡未绑定，请先绑定")
+        if (card.transStatus != TradeDict.STATUS_NORMAL) {
             return JsonResult.error("卡状态非正常，不能挂失")
         }
-        card.transStatus=TradeDict.STATUS_LOST
+        card.transStatus = TradeDict.STATUS_LOST
         mobileApiService.saveCard(card)
         return JsonResult.ok("ok")
     }
