使用pcsc-sharp调用GPO读取Visa卡返回6D00错误如何解决?
GPO指令返回6D00错误解决方案
核心错误原因
1. PDOL解析错误
你提取的9F38(PDOL)标签完整结构为 9F38 03 9F1A 02,其中03是9F38标签自身的长度,并非PDOL总长度。PDOL的实际有效内容是9F1A 02,代表卡片要求终端上报终端国家代码(标签9F1A),该字段长度为2字节,你需要按要求填充对应数值后再封装到GPO指令中。
2. GPO指令构造错误
GPO指令的Data字段(PDOL相关数据)正确格式为:83 + <PDOL要求的总数据长度> + <按PDOL顺序填充的各字段值>
本次场景中PDOL要求的总长度为2字节,填充合法的终端国家代码即可,比如中国的国家代码为0156,因此Data字段应为83 02 01 56,你之前使用的8302、8300等均为不完整值,卡片无法识别因此返回错误。
修正后的代码示例
// 填充83标签 + 长度2字节 + 中国国家代码0156,总数据为83020156 var array_byte = StringToByteArray("83020156"); var contextFactory = ContextFactory.Instance; using (var ctx = contextFactory.Establish(SCardScope.System)) { using (var isoReader = new IsoReader(ctx, "HID Global OMNIKEY 3x21 Smart Card Reader 0", SCardShareMode.Shared, SCardProtocol.Any, false)) { var apdu = new CommandApdu(IsoCase.Case4Short, isoReader.ActiveProtocol) { CLA = 0x80, // 若仍报错可尝试改为0x00测试 Instruction = InstructionCode.GetProcessingOption, //0xA8 P1 = 0x00, P2 = 0x00, Data = array_byte, Le = 0x00 // 若返回数据截断可尝试改为0x0000使用扩展长度 }; var response = isoReader.Transmit(apdu); Console.WriteLine("SW1 SW2 = {0:X2} {1:X2}", response.SW1, response.SW2); Console.WriteLine(response.HasData ? BitConverter.ToString(response.GetData()) : "No data"); Console.ReadKey(); } }
其他可排查点
如果修正后仍返回错误,可按顺序排查:
- 确认选择AID的返回SW1SW2确实为9000,且AID与卡片匹配(万事达等其他卡组织需要更换对应AID)
- 确认读卡器连接正常,卡片没有损坏、消磁
- 若卡片是带芯片的贷记卡,确认卡片没有被锁、未过期
内容的提问来源于stack exchange,提问作者Daimler
相关产品推荐
相关产品推荐

