SUNMI EMV 特殊流程 - chuwuwang/ReadingNote GitHub Wiki

1. Fallback 降级交易

当读卡CheckCardCallbackV2#onError(int code, String msg)方法回调的code为-2800或者-2801时,表示该卡片可以执行降级交易。

https://github.com/chuwuwang/ReadingNote/wiki/Emv-%E5%85%B3%E4%BA%8E-IC-%E5%8D%A1%E9%99%8D%E7%BA%A7%E4%BA%A4%E6%98%93

注意: 当一张正常的芯片卡去刷磁条交易时,终端应该提示:不允许降级交易。

/**
 * 服务代码(SC)第一位
 * 如果卡片仅含有磁条, 不含有芯片, 那么服务码仅可以是1或5开头
 * 如果卡片含有芯片, 那么服务码仅可以是2或6开头
 */
fun isChipCard(track2: String): Boolean {
    if (track2 == null || track2.length < 13) {
        return false
    }
    val index = track2.indexOf("=")
    if (index < 0) {
        return false
    }
    val serviceCode = track2.substring(index + 5, index + 6)
    return "2" == serviceCode || "6" == serviceCode
}

2. 多应用选择

当一张卡片里面有多个应用,终端正好也支持卡片里面的多个应用。这时,终端应该提示用户选择某个应用进行交易。在EMVListenerV2#onWaitAppSelect(List appNameList, boolean isFirstSelect)方法回调中,EMVCandidateV2有应用的名称、aid和优先级等。

注意: 在某些卡组织的L3的认证中,会有Aid优先选择的要求。这时就会根据EMVCandidateV2中的priority字段,进行自动选择优先级最高的应用,而不需要用户主动选择。

3. See Phone 流程

当用户使用Apple Pay,Samsung Pay,小米Pay,华为Pay等手机钱包进行刷卡支付的时候,如果这时候手机处于锁屏或者需要验证才可以进行交易的时候,就会进入see phone流程。终端应该提示:请查看手机完成支付。之后,将会要求用户重新使用手机刷卡支付。

具体方法回调请参考https://github.com/chuwuwang/ReadingNote/wiki/SUNMI-See-Phone-Porcess

4. MSD(Mag Stripe Mode) 流程

非接磁条模式。非接触交易时,把挥卡交易当成刷卡交易进行处理,不需要Emv数据(DE55)。

  1. Visa 不支持MSD模式,详见CDET 4.18Test Case 18: MSD-only Card。
  2. MasterCard MSD: https://github.com/chuwuwang/ReadingNote/wiki/SUNMI-Mastercard-MSD-Process
  3. AE MSD:https://github.com/chuwuwang/ReadingNote/wiki/SUNMI-AE-MSD-Process

注意: 这时将会没有cvm处理,所以终端是否会出现密码键盘,需要客户端根据业务逻辑进行处理。例如:在cvm限额以内,不需要密码,大于cvm限额,出现密码键盘。

5. 脚本处理流程

当接触交易时,终端读卡、读内核数据,上送数据到服务器,服务器返回数据或者超时没有返回,终端将会执行第二次GenAC,终端将会根据执行结果,来判断交易是否成功失败。

  1. 如果服务器判定交易为成功,但是终端脚本处理结果为失败,则终端应该认为该交易为失败,将会发起冲正交易。

  2. 如果服务器和终端都判定交易为成功,则需要重新读取内核的TC值(Tag 9F26),如果后面有TC上送交易,或者结算时的批上送交易,都需要使用新生成的TC值。

如何判断需要导入脚本结果?

当回调EMVListenerV2#onOnlineProc()方法,表示需要导入脚本结果。

导入脚本结果的方法:EMVOptV2.importOnlineProcStatus(int status, String tags, String hexValues, byte[] outData)

  1. status:0表示Approval,1表示Denial,2表示Failed。当服务器返回结果为05或者51时,status应该为1。
  2. tag 8A:DE39的返回码
  3. tag 89:DE38的返回值
  4. tag 91,71,72:由服务器返回,从DE55获取。

签名流程

如果终端支持打印,当cvm要求需要签名时,打印的收据上应该显示签名栏,需要用户主动签名。

如果终端支持电子签名,当cvm要求需要签名时,当判定交易成功之后,终端应该显示签名界面,由用户完成签名,生成电子签名数据,上送签名数据到服务器,如果上送失败,将会在下一次交易前重新上送。

如何判断需要签名?

  1. 回调EMVListenerV2#onRequestSignature()方法
  2. 9F34的第一字节为1E或者5E或者03或者43或者05或者45 https://github.com/chuwuwang/ReadingNote/wiki/Emv-9F34-CVM-Results

输入密码流程

当回调EMVListenerV2#onRequestShowPinPad(int type, int remainTime)方法,表示需要输入密码。

  1. type:0表示联机PIN,将会生成pin block数据。1表示脱机pin,由终端去校验pin是否正确,也不会生成生成pin block数据。

注意: 对于磁条卡交易,终端是否显示密码,是否需要签名,由应用根据自己的业务去处理。

脱机交易流程

当回调EMVListenerV2#onTransResult(int code, String desc)方法,code为1表示脱机批准。终端将判定交易成功,打印收据。当终端连接上网络或者在某一时刻,将终端上所有的脱机交易上送到服务器。

免密免签流程

银联标准,参考 附件3:银联卡闪付联机小额免密产品收单技术指南