转载请注明出处
http://blog.csdn.net/pony_maggie/article/details/17681215
作者:小马
先说说脚本的格式,如下图, 此图来自emv规范.
脚本一定要是上面图14中的格式, 否则终端无法解析,无法解析也就不会发送脚本到IC卡。 脚本长度最多是128字节,若命令比较多超过此长度,可以用多条脚本发送, 这种时候脚本标识符就要区分开了。不过这种多脚本的情况实际使用很少出现。
终端处理时,会把每条86的命令解析出来直接发给卡片执行,如果卡片执行成功或者警告,终端就继续发送下一个指令。如果执行失败,就不再发送,并设置该条脚本的执行结果。
下面通过实例进一步说明,
71169F180455667788860D8424000008AABBCCDD11223344
解析如下:
71—脚本Tag
16—总长度
9F18—脚本标识符tag,
04—脚本标识符长度
55667788—脚本序列号
86--脚本命令tag
0D—脚本命令长度
8424000008AABBCCDD11223344—脚本命令
简单说明一下, 脚本标识符对终端来说的意义就是最终的脚本结果带有标识符,下面会讲到. 86开始就是真正的脚本命令了,一个71或者72,可以带多个86的脚本,比如下面这样的(可以自己解析一下):
724E9F180411223344860D8416000008AABBCCDD11223344860D8424000008AABBCCDD112233448609842400000455667788860D8416000008AABBCCDD
11223344860D8416000008AABBCCDD11223344
再说说脚本结果. 共有5个字节,
第1 个字节:包含脚本处理结果和脚本处理失败时脚本的命令序号。如果脚本处理成功,这
个序列号为0
第2 至5 字节:包含发卡行脚本中收到的发卡行脚本标识符
情况1
如果脚本命令执行成功,脚本结果的第1字节置为‘2x’, x表示脚本序号, 还是上实例,
72219F180411223344860D8424000008AABBCCDD112233448609842400000455667788
脚本结果是20 11 22 33 44.
再来一个,
71309F180411223344860D8416000008AABBCCDD11223344860D8424000008AABBCCDD1122334486098424000004AABBCCDD72309F180444332211
860D8416000008AABBCCDD11223344860D8424000008AABBCCDD1122334486098424000004AABBCCDD
脚本结果是20 11 22 33 44 20 44 33 22 11
注意第二个示例,其实是一个脚本,两组脚本标识.
情况2
如果卡片对脚本命令的响应的SW1不为‘90’、‘62’或‘63’,表示命令处理失败,则终端必须置发卡行脚本结果第1字节为’1x’,示例如下:
71309F180411223344860D8416000008AABBCCDD11223344860D8424000008AABBCCDD112233448609842400000455667788
这里面有三条86的命令,假设第二条执行失败了, 那么脚本结果是12 11 22 33 44.
情况3
如果接收到发卡行脚本,但未能正确解包,因而没有向IC卡发送脚本命令,则发卡行脚本结果第1字节置‘00’。
示例1
720D8416000008AABBCCDD11223344
这个脚本格式不符合图14, 解析就会出错,不会发给ic卡, 又没有脚本标识符, 所以脚本结果为00 00 00 00 00.
示例2
72169F18041122334486098416000008AABBCCDD11223344
这个脚本也是格式有错,86的长度不对, 但是它有脚本标识, 所以脚本结果为
00 11 22 33 44
示例3
71149F1804112233448416000008AABBCCDD1122334472149F1804556677888416000008AABBCCDD11223344
这是有两组脚本标识的情况.脚本结果为
00 11 22 33 44 00 55 66 77 88