diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
index 3f1091d..a952da7 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/ConsumePayCancelParam.java
@@ -14,7 +14,6 @@
 @Setter
 public class ConsumePayCancelParam extends APIRequestParam {
   @Sign
-  @NotNull
   private String refno;
   @Sign
   private String billno;
diff --git a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java
index dd77797..1e800eb 100644
--- a/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java
+++ b/payapi-common/src/main/java/com/supwisdom/dlpay/api/bean/DoorQrcodeResponse.java
@@ -11,7 +11,16 @@
 @NoArgsConstructor
 public class DoorQrcodeResponse extends ApiResponse {
   private String userid;
+  private String username;
+  private String sex;
+  private String idtype;
+  private String idno;
+  private String phone;
+
   private String citycardno;
+  private String cardphyid;
+  private String expiredate;
   private String bankcardno;
-  private String status;
+  private String cardstatus;
+  private String transstatus;
 }
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 95a1de0..9cc9393 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
@@ -9,10 +9,7 @@
 import com.supwisdom.dlpay.framework.util.MD5
 import com.supwisdom.dlpay.framework.util.TradeDict
 import com.supwisdom.dlpay.mobile.service.MobileApiService
-import com.supwisdom.dlpay.util.AesUtil
-import com.supwisdom.dlpay.util.QrCodeTotpUtil
-import com.supwisdom.dlpay.util.QrcodeRawData
-import com.supwisdom.dlpay.util.RSAKeysGenerate
+import com.supwisdom.dlpay.util.*
 import mu.KotlinLogging
 import org.apache.commons.lang.math.NumberUtils
 import org.springframework.beans.factory.annotation.Autowired
@@ -117,25 +114,37 @@
             }
             val person = userService.findOnePersonByUserid(rawData.userid)
 
-            /*if(TradeDict.STATUS_NORMAL!=person.status){
-                resp.retcode = 1
-                resp.retmsg = "用户状态异常"
+            val bankcard = mobileApiService.findCardByUserid(person.userid)
+            if (null == bankcard) {
+                resp.retcode = 9
+                resp.retmsg = "二维码识别错误，手机绑定的银行卡已注销"
                 return resp
-            }*/
+            }
+            //银行卡必定存在对应的市民卡
+            val citycard = mobileApiService.findCardByUseridAndCardphyid(person.userid, ConstantUtil.CARDTYPE_CITIZENCARD, bankcard.cardphyid)
+            if (null == citycard) {
+                resp.retcode = 8
+                resp.retmsg = "二维码识别异常"
+                return resp
+            }
+
             val verifyBarcode = QrCodeTotpUtil.verifyCode(rawData.totp, seed32, offset)
             return if (verifyBarcode) {
                 resp.retcode = 0
                 resp.retmsg = "OK"
                 resp.userid = person.userid
-                resp.status = person.status
-                val bankcard = mobileApiService.findCardByUserid(person.userid)
-                if(bankcard!=null){
-                    resp.bankcardno = bankcard.cardno
-                }
-                val citycard = mobileApiService.findCityCardByUserid(person.userid)
-                if(citycard!=null){
-                    resp.citycardno = citycard.cardno
-                }
+                resp.username = person.name
+                resp.sex = person.sex
+                resp.idtype = person.idtype
+                resp.idno = person.idno
+                resp.phone = person.mobile
+
+                resp.citycardno = citycard.cardno
+                resp.cardphyid = citycard.cardphyid
+                resp.expiredate = citycard.expiredate
+                resp.cardstatus = citycard.status
+                resp.transstatus = citycard.transStatus
+                resp.bankcardno = bankcard.cardno
                 resp
             } else {
                 resp.retcode = 1
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
index 3baacb3..55d717c 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/MobileApiService.kt
@@ -25,4 +25,6 @@
     fun sendSms(phone:String,code:String):BaseResp
 
     fun findByUseridAndStatus(userid:String,status:String):List<TBMobileUser>?
+
+    fun findCardByUseridAndCardphyid(userid: String, cardtype: String, cardphyid: String?): TCard?
 }
\ No newline at end of file
diff --git a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
index 04a155a..560a968 100644
--- a/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
+++ b/payapi/src/main/kotlin/com/supwisdom/dlpay/mobile/service/impl/MobileApiServiceImpl.kt
@@ -53,104 +53,112 @@
     }
 
     override fun findCardByNo(cardno: String): TCard? {
-        return cardDao.findCardByCardnoAndCardtype(cardno,ConstantUtil.CARDTYPE_BANKCARD)
+        return cardDao.findCardByCardnoAndCardtype(cardno, ConstantUtil.CARDTYPE_BANKCARD)
     }
 
     override fun findCardByUserid(userid: String): TCard? {
-        return cardDao.findCardByUseridAndCardtype(userid,ConstantUtil.CARDTYPE_BANKCARD)
+        return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_BANKCARD)
     }
 
     override fun findCityCardByUserid(userid: String): TCard? {
-        return cardDao.findCardByUseridAndCardtype(userid,ConstantUtil.CARDTYPE_CITIZENCARD)
+        return cardDao.findCardByUseridAndCardtype(userid, ConstantUtil.CARDTYPE_CITIZENCARD)
     }
 
     override fun saveCard(card: TCard): TCard {
         return cardDao.save(card)
     }
 
-    override fun sendSms(phone:String,code: String): BaseResp {
+    override fun sendSms(phone: String, code: String): BaseResp {
         var resp = BaseResp()
         var url = systemUtilService.getBusinessValue("sms.url")
-        if(url.isNullOrEmpty()){
+        if (url.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.url 未在业务表中配置" }
             return resp
         }
         var account = systemUtilService.getBusinessValue("sms.account")
-        if(account.isNullOrEmpty()){
+        if (account.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.account 未在业务表中配置" }
             return resp
         }
         var pwd = systemUtilService.getBusinessValue("sms.pwd")
-        if(pwd.isNullOrEmpty()){
+        if (pwd.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.pwd 未在业务表中配置" }
             return resp
         }
         var ecname = systemUtilService.getBusinessValue("sms.ecname")
-        if(ecname.isNullOrEmpty()){
+        if (ecname.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.ecname 未在业务表中配置" }
             return resp
         }
         var addserial = systemUtilService.getBusinessValue("sms.addserial")
-        if(pwd.isNullOrEmpty()){
+        if (pwd.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.addserial 未在业务表中配置" }
             return resp
         }
         var sign = systemUtilService.getBusinessValue("sms.sign")
-        if(sign.isNullOrEmpty()){
+        if (sign.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.sign 未在业务表中配置" }
             return resp
         }
         var tempid = systemUtilService.getBusinessValue("sms.tempid")
-        if(tempid.isNullOrEmpty()){
+        if (tempid.isNullOrEmpty()) {
             resp.retcode = "1"
-            resp.retmsg="短信业务参数未配置"
+            resp.retmsg = "短信业务参数未配置"
             logger.error { "短信参数：sms.tempid 未在业务表中配置" }
             return resp
         }
         var priority = systemUtilService.getBusinessValue("sms.priority")
-        if(priority.isNullOrEmpty()){
-            priority="1"
+        if (priority.isNullOrEmpty()) {
+            priority = "1"
         }
-        var client =  Client.getInstance()
+        var client = Client.getInstance()
         // 正式环境IP，登录验证URL，用户名，密码，集团客户名称
-        var ret = client.login(url, account, pwd,ecname)
-        if(!ret){
+        var ret = client.login(url, account, pwd, ecname)
+        if (!ret) {
             logger.error { "无法登陆短信平台，身份验证失" }
             resp.retcode = "1"
-            resp.retmsg="无法登陆短信平台"
+            resp.retmsg = "无法登陆短信平台"
             return resp
         }
-        var sendResult = client.sendTSMS (arrayOf(phone),
-                tempid, arrayOf(code),addserial,  priority.toInt(),sign, UUID.randomUUID().toString())
+        var sendResult = client.sendTSMS(arrayOf(phone),
+                tempid, arrayOf(code), addserial, priority.toInt(), sign, UUID.randomUUID().toString())
         println("推送结果: $sendResult")
-        return if(sendResult==1||sendResult==110){
+        return if (sendResult == 1 || sendResult == 110) {
             resp.retcode = "0"
-            resp.retmsg="成功"
+            resp.retmsg = "成功"
             resp
-        }else if(sendResult==104){
+        } else if (sendResult == 104) {
             resp.retcode = "1"
-            resp.retmsg="手机号错误"
+            resp.retmsg = "手机号错误"
             resp
-        }else{
+        } else {
             resp.retcode = "1"
-            resp.retmsg="短信发送失败，请稍后再试"
+            resp.retmsg = "短信发送失败，请稍后再试"
             resp
         }
     }
 
     override fun findByUseridAndStatus(userid: String, status: String): List<TBMobileUser>? {
-        return mobileUserDao.findByUseridAndStatus(userid,status)
+        return mobileUserDao.findByUseridAndStatus(userid, status)
+    }
+
+    override fun findCardByUseridAndCardphyid(userid: String, cardtype: String, cardphyid: String?): TCard? {
+        return if (cardphyid.isNullOrEmpty()) {
+            cardDao.findCardByUseridAndCardtype(userid, cardtype)
+        } else {
+            cardDao.findBankcardByCitizencard(userid, cardtype, cardphyid)
+        }
     }
 }
\ No newline at end of file
