PBOC规范研究之八----GPO命令(转)
第一、GPO命令
GPO命令主要的功能时告诉卡片,交易的金额,是否支持电子现金,以及终端的交易属性等参数,在选择应用时,卡片会返回一个PDOL标签值,其标签为9F38,终端应该保存这个列表,GPO命令的数据域就是依据PDOL列表发送的,数据发送的顺序是按照标签在PDOL中的顺序排列的。
举例来说:
卡片返回的PDOL数据:9F66049F02069F03069F1A0295055F2A029A039C019F3704
具体解析如下
9F6604 标签9F66的定义如下:
表1 终端交易属性(标签为“9F66”)
字节 |
位 |
定义 |
1 |
8 |
预留 |
7 |
1 – 支持非接触式借记/贷记应用 0 – 不支持非接触式借记/贷记应用 |
|
6 |
1 – 支持qPBOC 0 – 不支持qPBOC |
|
5 |
1 – 支持接触式借记/贷记应用 0 – 不支持接触式借记/贷记应用 |
|
4 |
1 – 终端仅支持脱机 0 – 终端具有联机能力 |
|
3 |
1 – 支持联机PIN 0 – 不支持联机PIN |
|
2 |
1 – 支持签名 0 – 不支持签名 |
|
1 |
预留 |
|
2 |
8 |
1 – 要求联机密文 0 – 不要求联机密文 |
7 |
1 – 要求CVM 0 – 不要求CVM |
|
6-1 |
预留 |
|
3 |
8-1 |
预留 |
4 |
8-1 |
预留 |
终端在GPO命令中应该如实的将终端的性能参数等发给卡片,以便卡片进行下一步的操作。
9F0206 授权金额
所谓授权金额,其实就是在交易时你要消费的金额。或者说终端机持有人输入的金额,然后要求你输入密码确认。
这个授权金额为6个字节,每半个字节代表10进制的一位,且单位为分,请注意不是“元”
例如假如你的银行卡里有563.99元人民币,那么存储的数据格式应该是:
0 0 0 0 0 0 0 5 6 3 9 9刚好占用6个字节
9F03 06,这个是其它金额,目前还没有定义,全部输入6个字节的0
9F1A 02 终端国家代码,中国的国家代码为01 56
95 05 是终端验证结果,这5个字节定义如下:
字节1:
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
未进行脱机数据认证 |
x |
1 |
x |
x |
x |
x |
x |
x |
脱机静态数据认证失败 |
x |
x |
1 |
x |
x |
x |
x |
x |
IC卡数据缺失 |
x |
x |
x |
1 |
x |
x |
x |
x |
卡片出现在终端异常文件中 |
x |
x |
x |
x |
1 |
x |
x |
x |
脱机动态数据认证失败 |
x |
x |
x |
x |
x |
1 |
X |
x |
复合动态数据认证/应用密文生成失败 |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
字节2:
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
|
|
|
|
|
|
|
|
|
1 |
x |
x |
x |
x |
x |
x |
x |
IC卡和终端应用版本不一致 |
x |
1 |
x |
x |
x |
x |
x |
x |
应用已过期 |
x |
x |
1 |
x |
x |
x |
x |
x |
应用尚未生效 |
x |
x |
x |
1 |
x |
x |
x |
x |
卡片不允许所请求的服务 |
x |
x |
x |
x |
1 |
x |
x |
x |
新卡 |
x |
x |
x |
x |
x |
0 |
x |
x |
RFU |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
字节3:
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
持卡人验证失败 |
x |
1 |
x |
x |
x |
x |
x |
x |
未知的CVM |
x |
x |
1 |
x |
x |
x |
x |
x |
PIN重试次数超限 |
x |
x |
x |
1 |
x |
x |
x |
x |
要求输入PIN,但密码键盘不存在或工作不正常 |
x |
x |
x |
x |
1 |
x |
x |
x |
要求输入PIN,密码键盘存在,但未输入PIN |
x |
x |
x |
x |
x |
1 |
x |
x |
输入联机PIN |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
字节4:
b8 |
b7 |
b6 |
B5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
交易超过最低限额 |
x |
1 |
x |
x |
x |
x |
x |
x |
超过连续脱机交易下限 |
x |
x |
1 |
x |
x |
x |
x |
x |
超过连续脱机交易上限 |
x |
x |
x |
1 |
x |
x |
x |
x |
交易被随机选择联机处理 |
x |
x |
x |
x |
1 |
x |
x |
x |
商户要求联机交易 |
x |
x |
x |
x |
x |
0 |
x |
x |
RFU |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
字节5:
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
使用缺省TDOL |
x |
1 |
x |
x |
x |
x |
x |
x |
发卡行认证失败 |
x |
x |
1 |
x |
x |
x |
x |
x |
最后一次GENERATE AC命令之前脚本处理失败 |
x |
x |
x |
1 |
x |
x |
x |
x |
最后一次GENERATE AC命令之后脚本处理失败 |
x |
x |
x |
x |
0 |
x |
x |
x |
RFU |
x |
x |
x |
x |
x |
0 |
x |
x |
RFU |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
这个标签的含义在于终端将自己操作过程中碰到的错误告诉卡片,卡片根据这个来决定是否拒绝交易,或者需要连接进行确认。这个实在终端行为分析和终端风险管理中进行赋值操作的。
5F2A 02 是交易货币代码,中国的交易货币代码和国家代码一致都是0156
9A 03 9A是交易日期,按年 月 日的方式排列,同样,每半个字节表示一个十进制数
例如交易时间是2014年10月21日,那么这个标签值就是 1 4 1 0 2 1 从10进制的角度来就是20 16 33
9C 01 这是交易类型,交易类型的定义如下:
字节1:交易类型性能
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
现金 |
x |
1 |
x |
x |
x |
x |
x |
x |
商品 |
x |
x |
1 |
x |
x |
x |
x |
x |
服务 |
x |
x |
x |
1 |
x |
x |
x |
x |
返现 |
x |
x |
x |
x |
1 |
x |
x |
x |
查询 |
x |
x |
x |
x |
x |
1 |
x |
x |
转账 |
x |
x |
x |
x |
x |
x |
1 |
x |
付款 |
x |
x |
x |
x |
x |
x |
x |
1 |
管理 |
字节2:交易类型性能
b8 |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
意义 |
1 |
x |
x |
x |
x |
x |
x |
x |
存款交易 |
x |
0 |
x |
x |
x |
x |
x |
x |
RFU |
x |
x |
0 |
x |
x |
x |
x |
x |
RFU |
x |
x |
x |
0 |
x |
x |
x |
x |
RFU |
x |
x |
x |
x |
0 |
x |
x |
x |
RFU |
x |
x |
x |
x |
x |
0 |
x |
x |
RFU |
x |
x |
x |
x |
x |
x |
0 |
x |
RFU |
x |
x |
x |
x |
x |
x |
x |
0 |
RFU |
这里我们只需将第一个字节传给卡片就行,这是附加终端性能的第一个字节,具体定义在第6部分
9F37 04,不可预知数,随意,最好去随机数
GPO 命令将这些参数传入到卡中,传入的次序与PDOL的次序一致。例如
GPO:80A80000238321600000000000000000000000000000000156000000000001561405306099999999
分解如下21
60000000 终端交易属性
000000000000授权金额
000000000000其它金额
0156 发卡行国家代码
0000000000 终端交易属性tvr
0156 交易货币代码
140530 交易日期 14年5月30日
60 交易类型,为国内服务或者商品
99999999 不可预知数
如果这张卡片式支持电子现金交易,那么其PDOL数据中比寻存在9F7A标签,否则检测时通不过。
第二、GPO响应
GPO命令的响应与你所选择的用用有关,例如你选择了qPBOC那么返回的会是以77为首的标签,以77为首的标签也会返回ATC与AFL但是数据是以TLV格式返回的,当以80为首返回时,返回的格式如下:
AIP和AFL,其中AFL是以4字节的倍数存在的。
例如
响应:800E7C000801020010010401180103009000
响应命令的解析如下:
80标签
0E长度
7C00 表示应用交互特征AIP AIP的定义如下:
字节1:
位8:1=RFU
位7:1=支持SDA
位6:1=支持DDA
位5:1=支持持卡人认证
位4:1=执行终端风险管理
位3:1=支持发卡行认证
位2:RFU(0)
位1:1=支持CDA
字节2:RFU(“00”)
这个列表说明了卡片的支持能力
同样终端如果也支持响应的功能则在交易的过程中将选择响应的功能,需要注意的是对于认证的优先级PBOC是做了如下的规定CDA>DDA>SDA,也就是说如果双方都支持CDA,那么终端优先进行CDA认证,终端必须选择双方共同支持的认证方式中优先级最高的,请注意两个关键词,双方共同支持与优先级最高
关于认证,后续将会详细介绍,这里不再赘述。
08010200 10010401 18010300 这三组数据,每组4个字节成为应用文件定位器AFL,AFL的定义如下:
包含终端将要读取用来交易处理的卡片数据文件的SFI和记录范围。每个要读取的文件在AFL中对应四个字节含义如下:
字节1:短文件标识符
字节2:文件中要读取的第1个记录的记录号
字节3:文件中要读取的最后一个记录的记录号
字节4:从第1个记录开始的用于脱机数据认证的连续记录数
终端将根据AFL的提示读取所有要求的记录,这里请注意第四个字节,这些数据时要进行脱机数据认证的,所以终端必须保存起来
第三、错误
卡片在一条或多条记录中返回同一个标签两次及两次以上;
卡片在某条记录中返回了卡片已经在GPO响应中返回的标签;
卡片中缺少必须有的数据;
数据格式错;
READ RECORD命令返回状态字不是“9000”当返回6985时,终端应该讲该条应用从所支持的应用列表中删除,从新选择下一个优先级最高的应用