增加3个DGI,分别为:A001,8020,9020
9103中增加DF60(9F38中),DF61
增加DF62,DF63
DGI |
长度 |
值(示例) |
A001 |
7*N |
15 01 00 00 FF 00 00 数据按7个字节为一个单元进行组织,每个单元对应一个扩展应用文件的配置信息,解析如下: 1字节扩展应用文件SFI; 1字节文件类型:01表示变长记录文件, 02表示循环记录文件; 1字节读权限:00表示采用Read CAPP Cache指令读 1字节写权限:00表示采用Update CAPP Cache指令更新 1字节单条记录最大长度:限制可以使用记录的最大长度 2字节文件大小配置:对于变长记录文件, 2字节表示预设的文件大小,00 00表示大小不限制;对于循环记录文件,为1字节记录条数和1字节记录大小。 可以根据应用需要使用的扩展应用文件的实际数量和实际SFI,对该DGI的数据域进行调整。每7个字节组成的单元的数量和顺序,决定了后续8020数据域内开通密钥的数量和顺序,必须一一对应。 |
DGI数据组成及顺序如下,密钥顺序按照A001中定义的文件SFI顺序进行匹配,对应设置为每个文件的开通密钥。
DGI |
Len |
Value |
8020 |
10*N |
0x13文件扩展应用开通保护密钥(16字节) 0x14文件扩展应用开通保护密钥(16字节) ……….
|
DGI数据组成如下,其中校验值(KCV)由8020中的每条密钥对8字节00加密后取左3字节组成,校验值密钥顺序必须与8020中的密钥顺序一致。
DGI |
Len |
Value |
9020 |
03*N |
0x13文件复合应用开通保护密钥校验值(3字节) 0x14文件复合应用开通保护密钥校验值(3字节) ……. |
l 9F38中增加CAPP交易指示位DF60
l BF0C后面增加DF61
如果终端不支持非接触扩展应用,则设置DF60为00
如果支持押金抵扣交易,增加DF62,DF63
//TEST CPURESET() 00A4040008A000000333010101 80B400A8020570 //读取0X15变成文件,ID为0570的记录 00B201F400 //读取0X1E循环文件,第一条记录 //16 RMAC <commad 80B400b00A05701234567812345678 /> <return 057007000000000000001C895F11(4字节的RMAC) /> //校验MAC KEY=D5F1FE4A7F8C20FDEC49150BA2E00EDF 3DES_MAC(1234567812345678 05700700000000000000800000000000,KEY,MAC)</span>
l 强制带有MAC,用来确认指令来自合法的终端
l ID由支付系统定义,不足位数后补0
l 在同一SFI下,ID应保持唯一。
l 卡片支持RMAC,返回4字节MAC,用行业应用管理密钥计算MAC验证,初始向量为终端发送的随机数。
l 扩展应用支持应用失效功能,在更新应用数据时将应用有效标志置0.
<span style="font-family:Microsoft YaHei;">CPURESET() 00A4040008A000000333010101 80CA9F3605(ATC+9000) ATC=COPY(ATC,7,4) ATC=000000000000+ATC CAPPK1= D5F1FE4A7F8C20FDEC49150BA2E00EDF//应用开通密钥 CAPPK2= D5F1FE4A7F8C20FDEC49150BA2E00EDF//行业应用管理密钥 //写入0X16变成文件记录 B0:10110 000 ECB_3DES_EN(CAPPK2,CAPPK1,KEY2) HMD=04E200A81E+KEY2+057007+STRING(0,07) // TLV 3DES_MAC(ATC+HMD+8000000000,CAPPK1,MAC) HMD+MAC //写入0X1e循环文件记录 ECB_3DES_EN(CAPPK2,CAPPK1,KEY2) HMD=04E200F01E+KEY2+057007+STRING(0,07) 3DES_MAC(ATC+HMD+8000000000,CAPPK1,MAC) HMD+MAC</span>
l 扩展应用开通时,用来新增行业应用记录。
l 加密加MAC方式,强制带有MAC,用来确认指令来自合法的终端,MAC计算过程参考8.2 安全机制
l 持卡人在专用设备上开通。
l 循环记录开通业务时,可预先增加一条。该文件对应一条行业应用管理密钥。
l 卡片判断记录长度是否超出,是返回6A80.
l 卡片判断文件空间是否足够,否返回6A84.
<span style="font-family:Microsoft YaHei;">//UPDATE CAPP DATA: DATA=05700700000000002212 KEY= D5F1FE4A7F8C20FDEC49150BA2E00EDF 3DES_MAC(000000000000+ATC+84DE00+ID+0E+DATA+8000000000000000, KEY,MAC) 84DE00+ID+0E+DATA+MAC //RETURN 9000 //RMAC <commad 84DE00b00e0570070000000000000017B8E975 /> <return 57C6C544(4字节的RMAC) /> //校验MAC 初始向量=4字节0+MAC 响应报文 KEY=D5F1FE4A7F8C20FDEC49150BA2E00EDF 3DES_MAC(00000000 17B8E975 9000 800000000000,KEY,MAC)</span>
更新的文件不存在,返回6A82
前续命令GPO命令或UPDATE CAPP 命令,返回6985.
变成文件,需检查是否存在此ID,否则返回6A83.
检查更新的长度是否与原来一致,否则返回6A80或6A84.
暂存数据,读记录完成后,更新。
循环文件,更新最新一条记录。
<span style="font-family:Microsoft YaHei;">CPURESET() //2> 应用初始化(必备): 00A4040008A000000333010101 80CA9F3605(ATC+9000) ATC=COPY(ATC,7,4) //取脱机交易密文TC 805A000002+ATC+08</span>
l 终端在无法接收到最后一条交易指令响应数据的情况下,重新上电并发送此命令,获取上笔交易TC,如果命令响应成功,则终端判断上笔交易成功,否则,按交易失败处理。
l 如果最近一笔交易是脱机预授权交易,返回全0.
l 该命令只能获取最近一笔卡片成功完成的扩展应用交易的TC。
<span style="font-family:Microsoft YaHei;">CPURESET() //2> 应用初始化(必备): 00A4040008A000000333010101 //2.1> READ CAPP DATA: 80B400b0020570 //2.2> 交易前金额: 80CA9F7900 80CADF6200 //抵扣限额 80CADF6300 //已抵扣金额 //DF60=01 9F02 = 000000000100 实际金额=9F79+DF62-DF63 80A80000248322270000800000000001000000000000000156000000000001561410220111223344 01 //2.3>UPDATE CAPP DATA: 80CA9F3605(ATC+9000) ATC=COPY(ATC,7,4) DATA=05700700000000002212 3DES_MAC(000000000000+ATC+84DE00b00e+DATA+8000000000000000,D5F1FE4A7F8C20FDEC49150BA2E00EDF,MAC) 84DE00B00e+DATA+MAC;UPDATE APPDATA CACHE 80B400B0020570(AFTER+9000);READ APPDATA //没有真正被改写,只是缓存 //3> 读应用数据(必备): 00B2011400 00B2021400 00B2031400 00B2021c00 00B2023400 //13.2> 交易后金额: 80CA9F7900 80CADF6200 //抵扣限额 80CADF6300 //已抵扣金额 </span>
1. 先缓存,后更新。交易扣款和扩展应用记录的更新必须确保同时执行,在RECORD READ成功读取最后一条AFL命令记录时统一进行更新,卡片保持本次TC。
2. 验证方式fdda。00或01.
3. 验证9F69第8字节与DF61值是否一致
4. 支持押金抵扣功能,需增加DF62,DF63. 以手机话费为例,DF62为可透支额,DF63为已透支额。
5. 交易前余额=9F79+DF62-DF63,交易后DF63=9F02-9F79,9F79=0或9F79=9F79-9F02
6. 圈存先抵消DF63,再增加9F79.
7. 修改DF62,值必须大于DF63,否则返回6A80.
<span style="font-family:Microsoft YaHei;">CPURESET() //2> 应用初始化(必备): 00A4040008A000000333010101 //2.1> READ CAPP DATA: ID=C0 //A8 B0 B8 C0 80B400+ID+020570 //2.2> 交易前金额: 80CA9F7900 80CADF6200 //抵扣限额 80CADF6300 //已抵扣金额 //DF60=02 9F02 = 000000000200 9F381B 9F6604 9F0206 9F03069F1A0295055F2A029A039C019F3704 DF6001 80A80000248322 270000800000 00000200 0000000000000156000000000001561410220111223344 02 //2.3>UPDATE CAPP DATA: 80CA9F3605(ATC+9000) ATC=COPY(ATC,7,4) ID=C0 DATA=05700700000000002212 3DES_MAC(000000000000+ATC+84DE00+ID+0e+DATA+8000000000000000,D5F1FE4A7F8C20FDEC49150BA2E00EDF,MAC) 84DE00+ID+0e+DATA+MAC;UPDATE APPDATA CACHE 80B400+ID+020570(AFTER+9000);READ APPDATA //没有真正被改写,只是缓存 //循环文件 DATA=01020700000000002212 3DES_MAC(000000000000+ATC+84DE00+f0+0e+DATA+8000000000000000,D5F1FE4A7F8C20FDEC49150BA2E00EDF,MAC) 84DE00+f0+0e+DATA+MAC;UPDATE APPDATA CACHE //00B201F400 过程中,不允许读? 80CA9F7900 //3> 读应用数据(必备): 00B2011400 00B2021400 00B2031400 00B2021c00 00B2023400 //13.2> 交易后金额: 80CA9F7900 80CADF6200 //抵扣限额 80CADF6300 //已抵扣金额 //13> 卡片日志: 00B2015c00 00B2025c00 00B2035c00</span>
1. 是特殊的分时,分段扣费交易,分为预授权(冻结金额),预授权完成(扣款)。表示选择或执行脱机预授权交易:DF60的值02,表示选择或执行脱机预授权完成交易: DF60的值03
2. 不支持押金抵扣功能。
3. 更新的行业记录内容由行业自行定义,但是建议包括脱机预授权状态,脱机预授权金额和脱机预授权日期或者有效期。
4. CAPP=2, 9F79=9F79-预授权金额;CAPP=3, 9F79=9F79+预授权金额-实际消费金额。
5. 支持3个脱机预授权交易,第4个返回6971.(pboc3.0可以,pboc2.0不可以,在UPDATE返回6985)
6. CAPP=2.同行业同应用(SFI相同ID),连续执行,返回6972.
7. CAPP=3,无对应ID,返回6973. (pboc 3.0可以,pboc 2.0不可以,在UPDATE返回6985)
8. 脱机预授权,不返回TC密文(9F26)。
9. 在最后一条记录被读出后,检测当前更新的CAPP记录是否与最后一条READ CAPP记录一致,否则返回6974.交易失败,余额返还。
10.Fdda为01时,比较9F69第8字节与DF61值。
11.Fdda完成后,终端保存相关信息,以便上传。
12.多扣的钱优先补到DF63,少扣的钱从9F79取。
13.圈存时,余额上限9F77必须大于等于9F79+未完成的金额,否则返回6A80。
支持换乘优惠的应用应将本次交易明细记录在扩展应用循环记录文件中,在换乘优惠时,可读取循环记录文件中的内容作为换乘优惠的依据。
参考资料:中国金融集成电路(IC)卡规范 第14部分:非接触式IC卡小额支付扩展应用规范.pdf