CPU卡流程备忘

cpu卡流程,pboc3.0

Posted by if on 2016-09-07

初始化端口

icdev =  dc_init(100,115200)
为100时表示usb口通讯,此时波特率无效

设置typeA

result = dc_config_card(icdev, 'A');
成功返回值0
long icdev串口标识符
string A为TypeA,B为TypeB

射频复位

result = dc_reset(icdev,Msec);
成功返回值0
long icdev串口标识符
smallint Msec复位时间

寻卡

result = dc_card(icdev, Mode,  cardserialnumber);
成功返回值0
long icdev串口标识符
smallint mode寻卡模式 0一对一,1一对多
pansichar cardserialnumber返回的卡序列号

上电复位

result = dc_pro_resethex(icdev, * rLen, * rData);
成功返回值0
long icdev串口标示符
smallint rlen 返回数据长度
pansichar rData 返回信息    

蜂鸣

result = dc_beep(icdev, Msec);
成功返回值0
long icdev串口标示符
smallint Msec 蜂鸣时间

发送apud

result = dc_pro_commandlink_hex(icdev, Len, apud, rLen, data, tt, fg);
long icdev串口标示符
smallint Len 发送数据长度
pansichar apud 发送数据
smallint rLen 返回数据长度
smallint tt 延时时间 我设置为7
smallint fg 分割长度  我设置为64
pansichar data 返回数据

apud命令

  • MF 00A404000E325041592E5359532E4444463031
  • AID 00A4040008A000000632010105
  • 15H 00B095001E
  • 16H 00B0960037
  • 17H 00B097003C
  • balance 805C000204

充值流程

  1. 卡片上电
  2. 进入MF’00A404000E325041592E5359532E4444463031’
  3. 进入AID’00A4040008A000000632010105’
  4. 读取15H’00B0950A0A’ 截取相应卡序列号后8字节
  5. 圈存初始化805000020B[1字节密钥索引][4节交易金额][6字节终端机号][0x10]
    返回数据依次是:4字节旧余额,2字节卡联机交易序号,1字节密钥版本,1字节算法标识,4字节随机数,4字节MAC1
  6. 用圈存初始化的返回数据调用“个人充值申请报文”接口,获得MAC2
  7. 圈存,805200000B[7字节交易日期时间][4字节MAC2][0x04]
    返回数据是:4字节交易TAC
  8. 调用“个人充值提交”接口

消费

  1. 消费初始化805001020B[1字节密钥索引][4节交易金额][6字节终端机号][0x0F]

消费流程(旧)

  1. 卡片上电
  2. 进入MF’00A404000E325041592E5359532E4444463031’
  3. 进入AID’00A4040008A000000632010105’
  4. 读取15H’00B0950A0A’ 截取相应卡序列号后8字节
  5. 消费初始化805003020B[1字节密钥索引][4节交易金额][6字节终端机号][0x10]
    返回数据依次是:4字节旧余额,2字节卡联机交易序号,3字节透支限额,1字节密钥版本,1字节算法标识,4字节随机数
  6. 用消费初始化的返回数据调用“商户消费申请报文”接口,获得MAC1
  7. 消费,805401000F[4字节终端交易序号] [7字节终端交易时间] [4字节MAC1][0x08]
    返回数据是:4字节交易TAC,4字节MAC2
  8. 调用“商户消费提交”接口

D8读卡器相关操作

  • 端口初始化

    icdev := dc_init(100, 115200);

    int  dc_init(int port,long baud);
    功 能:初始化通讯口
    参 数:port:取值为0~19时,表示串口1~20;为100时,表示USB口通讯,此时波特率无效。
    

    ​ baud:为通讯波特率9600~115200
    返 回:成功则返回串口标识符>0,失败返回负值,见错误代码表
    例:int icdev;
    icdev=dc_init(0,9600);//初始化串口1,波特率9600

  • 初始化cpu卡卡座

    st := dc_setcpu(icdev, 12);

    __int16 dc_setcpu(HANDLE ICDev,unsigned char SAMID)
    说明:设置要操作的SAM卡座
    调用:int ICDev ---- dc_init 函数返回的端口标识符
    

    ​ unsigned char SAMID — 设置要操作的卡座号,0x0c为附卡座,0x0d 0x0e 0x0f各为SAM1 SAM2 SAM3
    返回:<0 错误。其绝对值为错误号
    ​ =0 成功


读MF文件

CMD_MF
00A404000E325041592E5359532E4444463031

AID

all :00A4040008A000000632010105

00                //CLA Class
A4                //INS Instruction
04                // P1 Parameter 1
00                // P2 Parameter 2
08                //CMD_AID.length
A000000632010105  //CMD_AID

15H文件 ((1) 公共应用信息文件)

req:00B095001E
rep:0259 4920 FFFFFFFF020103105071000000000005201605232040123100009000

CardInfo info=new CardInfo();
info.setIssueCardCode(ByteUtil.toHexString(data,0,8));  //
info.setAppType(ByteUtil.toHexString(data,8,1));        //应用类型
info.setCardNo(ByteUtil.toHexString(data,10,10));       //卡号
info.setEffectiveDate(ByteUtil.toHexString(data,20,4)); //应用生效日期
info.setExpiryDate(ByteUtil.toHexString(data,24,4));    //应用失效日期
info.setVersion(ByteUtil.toHexString(data,9,1));        //应用版本号
return info;

16H((2) 持卡人基本信息文件)

req:00B0960037
rep:

17H((3) 管理信息文件)

req:00B097003C
rep:0000015649004920000101202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020202020209000
CardManageInfo info=new CardManageInfo();
info.setCountry(ByteUtil.toHexString(result,0,4));
info.setProvince(ByteUtil.toHexString(result,4,2));
info.setCity(ByteUtil.toHexString(result,6,2));
info.setCardType(ByteUtil.toHexString(result,10,1));

余额BALANCE

req:805C000204
rep:0000 D1F8 9000

6F49840E325041592E5359532E4444463031A537BF0C3461194F08A000000632010106500A4D4F545F545F4341534887010161174F08A00000063201010550084D4F545F545F45508701029000