前阵时间, 有幸参与公司的社保类项目. 其中, 本人负责的是银联对接的部分接口, 主要参考协议为ISO8583, 而银联就此提供了<多渠道平台接入接口规范>等接口文档供开发参考. 鉴于本人忘性较大, 悟性也较低, 所以整理记录下来以便后续开发维护, 希望能对后来者也提供些许帮助.
本文全文原创, 可供参考和引用, 仅希望引用者注明出处, 已是不甚感激; 如果能在引用的时候, 再适当添加自己的见解并帮助更多童鞋获取知识, 就是对本人的最大褒奖.
支持开源,谢绝伸手. 尊重作者就是尊重自己.
一. 全局概述
1. <多渠道平台接入接口规范>这个标准规定了各种接入端(主要包括直联多渠道平台的终端, 包括这里主要关注的POS机)与中国银联多渠道平台之间进行联机交易时使用的报文接口, 包括联机交易报文的结构/格式以及报文域.
2. 报文结构说明
报文长度 | TPDU头 | 拨号监控数据 | 报文头 | 应用数据 |
2字节十六进制表示的报文长度(不包括本身) | 5字节 | 33字节 | 12字节 | 交易数据(不定长度) |
3. 报文长度
0x2B: 整个报文(不包括TPDU/拨号监控数据/报文头)的长度为: 0x2 * 256 + 0xB = 512 + 11 = 523字节.
4. TPDU头
Transport Protocol Data Unit,传输协议数据单元, 包括ID项(一个字节, 用于标识报文类型), Destination Address项(NII, 两个字节, 标识该报文的目的地址, 一般情况下, 用来标识不同银行的前置机), Originator Addreess(两个字节, 标识该报文从哪一个POS接入端口收到的报文). 一般需要根据实际情况来设置, 这个具体可以在跟收单行洽谈并设置前置机的过程中获取.
5. 拨号监控数据
LRI首标志 | ANI | DNIS | LRI尾标志 |
5个字节, 固定取值为: \x4C\x52\x49\x00\x1C | 8个字节(数字) | 8个字节(数字) | 12个字节, 固定取值为: \x58\x00\x09\x49\x00\x06\x00\x00\x00\x22\x00\x30 |
拨号监控数据又称拨号监控头, 如果TPDU中指明有拨号监控要求, 需要添加, 拨号监控头的报文格式参见标准. 因为本次开发并未使用, 所以无需填入, 暂不加以总结.
6. 报文头
总长度为12字节, 压缩时用BCD码表示为6个字节长度的数值. 相对固定, 具体的设置可以参考银联接口文档, 不多做解释.
7. 重点难点
7.1 TPDU头
TPDU头是报文中容易被忽视的地方, 银联接入测试环境时, 会详细对TPDU头/拨号监控头和报文头进行校验. 如果匹配不上或解析失败, 会直接将该报文丢弃不做任何处理, 难以获取调试信息.
7.2 BCD码的理解.
BCD为二进码十进数或二-十进制代码, 用4位二进制数来表示1位十进制数中的0~9这10个数码; 是一种二进制的数字编码形式, 用二进制编码的十进制代码. 这里采用的是8421编码的BCD码.
例如, 一条十进制数据的字符串"1234567890", 十六进制字节为\x31\x32\x33\x34\x35\x36\x37\x38\x39\x30, 压缩BCD码为\x12\x34\x56\x78\x90. 反之, 从BCD到ASCII再到十进制数字, 逆向处理即可.
二. 报文域属性和数据格式
1. 报文整体描述
ISO8583终端报文一共包含64个报文域, 报文域属性/数据格式和压缩前后的数据长度, 在标准中都有说明.