ISO 8583 Parser
免费 · 速查 · 7 分钟 · 最后更新 2026-08-09
emv · 持卡人验证

CVM List(标签 8E):凭什么这笔要输 PIN、那笔不用

同一台 POS 机、同一张卡:上一笔弹出密码键盘,下一笔什么都不问直接过。这不是终端心情好,也不是收银员按错了键。卡片里存着一张排好序的验证方法列表 —— CVM List,EMV 标签 8E,终端只是从第一条开始逐条往下试,试中哪条算哪条。方法码、条件码的对照表当然要查,但你在机器前看到的行为来自遍历过程本身 —— 这篇就把这个过程一步步拆开。

本页内容: 先解一个真实值 · 标签 8E 的结构 · 终端怎么遍历这张表 · 同一张卡的四种结局 · 争议处理:8E 对 9F34

先解一个真实值

这是一个你会在卡片参数或 DE55 里遇到的 CVM List:000003E8000000001F0642031E031F02。把它贴进 CVM List 解析工具,会得到两个金额加四条规则:

标题那个问题的答案已经写在这十六个字节里了:两位小数的货币下 X = 1000 就是 10.00 —— 低于它,规则 1 命中,谁也不会被问任何东西;高于它,规则 1 条件不成立,轮到规则 2,密码键盘亮起来。下面把终端怎么走出这个结果拆开讲,建议把解析工具开在旁边对照。

结构:先两个金额,再逐条规则

标签 8E 是「固定头部 + 重复体」的结构。前 4 字节是金额 X,接着 4 字节是金额 Y —— 注意是纯二进制整数(不是 BCD),单位是应用货币的最小单位,所以 000003E8 是 1000,按两位小数就是 10.00。这两个金额自己什么都不做,它们存在的意义是给「低于 X」「高于 Y」这类条件当参照物。第 8 字节之后全是规则,每条恰好 2 字节

标签 8E 字节结构:前 4 字节金额 X、再 4 字节金额 Y,之后每 2 字节一条 CVM 规则——前 8 个字节不是规则 固定头部 —— 恒为 8 字节 CVM 规则 —— 每条 2 字节 00 00 03 E8 00 00 00 00 1F 06 42 03 1E 03 1F 02 金额 X = 1000(即 10.00) 金额 Y = 0 规则 1 规则 2 规则 3 规则 4 每条规则:第 1 字节 = CVM 码(b7 = 失败后继续)· 第 2 字节 = 条件码
示例值放在字节标尺上:前 8 个字节是两个金额,从第 9 字节起才是每 2 字节一条的规则。

这个布局解释了一种经典的解析事故:把完整的 8E 当成纯规则串去解,头 8 个字节就会被硬拆成四条「规则」—— 一排不可能存在的 00 00;反过来,有些日志只存规则部分,拿去按完整结构解又会把第一条规则当成金额。看到解出来开头连续几条说不通的规则,八成是把金额当规则解了。

终端怎么遍历这张表

选择过程是一个朴素的循环:从上往下,先命中先得。对每一条规则:

  1. 取下一条规则。
  2. 条件满足吗?拿本笔交易对照条件字节 —— 金额和 X、Y 比大小,是不是现金、加提现等等。不满足就跳过这条,直接看下一条,「失败后继续」位根本不会被查。跳过不等于失败,这是最容易混的一点。
  3. 终端做得了这个方法吗?对照终端能力(标签 9F33)。不支持或不认识的方法,按尝试失败处理。
  4. 尝试该 CVM。成功则遍历结束,结果写进 CVM Results(标签 9F34)。失败则看方法字节的 b7:置 1,取下一条;置 0,持卡人验证就地失败,原因记进 TVR 字节 3。
  5. 规则用完了?走到列表尾还没有一条成功,验证失败 —— TVR 字节 3 的 b8「持卡人验证未成功」置位。
CVM 规则遍历:取下一条规则,判断条件,尝试该方法,失败时由 b7 位决定继续下一条还是整体失败不满足 跳过满足不支持 按失败处理支持成功失败

取下一条规则
(2 字节:方法 + 条件)

条件是否满足?
(金额与 X / Y 比较、
现金、加提现、有人值守…)

还有下一条吗?

终端支持该方法吗?
(对照标签 9F33)

方法字节 b7 置 1 —
失败后继续下一条?

尝试该 CVM
(弹 PIN、签名栏、或什么都不做)

验证结束
结果写入 9F34

持卡人验证失败
TVR 字节 3 的 b8 置位

CVM 选择循环。注意一条规则有两种「出局」方式:条件不满足是无声跳过,尝试失败才轮到 b7 表态。

还要分清:验证失败不等于交易被拒。失败只是作为观察结果写进 TVR 字节 3,随后由终端行为码和发卡行行为码(TAC/IAC)决定这条观察是直接拒绝、强制联机还是放行。很多偏好签名的卡每天都带着「验证未成功」类的置位正常完成交易。

同一张卡的四种结局

拿开头那个值,走四个日常场景:

同一张卡、同样十六个字节、四种结局 —— 只要把这张表当程序读而不是当对照表背,每一种都推得出来。

争议处理:8E 是候选名单,9F34 才是开票结果

8E 只说明可能发生什么,证明不了某一笔交易里发生了什么。实际结果在 CVM Results,标签 9F34 里 —— 三个字节:实际应用的 CVM 码、当时命中的条件码、结果码(00 未知、01 失败、02 成功;第 1 字节为 3F 表示根本没执行任何 CVM)。这一串标签都可以在 EMV 标签查询里对着看。一句话记:8E 是候选名单,9F34 是开票结果,两者回答的不是同一个问题。

这个区分能直接了结一类常见争议。拒付进来:小票上印着 "PIN VERIFIED",持卡人咬定自己从没输过密码。小票那行字是终端应用按模板打的,不算证据;证据在 DE55。如果 9F34 是 1F0602 —— 命中的是我们列表里的规则 1,持卡人说的是对的:金额低于 X,PIN 从头到尾没被要求过。如果 9F34 是 420300,PIN 确实被采集并联机上送了 —— 还能交叉验证:那笔 0100 里带着 DE52 的 PIN 块,TVR 字节 3 的「已输入联机 PIN」也置了位。

收单侧排查同理。商户反馈某台终端从来不弹 PIN:把卡的 8E 和终端的 9F33 摆在一起看。若终端能力里没申报支持联机加密 PIN,规则 2 的条件永远不成立,每一笔都滑向签名那条,9F34 永远是 1E03… 开头。卡在一丝不苟地执行自己的策略,该改的是终端参数,不是换卡。

一句话记住:前 8 字节是两个金额,之后每 2 字节一条规则 —— 方法加条件。终端从上往下走:条件不满足是跳过,尝试失败才查 b7,b7 决定「下一条」还是「验证失败」。8E 是候选名单,9F34 是开票结果:争论「应该发生什么」引用前者,争论「实际发生了什么」引用后者。

延伸阅读