银联接口开发随笔(1)
银联接口开发随笔(1)
银联的接口开发涉汲到的东西比较多,需要通过一个系统的文章来完成,第一篇先介绍一下相关常用到的概念。
首先做个广告,我们公司的机器如下图所示
可以在上面进行手机话费充值,购买游戏点卡、电影票,打印优惠券,水、电、煤缴费,另外值得提一下的是还可以直接刷银行卡进行以上消费,马上要上线的还有信用卡还款等功能。现在机器大多在上海的全家便利店和罗森便利店里。
以前我去ATM机取钱,每次都很感叹银行这种跟人民币直接打交道的机器是多么强大,安全可靠,现在经过一段ChinaPay和银商POS接口开发以后,仍然感叹ATM机的强大,安全可靠。目前有文章写关于POS开发,或者说ATM机开发的很少,网上只能找到一些只言片语,或者蜻蜓点水式的,一来这方面的资料都只有银行、银联自己知道,还有一些硬件厂商,外界流传出来的并不多,所以我想通过自己知道的一些情况,做个整理,也希望对希望了解相关业务的程序员做个参考
下面先介绍一下相关概念
银行卡号:平常我们看到的银行卡号的磁条都是以磁道形式存在,常见到的银行卡号一般都在2磁道上,要想知道这些信息,需要专门的读卡器设备,就像银行ATM机里的读卡器,或者像平常看到一些支持银联POS刷卡业务的POS机,现在卡号一般是19位,前6位是BIN号,可以区分是什么银行的卡,现在中国银联卡多以62开头,7-18位由各家银行自己定义,最后一位是校验码,校验规则网上有很多资料,不作解释。
ISO 8583协议:该协议是全世界银行通用的通讯协议,共有128个域,但是目前POS开发中常用其前64位,这些都是由各家银行自己定义,关于这个协议,比较复杂,这里只好一代而过,不过这里关于位图的概念还是需要说一下。想像一下8583协议定义了128个域,而我们平常不是每个域都需要的,打个比方,你想查询卡的余额,你只需要卡号和密码就可以了,其它的信息都不需要,那这种情况下你还是传128个域的信息是一种浪费,像银行这种对网络资源也比较节省的,更不想产生这种资源浪费,于是位图的重要性就体现出来了,在每段报文前面加个8个字节的报文域,一个字节由8个2进制码,这样就有8*8个2进制码用于表示8*8个域,如果有该域只要在相应2进制设为1就可以了。
工作密钥:我们平常在银行ATM机上取钱,在金属密码键盘上输入密码,这时候,键盘会用工作密钥把你输入的密码加密以后再送出来。这个工作密钥是键盘每天都要去银行获取的。这时候你是不是会有疑问,如何保证工作密钥在网络上传输时不会截获呢?下面引出主密钥的概念。
主密钥:是一种保存在键盘里的密钥,跟银行那边保存的是一样的,终端设备去银行主机签到(签到的概念在下面解释),银行会把工作密钥用这个主密钥加密以后再发送,加密后的包注到键盘里以后,键盘里的主密钥会解开这个密文,解开的密文就是工作密钥了。
网络分布:
商户开通银联的业务以后,如果采用TCP/IP接入的话,需要一台专门与银联打交道的服务器,其它所有终端都通过专用服务器再接入到银联的前置机,之间采用Socket连接方式接入。商户的每个终端都有唯一的终端号,且每天都需要签到 。
签到:举个通俗的例子,我们每天上班,都要打卡报到,然后再工作,终端设备想要与银联通讯,也要每天都去报到一次,这个报到的过程可以理解为签到,
交易:
通过下面这幅图就可以理解了
充正:
冲正,简单的说就是把银行主机已经扣的帐冲回去。举例子来讲,我们刷卡进行手机充值,客户选择充值金额-》刷卡-》输入密码-》发送扣款请求到银行主机-》银行主机扣款完成-》进行手机话费充值。这时候如果手机充费充值过程失败,但是银行主机的款已经扣了,怎么办?这时候可以再向银行主机发起一次充正请求,把刚刚扣款的账销掉。
第一篇文章就先写到这,先是只讲些概念,以后会继续讲解,并尽可能多的贴上代码。