Android HCE模拟EMV卡被ACR1252识别为令牌而非实体卡的求助
解决Android HCE模拟EMV卡被识别为令牌的问题
问题背景
在Android设备上通过HCE模拟EMV卡,使用ACR1252读卡器配合相关软件读取时,软件可正常读取卡片数据,但始终将模拟卡识别为令牌,而非实体卡。
核心修复方案
1. 修正EMV响应中的卡片类型标识(9F4A标签)
EMV规范定义,标签9F4A用于区分卡片类型:
- 取值
01:实体卡(Physical Card) - 取值
82:令牌卡(Token Card)
查看你的MyHostApduService代码,处理00b2000400和00b2011400命令的响应中,均包含9F4A0182字段——这里的82就是软件识别为令牌的直接原因。需将其修改为01:
原响应片段:
9F4A0182
修改后:
9F4A0101
2. 确保实体卡字段一致性
检查响应中的其他风险管理相关字段(如9F0D、9F0F),确保这些字段的取值符合实体卡的配置逻辑,避免残留令牌专属标识。
3. 规范APDU响应返回方式
代码中使用sendResponseApdu发送响应后返回null,虽Android HCE支持该方式,但建议直接返回响应字节数组,确保流程符合规范:
// 替换sendResponseApdu调用,改为返回响应数组 byte[] response = hexToBinary("修改后的完整HEX响应字符串"); return response;
代码修改示例
以处理00b2000400命令的响应为例,修改后的完整HEX字符串如下:
if (getReq.toLowerCase().contains("00b2000400".toLowerCase())) sendResponseApdu(hexToBinary("7081A657135167803202840547D24112010000000001960F5A0851678032028405475F24032411305F25031911015F280208045F3401018C279F02069F03069F1A0295055F2A029A039C019F37049F35019F45029F4C089F34039F21039F7C148D0C910A8A0295059F37049F4C088E0E000000000000000042031E031F039F0702FFC09F080200029F0D05B4508400009F0E0500000000009F0F05B4708480009F420209809F4A01019000"));
额外验证步骤
- 确认
apduservice.xml中category="payment"配置正确,保证HCE服务注册为支付类应用 - 重启设备NFC功能,清除可能存在的缓存
- 使用PC/SC工具抓取完整APDU交互日志,验证所有响应字段符合实体卡EMV规范
内容的提问来源于stack exchange,提问作者Николай Деменков
相关产品推荐
相关产品推荐

