diff --git a/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java b/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
index 467ac47..f516373 100644
--- a/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
+++ b/src/main/java/com/supwisdom/dlpay/api/dao/PersondtlDao.java
@@ -1,10 +1,13 @@
 package com.supwisdom.dlpay.api.dao;
 
 import com.supwisdom.dlpay.api.domain.TPersondtl;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.stereotype.Repository;
 
 @Repository
 public interface PersondtlDao extends JpaRepository<TPersondtl, String>,JpaSpecificationExecutor<TPersondtl> {
+    Page<TPersondtl> findByUseridAndStatus(String userid,String status, Pageable pageable);
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java b/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
index 47ece23..d32ff8e 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/domain/JwtRedis.java
@@ -2,9 +2,10 @@
 
 import org.springframework.data.annotation.Id;
 import org.springframework.data.redis.core.RedisHash;
+import org.springframework.data.redis.core.TimeToLive;
 
 
-@RedisHash(value = "api_jwt", timeToLive = 3600L)
+@RedisHash(value = "api_jwt")
 public class JwtRedis {
   @Id
   String jti;
@@ -13,6 +14,7 @@
 
   String uid;
 
+  @TimeToLive
   Long expiration;
 
   public String getJti() {
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
index 8da1f6c..fe39ac8 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/DateUtil.java
@@ -33,6 +33,22 @@
     java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(partten);
     return sdf.format(new Date());
   }
+  /*
+  *
+  * */
+  public static String getNowInterDay(int intervalday) {
+    try {
+      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat("yyyyMMdd");
+      Date d = new Date();
+      Calendar calendar = Calendar.getInstance();
+      calendar.setTimeInMillis(d.getTime());
+      calendar.add(Calendar.DATE, intervalday);
+      return sdf.format(calendar.getTime());
+    } catch (Exception e) {
+      e.printStackTrace();
+      return null;
+    }
+  }
 
   /**
    * Description: 得到一个特殊的时间 @param startTime String 格式：yyyyMMddHHmmss @param
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
index 9d44ea9..20756cc 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/StringUtil.java
@@ -131,6 +131,24 @@
     }*/
     return true;
   }
+  /**
+   * 手机号遮掩中间4位
+   * */
+  public static String phoneReplace(String phone){
+    return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
+  }
 
+  /**
+   * 邮箱只显示@前面的首位和末位
+   * */
+  public static String emailReplace(String s){
+    return  s.replaceAll("(\\w?)(\\w+)(\\w)(@\\w+\\.[a-z]+(\\.[a-z]+)?)", "$1****$3$4");
+  }
 
+  /**
+   * 名字显示姓
+   * */
+  public static String nameReplace(String s){
+    return  s.replaceAll("([\\d\\D]{1})(.*)", "$1**");
+  }
 }
diff --git a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
index d5c3eda..d193d3a 100644
--- a/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
+++ b/src/main/java/com/supwisdom/dlpay/framework/util/TradeDict.java
@@ -11,6 +11,8 @@
   public static final String STATUS_CLOSED = "closed";
   public static final String STATUS_LOCKED = "locked";
 
+  public static final String STATUS_YES = "yes";
+  public static final String STATUS_NO = "no";
   /**
    * JWT 状态
    */
diff --git a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
index 3d93fc1..6f56ce7 100644
--- a/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
+++ b/src/main/java/com/supwisdom/dlpay/util/ConstantUtil.java
@@ -39,4 +39,5 @@
   * */
 
   public static final String PAGE_USERXIEYI = "xieyi";//用户协议页面
+  public static final String PAGE_BANKXIEYI = "bankxieyi";//银行协议页面
 }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
index 7d24186..6a17565 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/impl/user_service_impl.kt
@@ -2,19 +2,16 @@
 
 import com.supwisdom.dlpay.api.bean.ModifyUserParam
 import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.dao.AccountDao
-import com.supwisdom.dlpay.api.dao.PersonDao
-import com.supwisdom.dlpay.api.dao.PersonIdentityDao
-import com.supwisdom.dlpay.api.dao.PointsAccountDao
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
+import com.supwisdom.dlpay.api.dao.*
+import com.supwisdom.dlpay.api.domain.*
 import com.supwisdom.dlpay.framework.service.SystemUtilService
 import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.exception.TransactionProcessException
+import com.supwisdom.dlpay.framework.domain.TOperator
 import com.supwisdom.dlpay.framework.util.*
 import org.springframework.beans.factory.annotation.Autowired
+import org.springframework.data.domain.PageRequest
+import org.springframework.data.domain.Sort
 import org.springframework.stereotype.Service
 
 /**
@@ -32,6 +29,9 @@
     private lateinit var pointsAccountDao: PointsAccountDao
     @Autowired
     private lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    private lateinit var persondtlDao: PersondtlDao
+
 
     override fun registerUser(param: OpenUserParam): TPerson {
         var person = personDao.findByIdentity(param.idtype, param.idno)
@@ -172,4 +172,20 @@
                 ?: throw TransactionProcessException(TradeErrorCode.ACCOUNT_NOT_EXISTS, "用户<$userid>不存在")
     }
 
+    override fun findPersondtlByUserid(userid: String,pageno:Int): PageResult<TPersondtl> {
+        var pageable = PageRequest.of(pageno - 1, 10, Sort.Direction.DESC, "transdate","transtime")
+        return PageResult<TPersondtl>(persondtlDao.findByUseridAndStatus(userid,TradeDict.DTL_STATUS_SUCCESS,pageable))
+    }
+
+    override fun findPersondtlDetailByUserid(userid: String, billno: String): TPersondtl? {
+        var dtl = persondtlDao.findById(billno)
+        if(dtl.isPresent){
+            if(userid!=dtl.get().userid){
+                return null
+            }
+            return dtl.get()
+        }else{
+            return null
+        }
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
index 6ac023e..f758859 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/api/service/user_service.kt
@@ -2,10 +2,8 @@
 
 import com.supwisdom.dlpay.api.bean.ModifyUserParam
 import com.supwisdom.dlpay.api.bean.OpenUserParam
-import com.supwisdom.dlpay.api.domain.TAccount
-import com.supwisdom.dlpay.api.domain.TPerson
-import com.supwisdom.dlpay.api.domain.TPersonIdentity
-import com.supwisdom.dlpay.api.domain.TPointsAccount
+import com.supwisdom.dlpay.api.domain.*
+import com.supwisdom.dlpay.framework.util.PageResult
 import org.springframework.transaction.annotation.Propagation
 import org.springframework.transaction.annotation.Transactional
 
@@ -43,4 +41,10 @@
     @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
     fun findOnePersonByUserid(userid: String): TPerson
 
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun findPersondtlByUserid(userid:String, pageno :Int) : PageResult<TPersondtl>
+
+    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = arrayOf(Exception::class), readOnly = true)
+    fun findPersondtlDetailByUserid(userid:String, billno :String) : TPersondtl?
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt b/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
index 60efda7..ca0ba0a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/mobile/AuthLoginHandler.kt
@@ -2,6 +2,7 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.exception.ValidateCodeException
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
@@ -9,10 +10,7 @@
 import com.supwisdom.dlpay.framework.redisrepo.ApiClientRepository
 import com.supwisdom.dlpay.framework.redisrepo.ApiJwtRepository
 import com.supwisdom.dlpay.framework.service.SystemUtilService
-import com.supwisdom.dlpay.framework.util.Constants
-import com.supwisdom.dlpay.framework.util.DateUtil
-import com.supwisdom.dlpay.framework.util.SysparaUtil
-import com.supwisdom.dlpay.framework.util.TradeDict
+import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.mobile.dao.MobileUserDao
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.exception.UserLoginFailException
@@ -42,6 +40,9 @@
     lateinit var apiJwtRepository: ApiJwtRepository
     @Autowired
     lateinit var systemUtilService: SystemUtilService
+    @Autowired
+    lateinit var userService: UserService
+
 
     override fun onAuthenticationSuccess(request: HttpServletRequest, response: HttpServletResponse, authentication: Authentication) {
         logger.error(request?.getParameter("platform"))
@@ -49,12 +50,12 @@
         var user = mobileUserDao.findByPhone(temp.phone)
         if(user!=null) {
             var exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3,60*60*24*3)
-            jwtConfig.expiration = exp as Long
+            jwtConfig.expiration = exp.toLong()
             val token = JwtTokenUtil(jwtConfig).generateToken(
                     mapOf("uid" to user.uid, "issuer" to "payapi",
                             "audience" to temp.phone,
                             Constants.JWT_CLAIM_TENANTID to "mobile",
-                            "authorities" to temp.authorities))
+                            Constants.JWT_CLAIM_AUTHORITIES to temp.authorities))
             var jwt = JwtRedis().apply {
                 jti = token.jti
                 uid = temp.phone
@@ -74,13 +75,30 @@
             user.lastlogin = DateUtil.getNow()
             user.jti = jwt.jti
             mobileUserDao.save(user)
+            var payseted = false
+            if(!user!!.paypwd.isNullOrEmpty()){
+                payseted = true
+            }
+            var name = ""
+            if (!user.userid.isNullOrEmpty()) {
+                var person = userService.findOnePersonByUserid(user.userid!!)
+                if (person != null) {
+                    name = person.name
+                }
+            }
+
             response.status = HttpStatus.OK.value()
             response.contentType = "application/json;charset=UTF-8"
             response.writer.write(objectMapper.writeValueAsString(JsonResult.ok()
                     .put("token", token.jwtToken)
                     ?.put("expire",token.expiration.valueInMillis)
                     ?.put("now",System.currentTimeMillis())
-                    ?.put("tenantid", "mobile")))
+                    ?.put("tenantid", "mobile")
+                    ?.put("name", name)
+                    ?.put("phone", StringUtil.phoneReplace(user.phone))
+                    ?.put("paypwdset",payseted)
+                    ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
+                    ?.put("userid",if(user.userid.isNullOrEmpty()) "" else user.userid)))
         }else{
             throw UserLoginFailException("登录错误")
         }
diff --git a/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt b/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
index df5d623..2f02141 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/mobile/MobileApi.kt
@@ -1,6 +1,10 @@
 package com.supwisdom.dlpay.mobile
 
 import com.supwisdom.dlpay.api.bean.JsonResult
+import com.supwisdom.dlpay.api.dao.PersonDao
+import com.supwisdom.dlpay.api.dao.PersonIdentityDao
+import com.supwisdom.dlpay.api.domain.TPersonIdentity
+import com.supwisdom.dlpay.api.service.UserService
 import com.supwisdom.dlpay.framework.core.JwtConfig
 import com.supwisdom.dlpay.framework.core.JwtTokenUtil
 import com.supwisdom.dlpay.framework.domain.JwtRedis
@@ -9,22 +13,20 @@
 import com.supwisdom.dlpay.framework.util.*
 import com.supwisdom.dlpay.mobile.domain.TBMobileUser
 import com.supwisdom.dlpay.mobile.service.MobileApiService
-import com.supwisdom.dlpay.mobile.service.MobileUserService
 import com.supwisdom.dlpay.util.ConstantUtil
-import com.supwisdom.dlpay.util.DlpayUtil
+import org.apache.commons.lang.StringUtils
 import org.springframework.beans.factory.annotation.Autowired
 import org.springframework.data.redis.core.RedisTemplate
+import org.springframework.security.core.GrantedAuthority
+import org.springframework.security.core.authority.AuthorityUtils
 import org.springframework.security.core.context.SecurityContextHolder
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
-import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler
 import org.springframework.web.bind.annotation.RequestMapping
 import org.springframework.web.bind.annotation.RestController
-import javax.servlet.http.HttpServletRequest
-import javax.servlet.http.HttpServletResponse
-import org.springframework.web.bind.annotation.RequestMethod
 import org.springframework.web.bind.annotation.RequestParam
-import java.security.Principal
 import java.time.Duration
+import java.util.Calendar
+
 
 @RestController
 @RequestMapping("/mobileapi/i")
@@ -40,9 +42,6 @@
     @Autowired
     lateinit var systemUtilService: SystemUtilService
 
-    /*
-    * TODO 防止重复调用发验证码
-    * */
     @RequestMapping("/time")
     fun time(): JsonResult {
         return JsonResult.ok("OK").put("now", System.currentTimeMillis())!!
@@ -56,7 +55,9 @@
         }
         return JsonResult.error("页面未配置")
     }
-
+    /**
+     * 注册或找回时使用的验证码生成接口
+     * */
     @RequestMapping("/code")
     fun code(@RequestParam phone: String): JsonResult {
         if (phone.isNullOrEmpty() || phone.length != 11 || !StringUtil.isMobile(phone)) {
@@ -73,10 +74,12 @@
             System.out.println(code)
             redisTemplate.opsForValue().set(phone, code, Duration.ofMinutes(5))
         }
-        //TODO code
+        //TODO call send code sdk
         return JsonResult.ok("验证码已发送")
     }
-
+    /**
+     * 注册或找回时使用的验证码校验接口
+     * */
     @RequestMapping("/checkcode")
     fun check(@RequestParam phone: String,
               @RequestParam code: String,
@@ -87,7 +90,6 @@
             if (temp != code) {
                 return JsonResult.error("验证码错误")
             }
-            //TODO general user
             var user = mobileApiService.findUserByPhone(phone)
             if (user == null) {
                 user = TBMobileUser()
@@ -100,20 +102,26 @@
                 user.loginpwderror = 0
                 user = mobileApiService.saveUser(user)
             }
+            user.registerplatform = platform
+            user.devuid = uuid
+            user = mobileApiService.saveUser(user)
             var code = RandomUtils.getRandomString(30)
-            redisTemplate.opsForValue().set(user.uid, code, Duration.ofDays(1))
-            return JsonResult.ok("OK").put("uid", user.uid)?.put("code",code)!!
+            redisTemplate.opsForValue().set(user.uid, code, Duration.ofHours(1))
+            redisTemplate.delete(phone)
+            return JsonResult.ok("OK").put("uid", user.uid)?.put("randcode", code)!!
         } else {
-            return JsonResult.error("验证码已过期，请重新发送")
+            return JsonResult.error(-1, "验证码无效或已过期，请重新获取")
         }
     }
-
+    /**
+     * 注册
+     * */
     @RequestMapping("/register")
     fun register(@RequestParam id: String,
                  @RequestParam pwd: String,
                  @RequestParam repwd: String,
                  @RequestParam random: String): JsonResult {
-        if(random.isNullOrEmpty()){
+        if (random.isNullOrEmpty()) {
             return JsonResult.error("注册信息有误，请重新注册")
         }
         if (pwd.isNullOrEmpty() || repwd.isNullOrEmpty() || pwd.length < 6) {
@@ -123,19 +131,21 @@
             return JsonResult.error("两次密码不一致")
         }
         var user: TBMobileUser? = mobileApiService.findUserById(id) ?: return JsonResult.error("用户不存在，请注册")
-        var code =   redisTemplate.opsForValue().get(id)
-        if(code!=random){
-            return JsonResult.error("注册信息有误，请重新注册")
+        var code = redisTemplate.opsForValue().get(id)
+        if (random != code) {
+            return JsonResult.error("注册信息有误，请返回上一步，并重新发送验证码")
         }
         val encoder = BCryptPasswordEncoder()
         user!!.loginpwd = encoder.encode(pwd)
-        var exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3,60*60*24*3)
-        jwtConfig.expiration = exp as Long
+        var exp = systemUtilService.getSysparaValueAsInt(SysparaUtil.SYSPARAID_NO3, 60 * 60 * 24 * 3)
+        jwtConfig.expiration = exp.toLong()
+        var authorities: Collection<GrantedAuthority> = AuthorityUtils.createAuthorityList("ROLE_USER")
+        user.auths = authorities
         val token = JwtTokenUtil(jwtConfig).generateToken(
                 mapOf("uid" to user.uid, "issuer" to "payapi",
                         "audience" to user.phone,
                         Constants.JWT_CLAIM_TENANTID to "mobile",
-                        "authorities" to user.authorities))
+                        Constants.JWT_CLAIM_AUTHORITIES to user.authorities))
         var jwt = JwtRedis().apply {
             jti = token.jti
             uid = user.phone
@@ -143,7 +153,7 @@
             expiration = token.expiration.valueInMillis
         }.apply {
             //删除之前的token
-            if(!user.jti.isNullOrEmpty()){
+            if (!user.jti.isNullOrEmpty()) {
                 apiJwtRepository.deleteById(user.jti!!)
             }
             apiJwtRepository.save(this)
@@ -155,10 +165,18 @@
         user.lastlogin = DateUtil.getNow()
         user.jti = jwt.jti
         mobileApiService.saveUser(user)
-
+        redisTemplate.delete(user.uid)
+        var payseted = false
+        if (!user!!.paypwd.isNullOrEmpty()) {
+            payseted = true
+        }
         return JsonResult.ok("OK").put("token", token.jwtToken)
-                ?.put("expire",token.expiration.valueInMillis)
-                ?.put("now",System.currentTimeMillis())
+                ?.put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)
+                ?.put("expire", token.expiration.valueInMillis)
+                ?.put("now", System.currentTimeMillis())
+                ?.put("phone", StringUtil.phoneReplace(user.phone))
+                ?.put("paypwdset", payseted)
+                ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
                 ?.put("tenantid", "mobile")!!
     }
 }
@@ -169,19 +187,290 @@
 class ApiV1 {
     @Autowired
     lateinit var mobileApiService: MobileApiService
-
+    @Autowired
+    lateinit var userService: UserService
     @Autowired
     lateinit var redisTemplate: RedisTemplate<String, String>
+    @Autowired
+    lateinit var personDao: PersonDao
 
+    /**
+     * 用户信息
+     * */
     @RequestMapping("/infor")
     fun getUserInfor(): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
-        return JsonResult.ok("OK").put("name", p.name)?.put("now", System.currentTimeMillis())!!
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        var payseted = false
+        if (!user!!.paypwd.isNullOrEmpty()) {
+            payseted = true
+        }
+        var name = ""
+        if (!user.userid.isNullOrEmpty()) {
+            var person = userService.findOnePersonByUserid(user.userid!!)
+            if (person != null) {
+                name = person.name
+            }
+        }
+
+        return JsonResult.ok("OK").put("now", System.currentTimeMillis())
+                ?.put("paypwdset", payseted)
+                ?.put("name", name)
+                ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)
+                ?.put("userid", if (user?.userid.isNullOrEmpty()) "" else user?.userid)!!
+
+    }
+    /**
+     * 验证码生成，内部校验
+     * */
+    @RequestMapping("/code")
+    fun code(): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        if (user!!.phone.isNullOrEmpty()) {
+            return JsonResult.error("用户不存在，请注册")
+        }
+        var temp = redisTemplate.opsForValue().get(user!!.phone)
+        if (temp.isNullOrEmpty()) {
+            var code = RandomUtils.randomNumber(6)
+            System.out.println(code)
+            redisTemplate.opsForValue().set(user!!.phone, code, Duration.ofMinutes(5))
+        }
+        //TODO call send code sdk
+        return JsonResult.ok("验证码已发送")
     }
 
-    @RequestMapping("/register")
-    fun register(): JsonResult {
+    @RequestMapping("/checkcode")
+    fun check(@RequestParam code: String
+    ): JsonResult {
         val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        var temp = redisTemplate.opsForValue().get(user!!.phone)
+        if (!temp.isNullOrEmpty()) {
+            if (temp != code) {
+                return JsonResult.error("验证码错误")
+            }
+            var code = RandomUtils.getRandomString(30)
+            redisTemplate.opsForValue().set(user.uid, code, Duration.ofHours(1))
+            redisTemplate.delete(user!!.phone)
+            return JsonResult.ok("OK").put("randcode", code)!!
+        } else {
+            return JsonResult.error(-1, "验证码无效或已过期，请重新获取")
+        }
+    }
+
+    /**
+     * 绑卡
+     * */
+    @RequestMapping("/bindcard")
+    fun bindcard(card: String, name: String, code: String): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        var phone = user!!.phone
+        var temp = redisTemplate.opsForValue().get(phone)
+        if (!temp.isNullOrEmpty()) {
+            if (temp != code) {
+                return JsonResult.error("验证码错误")
+            }
+            if (user!!.userid.isNullOrEmpty()) {
+                var identy: TPersonIdentity? = userService.findPersonIdentity(card) ?: return JsonResult.error("银行卡号有误")
+                if (identy!!.person == null || identy.status != TradeDict.STATUS_NORMAL) {
+                    return JsonResult.error("银行卡号信息有误")
+                }
+                if (identy!!.person.name != name) {
+                    return JsonResult.error("姓名有误")
+                }
+                var temp: TBMobileUser? = mobileApiService.findUserById(identy!!.person.userid)
+                if (temp != null) {
+                    return JsonResult.error("该银行卡号已被绑定，如有疑问，请联系客服")
+                }
+                user.bindtime = DateUtil.getNow()
+                user.userid = identy.person.userid
+                mobileApiService.saveUser(user)
+                redisTemplate.delete(phone)
+                var payseted = false
+                if (!user.paypwd.isNullOrEmpty()) {
+                    payseted = true
+                }
+                return JsonResult.ok("OK").put("userid", user.userid)
+                        ?.put("paypwdset", payseted)
+                        ?.put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)!!
+            } else {
+                return JsonResult.error(-1, "用户已绑定银行卡")
+                        .put("userid", if (user.userid.isNullOrEmpty()) "" else user.userid)!!
+            }
+        } else {
+            return JsonResult.error(-1, "验证码无效或已过期，请重新获取")
+        }
+    }
+
+    /**
+     * 支付密码
+     * */
+    @RequestMapping("/paypwd")
+    fun paypwd(pwd: String, repwd: String, oldpwd: String?, type: String, randcode: String?): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        if (pwd != repwd) {
+            return JsonResult.error("两次密码不一致，请确认")
+        }
+        if (pwd.length != 6) {
+            return JsonResult.error("支付密码为6位数字")
+        }
+        if (!StringUtils.isNumeric(pwd)) {
+            return JsonResult.error("支付密码为6位数字")
+        }
+        val encoder = BCryptPasswordEncoder()
+        if (user!!.paypwd.isNullOrEmpty()) {
+            user!!.paypwd = encoder.encode(pwd)
+            mobileApiService.saveUser(user)
+            return JsonResult.ok("OK")
+                    ?.put("paypwdset", true)!!
+        } else {
+            when (type) {
+                "new" -> return JsonResult.error("支付密码已设置")
+                "renew" -> {
+                    if (oldpwd.isNullOrEmpty()) {
+                        return JsonResult.error("原支付密码错误")
+                    }
+                    val encoder = BCryptPasswordEncoder()
+                    var b = encoder.encode(oldpwd)
+                    if (b != user.paypwd) {
+                        return JsonResult.error("原支付密码错误")
+                    }
+                    user!!.paypwd = encoder.encode(pwd)
+                    mobileApiService.saveUser(user)
+                    return JsonResult.ok("OK")
+                            ?.put("paypwdset", true)!!
+                }
+                "find" -> {
+                    if (randcode.isNullOrEmpty()) {
+                        return JsonResult.error("信息有误，请返回并重新设置")
+                    }
+                    var code = redisTemplate.opsForValue().get(user.uid)
+                    if (randcode != code) {
+                        return JsonResult.error(-1, "长时间未操作，请返回上一步，并重新发送验证码")
+                    }
+                    user!!.paypwd = encoder.encode(pwd)
+                    mobileApiService.saveUser(user)
+                    redisTemplate.delete(user.uid)
+                    return JsonResult.ok("OK")
+                            ?.put("paypwdset", true)!!
+                }
+                else -> return JsonResult.error("请求错误")
+            }
+        }
+    }
+
+    /**
+     *
+     * 银行协议
+     * */
+    @RequestMapping("/bxy")
+    fun xieyi(): JsonResult {
+        var page = mobileApiService.findPageById(ConstantUtil.PAGE_BANKXIEYI)
+        if (page != null) {
+            return JsonResult.ok("OK").put("page", page.pageContent)!!
+        }
+        return JsonResult.error("页面未配置")
+    }
+
+    /**
+     *
+     * 签约银行协议
+     * */
+    @RequestMapping("/signbxy")
+    fun signbxy(agree: String): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        user!!.issigned = TradeDict.STATUS_YES
+        user!!.signedtime = DateUtil.getNow()
+        mobileApiService.saveUser(user)
+        //TODO 调用第三方接口签约
+        return JsonResult.ok("ok")
+                .put("signed", if (user.issigned.isNullOrEmpty()) "" else user.issigned)!!
+    }
+
+    /**
+     * 查询账单
+     * */
+    @RequestMapping("/bills")
+    fun bills(pageno: Int): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        val c = Calendar.getInstance()
+        val timeOfDay = c.get(Calendar.HOUR_OF_DAY)
+        var t = ""
+        when (timeOfDay) {
+            in 0..7 -> t = "早上好"
+            in 8..12 -> t = "上午好"
+            in 13..17 -> t = "下午好"
+            in 18..23 -> t = "晚上好"
+        }
+        if (user!!.userid.isNullOrEmpty()) {
+            return JsonResult.ok("OK").put("t",t)!!
+        }
+        var no = if (pageno <= 0) {
+            1
+        } else {
+            pageno
+        }
+        var today = DateUtil.getNow("yyyyMMdd")
+        var yester = DateUtil.getNowInterDay(-1)
+
+        var page = userService.findPersondtlByUserid(user!!.userid!!, no)
+        return JsonResult.ok("OK").put("page", page)
+                ?.put("today",today)
+                ?.put("yesterday",yester)
+                ?.put("t",t)!!
+    }
+
+    /**
+     * 账单明细
+     * */
+    @RequestMapping("/billdetail")
+    fun billdetail(billid: String): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        if (user!!.userid.isNullOrEmpty()) {
+            return JsonResult.ok("OK")
+        }
+        var dtl = userService.findPersondtlDetailByUserid(user?.userid!!, billid)
+        return JsonResult.ok("OK").put("dtl", dtl)!!
+    }
+
+    /**
+     * 密码修改
+     * */
+    @RequestMapping("/pwdset")
+    fun pwdset(pwd: String, newpwd: String, renewpwd: String): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
         return JsonResult.ok("OK")
     }
+
+    /**
+     *
+     * 市民卡挂失
+     * */
+    @RequestMapping("/cardlost")
+    fun cardlost(paypwd: String): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        //TODO cardlost
+        return JsonResult.ok("ok")
+    }
+    /**
+     *
+     * 二维码在线生成
+     * */
+    @RequestMapping("/qrcode")
+    fun qrcode(): JsonResult {
+        val p = SecurityContextHolder.getContext().authentication
+        var user: TBMobileUser? = mobileApiService.findUserById(p.name) ?: return JsonResult.error("用户不存在，请注册")
+        //TODO cardlost
+        return JsonResult.ok("ok")
+    }
+
+
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt b/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
index d0fbc7f..285546a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/mobile/domain/TBMobileUser.kt
@@ -70,6 +70,12 @@
     var userid: String? = null
 
     /**
+     * 银行卡绑定时间
+     * */
+    @Column(name = "bindtime", length = 14)
+    var bindtime: String? = null
+
+    /**
      * 注册手机类型
      * */
     @Column(name = "registerplatform", length = 100)
@@ -136,4 +142,20 @@
     @Column(name = "jti", length = 64)
     var jti: String? = null
 
+    /**
+     * 签约
+     * */
+    @Column(name = "issigned", length = 20)
+    var issigned: String? = null
+    /**
+     * 签约时间
+     * */
+    @Column(name = "signedtime", length = 20)
+    var signedtime: String? = null
+
+    /**
+     * 头像
+     * */
+    @Column(name = "ulogo", length = 100)
+    var ulogo: String? = null
 }
\ No newline at end of file
diff --git a/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt b/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt
index 9c96ad6..197da10 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileUserServiceImpl.kt
@@ -27,11 +27,11 @@
         var temp = mobileUserDao.findByPhone(username!!)
         if(temp!=null) {
             if(temp.loginpwd.isNullOrEmpty()){
-                throw UserLoginFailException("用户注册后未设置登录密码，请重新注册")
+                throw UserLoginFailException("用户注册后未设置登录密码，请找回密码或重新注册")
             }
-            if (temp.loginpwderror != null && temp.loginpwderror!! >= 3 && (System.currentTimeMillis() - temp.loginpwderrortime!!) < 1000 * 60 * 30) {
-                throw UserLoginFailException("密码错误次数过多，请稍后再试")
-            } else if (temp.loginpwderror != null && temp.loginpwderror!! >= 3 && (System.currentTimeMillis() - temp.loginpwderrortime!!) > 1000 * 60 * 30) {
+            if (temp.loginpwderror != null && temp.loginpwderror!! >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) < 1000 * 60 * 30) {
+                throw UserLoginFailException("密码错误次数过多，请30分钟后再试")
+            } else if (temp.loginpwderror != null && temp.loginpwderror!! >= 5 && (System.currentTimeMillis() - temp.loginpwderrortime!!) > 1000 * 60 * 30) {
                 //更新时间
                 temp.loginpwderror = 0
                 temp.loginpwderrortime = null
diff --git a/src/main/kotlin/com/supwisdom/dlpay/security.kt b/src/main/kotlin/com/supwisdom/dlpay/security.kt
index cff3a80..dfe454a 100644
--- a/src/main/kotlin/com/supwisdom/dlpay/security.kt
+++ b/src/main/kotlin/com/supwisdom/dlpay/security.kt
@@ -145,6 +145,12 @@
                 response.status=HttpStatus.UNAUTHORIZED.value()
                 response.contentType = "application/json;charset=UTF-8"
                 return
+            } catch (e:Exception){
+                SecurityContextHolder.clearContext()
+                // jwt 失效后返回 401
+                response.status=HttpStatus.UNAUTHORIZED.value()
+                response.contentType = "application/json;charset=UTF-8"
+                return
             }
         }
         filterChain.doFilter(request, response)
