FEITIAN BR301读卡器执行VERIFY APDU命令返回6A88求助
我来帮你排查这个6A88(Referenced data not found)错误的可能原因,结合FEITIAN BR301的特性和ISO7816-4 APDU规范,常见的几个排查方向可以逐一尝试:
1. 检查PIN的编码格式
你当前的APDU命令里,PIN“012345”用的是ASCII编码(30 31 32 33 34 35对应字符'0'到'5'的ASCII值),但绝大多数智能卡(包括FEITIAN的很多接触式卡)的VERIFY命令要求PIN使用BCD编码(二进制编码的十进制)。
对于PIN“012345”,BCD编码后是01 23 45,对应的APDU命令应该调整为:
00 20 00 00 03 01 23 45
对应的代码修改为:
String sendStr = "0020000003012345"; byte[] send = Utility.hexStrToBytes(sendStr); byte[] recv = ftReader.readerXfr(0, send); showLog("send response ---> "+Utility.bytes2HexStr(recv));
这是最常见的导致6A88的原因,因为卡内存储的PIN是BCD格式,用ASCII编码的话卡找不到匹配的引用数据。
2. 确认PIN参考ID(P1参数)是否正确
VERIFY命令的P1参数用于指定PIN的参考ID,默认00对应用户PIN,但部分卡可能需要指定其他值(比如01对应管理员PIN)。你可以尝试修改P1为01,结合正确的PIN编码重新测试:
- ASCII编码版本:
00 20 01 00 06 30 31 32 33 34 35 - BCD编码版本:
00 20 01 00 03 01 23 45
3. 检查卡内PIN的状态
如果卡内还未初始化PIN,或者PIN因多次错误尝试被锁定,也会返回6A88。你可以先执行GET DATA命令读取卡的状态信息,或者尝试用CHANGE REFERENCE DATA命令(00 24 00 00 03 01 23 45,假设初始化PIN为012345)来确认PIN是否可正常访问。
4. 核对APDU命令结构
虽然你的APDU结构(CLA=00, INS=20, P1=00, P2=00, Lc=06, Data=6字节)符合规范,但如果卡期望的PIN长度与你发送的不匹配,也会导致解析失败。比如BCD编码的6位PIN长度是3字节,Lc必须设为03,不能是06,否则卡无法正确识别数据内容。
建议你查阅FEITIAN BR301对应的卡手册,确认VERIFY命令的具体参数要求,不同类型的接触式卡可能有细微差异。
内容的提问来源于stack exchange,提问作者user3587281

