SUNMI EMV 特殊流程 - chuwuwang/ReadingNote GitHub Wiki
1. Fallback 降级交易
当读卡CheckCardCallbackV2#onError(int code, String msg)方法回调的code为-2800或者-2801时,表示该卡片可以执行降级交易。
注意: 当一张正常的芯片卡去刷磁条交易时,终端应该提示:不允许降级交易。
/**
* 服务代码(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)。
- Visa 不支持MSD模式,详见CDET 4.18Test Case 18: MSD-only Card。
- MasterCard MSD: https://github.com/chuwuwang/ReadingNote/wiki/SUNMI-Mastercard-MSD-Process
- AE MSD:https://github.com/chuwuwang/ReadingNote/wiki/SUNMI-AE-MSD-Process
注意: 这时将会没有cvm处理,所以终端是否会出现密码键盘,需要客户端根据业务逻辑进行处理。例如:在cvm限额以内,不需要密码,大于cvm限额,出现密码键盘。
5. 脚本处理流程
当接触交易时,终端读卡、读内核数据,上送数据到服务器,服务器返回数据或者超时没有返回,终端将会执行第二次GenAC,终端将会根据执行结果,来判断交易是否成功失败。
-
如果服务器判定交易为成功,但是终端脚本处理结果为失败,则终端应该认为该交易为失败,将会发起冲正交易。
-
如果服务器和终端都判定交易为成功,则需要重新读取内核的TC值(Tag 9F26),如果后面有TC上送交易,或者结算时的批上送交易,都需要使用新生成的TC值。
如何判断需要导入脚本结果?
当回调EMVListenerV2#onOnlineProc()方法,表示需要导入脚本结果。
导入脚本结果的方法:EMVOptV2.importOnlineProcStatus(int status, String tags, String hexValues, byte[] outData)
- status:0表示Approval,1表示Denial,2表示Failed。当服务器返回结果为05或者51时,status应该为1。
- tag 8A:DE39的返回码
- tag 89:DE38的返回值
- tag 91,71,72:由服务器返回,从DE55获取。
签名流程
如果终端支持打印,当cvm要求需要签名时,打印的收据上应该显示签名栏,需要用户主动签名。
如果终端支持电子签名,当cvm要求需要签名时,当判定交易成功之后,终端应该显示签名界面,由用户完成签名,生成电子签名数据,上送签名数据到服务器,如果上送失败,将会在下一次交易前重新上送。
如何判断需要签名?
- 回调EMVListenerV2#onRequestSignature()方法
- 9F34的第一字节为1E或者5E或者03或者43或者05或者45 https://github.com/chuwuwang/ReadingNote/wiki/Emv-9F34-CVM-Results
输入密码流程
当回调EMVListenerV2#onRequestShowPinPad(int type, int remainTime)方法,表示需要输入密码。
- type:0表示联机PIN,将会生成pin block数据。1表示脱机pin,由终端去校验pin是否正确,也不会生成生成pin block数据。
注意: 对于磁条卡交易,终端是否显示密码,是否需要签名,由应用根据自己的业务去处理。
脱机交易流程
当回调EMVListenerV2#onTransResult(int code, String desc)方法,code为1表示脱机批准。终端将判定交易成功,打印收据。当终端连接上网络或者在某一时刻,将终端上所有的脱机交易上送到服务器。
免密免签流程
银联标准,参考 附件3:银联卡闪付联机小额免密产品收单技术指南