为什么要补档

补档文章均首发于2019年-2020年这一年多的时间里,由于疏忽,这段时间用hexo写的博客都没有做备份,源文件也被埋葬到了一块打不开的硬盘里。
好在经过回忆,那时写的大部分博客内容较为浅显,基本在网上有更加成熟的其它博客,故无需对其中的大部分文章进行补档。
回忆起来,大概只有几篇比较冷门领域的博客,笔者经常收到读者的交流邮件,故决定对这几篇文章逐步进行补档。所谓逐步,就是慢慢补,想起来就补,慢慢补。
补充:补档的原则是,不进行勘误、调整、补充和删减,仅完全按照原文进行复制粘贴。

1

今天是5月21号,离上次更新过去了差不多一个月,现在更新EMV的第二篇,也是实习期间学到的。

这次是持卡人码,即被扫码,在消费过程中,持卡人将自己终端内生成的持卡人码展示给商家,商家使用“扫枪”扫描持卡人,完成消费。
EMVCo官方同样也给出了持卡人码的规范文档,文档内容:文档

上篇已经对EMV码做过介绍,这里直接介绍EMV持卡人码的生成规则。持卡人码同样是字符串,将字符串按照特定的规则解析,实现转账功能。和EMV商户码字符串不同的主要有两点:

1、持卡人码在生成后经过了Base64编码。

2、持卡人码字符串包括两部分,一部分是商户端可以处理的数据,另一部分不需要商户端处理,对于不需要处理的数据,直接将数据转发给收单方即可。

2

编码格式

持卡人码也是TLV格式,持卡人码要求必须以Tag85开头,后面要么是一个tag61,要么是两个tag61+一个tag62。85域里是持卡人二维码模板版本信息,61域叫应用程序模板,62域叫公共数据模板。
tag85当前的值为CPV01,即一个EMV持卡人码的开头为8505CPV01,tag61包含多个子域,其中,4F子域是必须存在的,57、5A两个子域必须有一个存在;5A子域表示的是持卡人码的PAN,而57还包含了其它信息,57的格式为:pan码+‘D’+YYMM(表示截止日期)+三位服务编码+其它数据+‘F’。61域的其它子域如下图所示。

1

编码内容

62子域和61子域的内容完全相同,但是相同的子域内容不会同时出现在61和62两个域内,即如果持卡人码的格式是两个61域+一个62域,61域里应该是区别部分,62域里应该是公共部分。
将以上内容拼接完成后,通过base64编码,即可生成标准的EMV持卡人码

Demo

下面是我自己写的一个生成各种支付二维码的安卓程序.程序