摘要
老王的杂货店里货很多,国产的,进口的,不同种类、不同品牌、不同型号的货,应有尽有。
货多了,老王就弄了个小本本记下店里卖的货有哪些,记得很详细,包括有哪些种类,每个种类里有什么品牌,品牌里有什么型号,甚至具体到规格、颜色。客人来要货,老王记不清的时候看看本,就知道有没有。可是这生意就和生活一样,一个问题解决了又来一个问题,关关难过关关过。
大多数情况都挺好,可是时间长了,老王就发现有些问题。按道理,老王的小本本上记录有的货就肯定有,即使有时候卖得太好,货没了,老王找找供应商也就可以补货了。但有好几次,客人要指定型号的货,老王店里货卖没了,需要找供应商补货,理论上肯定能补到货,但结果询问的供应商也没有,既耽误了客人时间,自己也做了无用功。为什么店里明明记着有,供应商那边却没有呢?复盘发现,原因是问错了供应商。
刚开始发展的时候,供应商也就那一个,不存在找哪个供应商订货的问题;后来店开久了,供应商也多了,同样的品牌,江西和江苏的供应商都有。但是各个供应商都有一些当地特供,有的型号只有江苏供应商有,江西的没有;有的型号只有江西的供应商有,江苏的没有。
问题找到后,老王开始亡羊补牢,把 PDCA(计划—执行一检查-处理).方法论运用得淋漓尽致。既然问题出在供应商上,老王就在小本本上原来记录的内容上加上了供应商以及他们能提供的具体产品型号,这样就不会再做无用功,保证联系的供应商就肯定能支持。老王小本本的改变其实就是BIN服务。
老王用小本本管理各商品类目相当于支付中BIN管理的过程;老王小本本记录的格式相当于支付中BIN表字段结构设计的过程;老王根据自己记录的商品品牌、型号去联系具体供应商补货,相当于支付中通过BIN服务判定通道支持能力,把交易请求送到支持的通道,从而提高支付成功率。
一、BIN是什么
大家看看自己身边的银行卡,看看它们有什么差别。
- 首先,如果你身边有多张银行卡,你会发现这些银行卡的发卡行不一样,它们有的来自同一家银行,有的来自不同银行。比如有的银行卡的发卡行是招商银行,有的是农业银行。
- 其次,你会发现这些卡的卡性质不--样,有的是信用卡,有的是借记卡。比如你在某行办了两张银行卡,一张借记卡用作工资卡,一张信用卡用于消费,它们的特性不一样。
- 再者,这些卡即使来自同一家银行,它们的卡级别、卡名称可能都不一样。比如你可能既有某家银行的普通卡,又有这家银行的白金卡,它们的级别是不同的;又如你有某家银行与东方航空的联名信用卡,叫作“某行东航联名信用卡”,而你同事的信用卡虽然与你的来自同一家银行,但他的叫作“某行南航联名信用卡”,因为他偏好南航。你们这两张卡虽然都是某家银行同一级别同一性质的卡,但是背后的福利、名称、卡面设计都不一样。
- 不同点还有很多、比如卡组织不一样(有的卡组织是银联,有的是 Visa)、有公私区分(有的是公务卡,有的是私人卡),这里不再展开。
对于这些不同的卡,银行和支付平台是怎么通过用户输入的卡号获取对应银行卡的开户行、卡级别、随卡福利等信息的呢?
答案是通过BIN ( Bank Identification Nunber.发卡行标识码〕服务实现BIN服务是一种通过对BIN进行管理并提供外部查询用于识别和判断卡所属银行、卡组织、卡级别的支持服务。
我们再看看身边的银行卡,每张卡的卡号都是唯一的,且由三类属性构成:发卡行标识码、发卡行自定义位、检验码。如下图所示为一张招商银行借记卡,其卡号为6214 8321 9171 7276(无效卡,仅作演示用),总共16位数字,具体结构如下。
- 第1~6位是4514,这就是这张招商银行借记卡的BIN。62开头的银行卡是银联卡,这意味着这个卡号是银联作为卡组分配给招商银行的BIN。
- 第7~15位为发卡行自定义位,这里的121654738就是招商银行分配给某个用户,用于识别不同卡、不同用户的标识。
- 最后一位(第16位)为检验码,用于验证此卡为真实卡、有效卡,比如应用Luhn算法进行验证。
在图所示卡号的构成中,BIN是基础,是最为重要的构成,用于识别出一张卡的所属银行。形容支付系统与BIN的关系,九层之台,起于累土。我们可以把支付系统看作“九层之台”,把支付路由服务、通道服务等支付机制看作每一层或大或小的平台,那么构建起这些平台的“累土”就是BIN。
通过BIN不仅可以知道一张卡是由哪家银行发行的,还可以知道卡类型、卡种,这就是为什么大家在一些网站进行支付或者绑卡输入银行卡号时,只输入前几位数字,网站就显示了具体的银行卡名称。
BIN一般由6位数字组成。2014年年底,国际标准化组织(ISO)已经将BIN由6位数字调整到8位数字。目前绝大部分国内银行卡的BIN码是6位。BIN第1位为发卡行业标识号( Major Industry Identifier,MII),代表的是发卡机构所属行业。不同MII代表的行业见表。
标识 | 所在行业 |
0 | ISO/TC68和其他行业 |
1 | 航空 |
2 | 航空和其他行业 |
3 | 运输、娱乐和金融财务 |
4 | 金融财务 |
5 | 金融财务 |
6 | 商业和金融财务 |
7 | 石油和其他行业 |
8 | 医疗、电信和其他行业 |
9 | 有本国标准机构分配 |
在中国银联建立之前,我国各银行发行的银行卡基本只能在国内使用,因为其不符合国际标准,或者是按照表6-1中所列举的具体情况——由本国标准机构分配,发行的大多数为9开头的卡号。
现在已经很少见到9开头的卡号,但这类卡在当初是有历史意义的。为了推动国家的“金卡工程”,实现全国的银行卡业务规范和标准统一,中国人民银行在2000年特别发布342号文《中国人民银行关于颁布〈银行卡发卡行标识代码及卡号〉和〈银行卡磁条信息格式和使用规范〉两项行业标准的通知》,其中规定发卡行标识码第一位固定为9。
在2000年342号文颁布后,因为标准的建立与规范,国内银行卡互联互通发展迅速。到2001年年底,全国银行卡发行量已经达到3.83亿张,特约商户超过15万家,POS终端21.8万台,ATM 3.8万台,当年交易总金额达到8.43万亿元,银行卡消费占社会商品零售额的比重提高到了2.7%。这些数据表明,社会对银行卡的接受程度越来越高,银行卡使用更为广泛。342号文在当时的历史背景下意义重大。BIN由国际标准化组织( International Organization forStandardization , 1SO)分配给各从事跨行转接交换的银行卡组织,再由卡组织分配给各组织内银行,分配顺序见图6-2。
在2002年之前,我国是没有卡组织的,银行卡只能在国内使用,国际支付银行卡大多是使用Visa、Mastercard、JCB、美国运通等国外卡组织的银行卡。
2002年3月,经过国务院同意,中国人民银行批准设立了中国银联(简称“银联”)。银联有很多职能,其中有项是统银行卡跨行技术标准和业务规范,实现系统间互联互.通和资源共享,保征银行卡跨行、跨地区和跨境的使用。
这样的目标与职能促使银联在2003年8月推出“62”BIN的银联标准卡,并在日后逐步实现国内银行发行的内卡均为统一标准银行卡,也就是62开头。银联也成为BIN注册机构,国内银行在发行卡时需要向银联提出BIN分配申请。
银联标准卡62的BIN不仅是国内规范的统一,也是我国银行卡由国内可用走向国际通用的一步。银联按照ISO国际标准进行申请,由ISO分配给银联以62开头的BIN,银联根据ISO分配 BIN进行再分配,分配给各发卡行。
至此,国际有了六大卡组织:中国银联股份有限公司( UnionPay)、万事达卡国际卡组织(Mastercard)、维萨国际卡组织( Visa)、美国运通国际股份有限公司( AE)、日本国际信用卡公司(JCB)和大莱信用卡有限公司(Dincrs Club)。按照ISO分配情况。
卡组织中文名 | 卡组织英文名字 | 卡号范围 |
银联 | Union Pay | 620000-629999 |
维萨 | Visa | 400000-499999 |
万事达 | Mastercard | 510000-559999 |
日本国际信用卡 | JCB | 352800-358999 |
大莱 | Diners Club | 300000-305999 |
309500-309599 | ||
360000-369999 | ||
380000-399999 | ||
美国运通 | American Express | 340000-349999 |
370000-379999 |
二、BIN的表的设计
每一张银行卡的诞生,标准流程是发下行问对应卡纽织串请对应BTN,而卡组织的BIN由ISO分配发卡行拿到对应BIN后再去生成卡号、发绘持卡人。
如老王开店的故事一样,ISO 就相当于老王的杂货铺,用不同的商品编号来代表不同种类的商品。
银行卡就像生活百货这样比较大的领域,老王大手一挥,就划定了几个号段给生活百货。
卡组织就像生活百货的各个具体种类,比如衣服、食品等,哗的一声,老王就又从生活百货里划了几个号段给各个品类。
具体银行的卡种就像每个品类的厂商,如食品中的康师傅、统一,抽纸用品里的清风、心相印,哗的一声,老王又从每个品类的号段中分配一些给了各厂商的一些品牌。
康师傅红烧牛肉面的商品编号就像招商银行信用卡的BIN,商品条码后面的长度定义了这个产品最大产量和标准格式。比如招商银行16位的卡,去掉最后一-位校验码和前面6位BIN,还有9位,代表这个卡最多只能发行999 999 999张。
除此之外,还要考虑的一个问题是,同样的产品是有不同的供应商的,比如康师傅红烧牛肉面,既有江苏的供应商,又有江西的供应商;既有A厂生产的,又有B厂生产的。每个供应商供应的面品种可能重叠,也可能有不一样的地方;同样,每个工厂生产的品种可能一样,也可能不一样。就像支付里支付品牌对应的支付通道一样。招商银行信用卡会存在不同的支付通道,这些支付通道的支付能力可能不一样、也就是支持的卡种不一样.支持的BIN段不样.国此在这种多供应商、多品种的情况下.还需要划出编号来区分不同的供应商。
通道与BIN服务的关系是很多人在进行BIN服务设计时最容易忽视或者因为没有经验而忽略的地方﹒大家日常在线下或者线上进行卡类支付时,如果留心前端报错信息或者支付通道返回的错误码,会看到这样的文案:“BIN校验不通过”“卡号错误”“卡类型不对”,也可能直接就是“支付失败”等。造成这种情形的原因有很多,比如以下3条:
- 卡号错误。这包括卡号不存在、卡位数不对等原因。
- 卡号正确,但卡类型错误或者银行错误。比如拿着借记卡却选成了信用卡进行交易,系统把农业银行信用卡当作工商银行卡送到了工行通道进行交易。
- BIN不支持不管是通道出子港后刊4朵维护新的BIN 、还是其文付能力受限不支持此卡所对应的BIN,只要通道不支持的BIN|送交易到点付通.道.结染就公失败就像你去一家不是手冲店的星巴克店买手冲咖啡,不管去多少次、买多少杯都会失败,都会买不到,因为你去的店根本不具备这个能力。
支付从业人员如果要获取完整的BIN信息,可以联系具体卡组织、发卡行和通道服务商。这三者提供的BIN信息既有共同的部分,又有各自独有的部分,它们的并集构成了全集。
卡组织提供该组织下最为完整的各发卡行BIN信息.比如银联提供使用银联标准卡的各发卡行(招商银行、工商银行等)的各类型卡(经典卡、借记卡金卡等)的BIN信息,但其无法提供其他卡组织(Visa、Mastercard等)的BIN信息。
发卡行提供该银行下最为完整的各卡种BIN信息:比如招商银行作为发卡行,既发行银联卡,也发行Visa 卡、Mastercard卡,因此招商银行提供的BIN信息不仅包含银联的,也包含其他卡组织的,但是其无法提供其他发卡行的BIN信息。
通道服务商提供该通,道支付能力以内的BIN 信息,拿第三方支付通道服务商举例,它提供的支付能力有多银行、多卡种,比如既支持招商银行,又支持工商银行;同时支付能力也可能支持多卡组织,比如支付宝既能支持银联卡,又能支持万事达卡。通道服务商提供的BIN信息是由其支付能力覆盖范围而定的,既涵盖多家银行,又包括不同卡组织。通道服务商的缺陷在于其支付能力是有限的,不可能穷举全世界甚至只是全国所有银行的所有卡种,所以其无法提供不在其支付能力覆盖范围内的BIN信息。
当然还有些第三方网站提供查 BIN,这里不再列举,大家可以在网上自行搜索。根据以上所述,在进行BIN服务设计时,有两种方案:一种与通道无关.用于相对简j单场景,比如单通道场景;一种与通道有关.用来精确匹配、尽可能保证通道可用性。
2.1 不涉及通道方案
假设以招商银行作为发卡行,发行卡种为携程联名信用卡和东航联名信用卡,则其方案表结构见表。
银行名称 | 卡种名称 | 卡类型 | 卡等级 | BIN长度 | 卡号长度 | BIN段开始 | BIN段结束 | 是否有效 | BIN图片 | 是否为外卡 |
招商银行 | 携程联名信用卡 | 信用卡 | 普卡 | 6 | 16 | 620000 | 629999 | 有效 | 默认 | 否 |
招商银行 | 东航联名信用卡 | 信用卡 | 白金卡 | 6 | 16 | 630000 | 639999 | 有效 | 默认 | 否 |
在这种方案中,涉及的字段有银行名称、卡种名称、卡类型、BIN长度、卡号长度、BIN段开始、BIN段结束、是否有效、BIN图片、是否是外卡。具体字段说明如下。
- 银行名际:用于表示在BIN识别时识别的发卡行或卡组织,如表中的招商银行。
- 卡种名称:用于表示该银行的具体卡种,如表6-3中的携程联名信用卡、东航联名信用卡。这样的卡种区分可以用于营销合作,展示不同权益,或结合图片展示不同的卡界面,就像实物一样,增强体验。
- 卡类型:用于表示卡的借贷属性,卡类型有借记卡、贷记卡和准贷记卡。该字段用于判断卡类型,供支付系统识别进行不同支付逻辑处理。比如充值业务只支持使用借记卡进行支付,需要屏蔽贷记卡。
- 卡等级:用于表示具体卡的等级属性。卡等级可结合营销,用于做数据挖掘、会员权益等活动。
- BIN长度:用于表示BIN的长度。根据BIN长度截取卡号对应位数号码,与 BIN表进行匹配。
- 卡号长度:用于表示该卡种的卡号长度。将卡号长度结合其 BIN信息、校验码算法,可以进行匹配并判断用户输人卡号是否有效,进而拦截无效卡号。
- BIN段开始和BIN段结束:用于匹配BIN具体值区间。每个卡种的BIN区间都不一样,也不一定是连续的。如果遇到不连续的BIN信息,在设置BIN表的时候需要录入多条卡数据。比如大莱卡的BIN段有300000~305999、309500~309599、360000~369999、380000~399999,这样的BIN 段就需要设置多条数据。
- 是否有效:BIN 数据的有效性。用于筛选系统有效数据,避免进行无效匹配。
- BIN 图片:展示具体卡种图片。结合卡种名称,一起为用户带来真实卡片的感受。如果没有相关图片,可以设置默认图片,用来向用户展示该行图片
- 是否是外卡:用于标记卡片的内外卡属性。内外卡属性很重要,第⒉章介绍了支付过程如何避免“内卡外收”以及外卡的支付特点(如3DS安全认证、动态汇率转换)等知识。要避免这些错误和实现这些功能,必须先正确识别其卡属性,而识别的依据就是BIN数据。
这样的 BIN表设计就能够满足单一通道场景了。这种设计的优点是只与卡种相关,维护简单,缺点是覆盖场景不足。
2.2 涉及通道方案
支付有不同的场景,比如机票、酒店,在这些场景中需要用到不同的交易类型,比如机票用到的交易类型是消费,而酒店除了用到消费交易类型,还会用到预授权交易类型。不同的支付通道能力不一样,大多数规模以上企业从降成本、备份角度考虑也会接人多家通道,如果还沿用第一种方案就不能满足需求,甚至是有缺陷的。
在前面中介绍过,路由有各类算法逻辑来匹配最优通道,而最优通道的前提首先是可用性,即将交易上送给通道后不能返回“卡号错误”“BIN 不支持/该卡暂不支持”之类的返回码,于是就有了涉及通道的BIN表方案。
假设以招商银行作为发卡行,发行卡种为携程联名信用卡,但是支持的通道有银联和招行直连,则其表结构见表。多了一个字段“通道名称”。如我们在表中所见,同样的招商银行携程联名信用卡,它的BIN全集是620000~629998。通过前面的内容我们知道,所有的支付方式都是通过支付通道来支持的。
通道名称 | 银行名称 | 卡种名称 | 卡类型 | 卡等级 | BIN长度 | 卡号长度 | BIN段开始 | BIN段结束 | 是否有效 | BIN图片 | 是否为外卡 |
银联 | 招商银行 | 携程联名信用卡 | 信用卡 | 普卡 | 6 | 16 | 620000 | 629999 | 有效 | 默认 | 否 |
招行直连 | 招商银行 | 东航联名信用卡 | 信用卡 | 白金卡 | 6 | 16 | 630000 | 639999 | 有效 | 默认 | 否 |
如表所示,招商银行携程联名信用卡的两个通道均可以支持其交易、分别是银联直连通道与招行直连通道,两者的BIN范围不同,这里就有了两条数据。
2.3 方案设计案例
我们通过以下案例进一步讲解上述两种设计方案。前置条件如下。
- 客户使用招商银行信用卡交易,BIN为620000。
- 可用支付通道有两个:银联通道,支持BIN为620000~629998;招行直连通道,支持BIN为620001~629999。
- 招行直连通道费率为0.1%,银联通道费率为0.3%。
- 路由中仅有按成本路由。
方案一:BIN不涉及道通道方案
- 判断该卡是否支持时,按照设计会判断BIN是否支持,经过校验,BIN服务支持该BIN;
- 判断最优通道,因为招行直连通道费率( 0.1%)低于银联通道( 0.3%),在没有其他算法参与的情况下,招行直连通道是最优通道。
路由算出最优通道,用户按照招行通道需要提交卡信息,上送通道处理。
最后结果是什么呢?支付失败。银行返回错误码“卡号错误”或“BIN不支持/该卡暂不支持”。其原因在于620000的BIN段虽然是招商银行信用卡,但是直连通道并不支持此BIN段。BIN服务设计中只体现了该卡与 BIN的关系,并没有体现通道与BIN的关系,系统无法判断是否支持。
方案二:BIN涉及通道方案
- 判断该卡是否支持时,按照设计会判断BIN是否支持,经过校验,BIN服务支持该BIN,且支持的通道只有一个,为银联通道。
- 判断最优通道,因为只有一个通道可用,所以最优通道就是银联通道。
路由算出最优通道,用户按照招行通道需要提交卡信息,上送通道处理。最后结果是什么呢?支付成功。银行返回返回码“交易成功”。其原因在于BIN服务设计保证了每个通道与BIN号段对应,保证了可用性。
三、卡号校验算法
BIN是卡号的一部分。在用户输人卡号时,输入前6~9位我们可以通过BIN提前判断出对应银行及卡号是否有通道支持。那么在用户输入完卡号之前,我们能否先检验出这个卡号是否有效,或者在测试的时候有没有一定的规则能模拟出卡号来?
答案是有的,这个卡号规则就是需要符合Luhn算法,也称为“模10算法”,它是一个专门用于验证银行卡号有效性的算法。Luhn算法由美国IBM科学家Hans Peter Luhn于20世纪60年代发明,对所有大型卡公司发行的银行卡都起作用,无论是我国的银联还是国外的美国运通、Visa、Mastercard、JCB等卡组织,甚至护照、社会保险号都符合这个算法。需要说明的是,这个算法并不是为了加密,而是为了防止意外出错。
银行卡验证Luhn算法的规则如下:
- 从卡号最后一位数字开始,逆向将奇数位相加;
- 从卡号最后一位数字开始,逆向将偶数位数字先乘以2(如果乘积为两位数,则将其减去9),再求和;
- 将奇数位总和加上偶数位总和,结果应该可以被10整除。
博文参考
《支付方法论》