SP通用网关接口协议初探
因为某种需要,也不得不试着了解一下未知领域。首先介绍两个术语:
IVR:交互式语音应答模块,解释和运行应用业务流程的软硬件。
SP:业务提供商。
一、概述
1、功能简介
总的来说,通用网关是IVR和SP应用服务器之间进行消息交互的中间协议转换程序。通用网关的位置如下图所示:
IVR和通用网关之间采用内部协议,通用网关和外部SP应用服务程序之间采用TCP/IP协议,通用网关作为客户端,SP应用服务程序作为服务器端,可以采用长接连或者短连接两个连接方式。
对于一个通用网关,可以连接若干个SP的应用服务器,每个连接可以采用不同的连接方式和连接协议。
为了实现冗余备份和负载均衡,对于一个SP服务器,有时采用两个通用网关作为客户端与之进行连接。一般的,一个SP所有的业务交互接口都在一台应用服务器上。
按照TCP协议长连接和短连接的连接方式,以及业务数据否需要加密等业务需求,通用网关对外提供了四种方式的连接协议,分别是:短连接不加密的字符串传输方式,短连接根据密钥加密的传输方式,长连接不加密的字符串传输方式,以及长连接根据密钥加密传输协议。
下面根据一个业务流程的例子,对相关的IVR业务过程和接口协议的四种方式的做一个详细的描述。
2、业务举例
考虑如下一个IVR节目流程,该节目在增值声讯业务平台上,利用电信运营商代收费方式,为电话用户进行SP有关业务的帐号的充值。
假设该节目的接入号为12345,一个主叫为057188880000的用户,拨打该节目号,进入语音IVR流程;在流程中,根据IVR的语音提示,用户输入自己的在SP处的充值帐号 10001,以及要充值的金额10元,这10元的消费费用将由电信运营商在计费月末向当前主叫话机057188880000的帐户进行收费。IVR流程收集完相关的信息后,首先会让用户再次确认,然后将这些信息组合为一个字符串,各信息字段之间用一个分隔符隔开,如$等,譬如约定生成的字符串格式为“操作代码$主叫号码$被叫$充值帐号$充值金额(分)$时间戳$”,那么这里组合成的字符串最后就是“10$057188880000$12345$10001$10000$20071115165500$”,一共是50个字符。
这里需要说明的是,IVR业务流程能够发送、接收和处理的数据信息,就是这些文本字符串,IVR能对这些字符串进行解析:如分解、组合和判断,但不能处理其他如二进制字节流等方式的数据结构。
至于如何组织这些具体信息字段,字段间究竟采用什么字符进行分隔,字符串定长还是不定长,这些属于业务流程的具体应用协议,是由SP流程开发人员和SP应用服务程序开发人员之间进行协商约定的。同样,对最终返回给IVR的结果信息字符串,也是由他们进行协商约定的。
通用网关是不关心这些业务格式信息的,通用网关和SP应用服务程序之间,需要约定的是通信连接方式,字符串是否加密,如何完整的发送和接收每次交互的信息包等。
二、协议描述
通用网关对外提供了四种方式的连接协议,分别是:短连接不加密的字符串传输方式,短连接根据密钥加密的传输方式,长连接不加密的字符串传输方式,以及长连接根据密钥加密传输协议。
1、直接传输字符串的包格式
对于不加密的字符串短连接传输协议方式,由于传输的数据以“\0”为结束符,控制简单,因此数据是直接传输的,传输的包为以”\0”结尾的字符串数据。
2、需要包头信息的包格式
对于其他三种方式,包括根据密钥加密的短连接传输协议、不加密的字符串长连接传输协议、根据密钥加密的长连接传输协议,都需要在数据之前加上包头通信控制信息。
数据包格式如下图所示,所包含的内容从左到右进行传输:
这里值得注意的是包头中的信息全部为网络字节顺序。
包头的各字段说明如下:
包头信息中,除了包体长度(length)以外,其他的字段,包括开始标识(head),版本信息(version),任务流水号(taskid),发送方标识1(sender),发送方标识2(sessionid),时间戳(timestamp),以及数据加密标识(flag),需要在响应包中原样返回;否则通用网关接收返回消息后,可能解析出错,最终导致IVR业务处理错误。
再次说明:包头中的字段信息全部为网络字节顺序;短连接不加密方式不需要包头信息。
3、不加密字符串的短连接传输协议
这种方式并发性好,开发实现起来简单,程序配置方便,容易排除错误,适合于安全性要求不高,或要求高安全性但通过专线网络连接的业务;除了在公网上开展小额支付的业务以外,其他的业务都建议采用这种方式。
对于这种方式,系统消息交互的过程,大概分如下几个步骤,见下图所示:
(1)、IVR流程中收集完用户的相关信息之后,发送一个字符串给通用网关,在上述的那个例子中,这个字符串是” 10$057188880000$12345$10001$1000$20071115165500$”;
(2)、通用网关收到IVR流程业务应用请求之后,向SP服务器程序启动一个连接(Connect)请求;
(3)、SP应用服务程序此时应处于监听(Listen)状态,监听到有客户端请求连接;
(4)、SP应用服务程序根据此连接请求的IP地址等信息进行身份验证,如果验证通过则接受(Accept)连接请求,双方建立一个Socket连接;
(5)、通用网关在连接建立之后,立即开始发送(Send)刚才从IVR处接收到字符串数据(包括最后的’\0’),发送的字节数为字符串自身的长度加1,即strlen(发送字符串)+1;在上述的例子中,这里是strlen(“10$057188880000$12345$10001$1000$20071115165500$”)+1=51;
(6)、SP应用服务程序接收(Recv)该业务字符串,然后根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理;譬如例子中,分解出操作码10为充值操作,分解主叫为057188880000,帐号为10001,充值金额为10元等,然后查询该帐号是否存在和帐号状态是否合法,如果满足条件后,对该卡进行充值等操作;
(7)、SP应用服务程序处理对应的业务后,把处理后的结果数据进行加工,组合成字符串,发送(Send)给通用网关,同样的,该字符串格式是事先和流程开发人员进行协商确定的;如在例子中,充值成功后,返回”11$2$10001$1000$”的字符串,表示充值10元失败,11是充值操作响应码,2表示卡号不存在,10001表示卡号,1000表示刚才要充值的金额,以分为单位;
(8)、通用网关接收到(Recv)返回业务数据后,主动关闭(Close)和SP服务器的这次Socket连接,将返回的字符串信息原封不动的发送给IVR;
(9)、IVR收到该返回字符串” 11$2$10001$1000$”,然后根据业务流程对之进行解析,做进一步的处理,譬如提示用户说,该帐户不存在等;
(10)、如果SP应用服务程序在5秒钟中时间内,没有返回处理结果,通用网关会自动断开该Socket连接,然后向IVR报告处理超时消息。
4、根据密钥加密的短连接传输协议
这种方式并发性好,安全性高,但实现起来相对较难,联调出现错误不容易排除。在公网上实现的并发性高的电子商务类交互业务,建议采用这种方式。
本方式采用DES加密,双方需要约定一个密钥(Key),目前约定密钥为长度额为8位的字符串,一般由SP服务器端来指定,提供给通用网关的维护人员,由维护人员在本地对通用网关进行配置。
在发送数据给对方之前,通信的双方根据本地配置的密钥对数据进行DES加密处理;在收到数据后,同样根据本地配置的密匙进行解密处理;通信连接方式上和上述第一种完全一样。
具体过程详细说明如下,如图所示:
(1)、IVR流程中收集完用户的相关信息之后,发送一个字符串给通用网关;在上述的那个例子中,这个字符串是”10$057188880000$12345$10001$1000$20071115165500$”;
(2)、通用网关收到IVR流程业务应用请求之后,根据配置的8位密钥(这里假设为” SuntekD6”)进行加密处理,得到加密后的字节流,假设为32f69fce6dca6ace576b08115c099975817e2b3b68f9eafd6ca55dfec83816739b7152375
e09872b31acb888b4f4b83e6aee7d1bb8c5c41a39(57字节的二进制字节流)存储在本地;
(3)、通用网关向SP服务器程序启动一个连接(Connect)请求;
(4)、SP应用服务程序此时应处于监听(Listen)状态,监听到有客户端请求连接;
(5)、SP应用服务程序根据此连接请求的IP地址等信息进行身份验证,如果验证通过则接受(Accept)连接请求,双方建立一个Socket连接;
(6)、通用网关在连接建立之后,根据刚才加密的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0038 2fd65329e2770074791503c2dab1d209fe0225636dd07f7277bd291209e1a498df28f7af2
f0eb4f1be2831f0fa8987b7f9;其中业务加密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86系列的PC,需要做主机到网络(ntohs)字节顺序转换;
(7)、SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
(8)、SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理;譬如例子中,分解出操作码10为充值操作,分解主叫为057188880000,帐号为10001,充值金额为10元等,然后查询该帐号是否存在和帐号状态是否合法,如果满足条件后,对该卡进行充值等操作;
(9)、SP应用服务程序处理对应的业务后,把处理后的结果数据进行加工,组合成字符串,同样,该字符串格式是事先和流程开发人员进行协商确定的;如在例子中,充值成功后,返回”11$2$10001$1000$”的字符串,表示充值10元失败,11是充值操作响应码,2表示卡号不存在,10001表示卡号,1000表示刚才要充值的金额,以分为单位;
(10)、SP应用服务程序在发送之前,同样根据密匙对该返回字符串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是返回加密字节流的长度,而且是网络字节的;
(11)、通用网关接收到(Recv)返回业务数据后,主动关闭(Close)和SP服务器的这次Socket连接,将返回的加密字节流进行解密处理之后,还原原有的信息字符串,发送给IVR;
(12)、IVR收到该返回字符串” 11$2$10001$1000$”,然后根据业务流程对之进行解析,做进一步的处理,譬如提示用户说,该帐户不存在等;
(13)、如果SP应用服务程序在5秒钟中时间内,没有返回处理结果,通用网关会自动断开该Socket连接,然后向IVR报告处理超时消息。
5、不加密的字符串长连接传输协议
这种方式可靠性高,能够保持持续的连接,但对于资源的消耗比较高,并发性不太好,调试跟踪不太方便,一般不建议采用这种方式。
具体过程详细说明如下,如图所示:
(1)、通用网关启动服务模块时向SP服务器程序启动一个连接(Connect)请求;
(2)、SP应用服务程序此时应处于监听(Listen)状态,监听到有客户端请求连接;
(3)、SP应用服务程序根据此连接请求的IP地址等信息进行身份验证,如果验证通过则接受(Accept)连接请求,双方建立一个Socket连接;
(4)、IVR流程中收集完用户的相关信息之后,发送一个字符串给通用网关;在上述的那个例子中,这个字符串是”10$057188880000$12345$10001$1000$20071115165500$”;
(5)、通用网关根据IVR流程发送的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0033 10$057188880000$12345$10001$1000$20071115165500$;发送的字节数为字符串自身的长度加1,即strlen(发送字符串)+1;在上述的例子中,这里是strlen(“10$057188880000$12345$10001$1000$20071115165500$”)+1=51,即0X33;
(6)、SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后得到业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
(7)、SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理;譬如例子中,分解出操作码10为充值操作,分解主叫为057188880000,帐号为10001,充值金额为10元等,然后查询该帐号是否存在和帐号状态是否合法,如果满足条件后,对该卡进行充值等操作;
(8)、SP应用服务程序处理对应的业务后,把处理后的结果数据进行加工,组合成字符串,同样,该字符串格式是事先和流程开发人员进行协商确定的;如在例子中,充值成功后,返回”11$2$10001$1000$”的字符串,表示充值10元失败,11是充值操作响应码,2表示卡号不存在,10001表示卡号,1000表示刚才要充值的金额,以分为单位;
(9)、SP应用服务程序然后对字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是是网络字节的;
(10)、通用网关接收到(Recv)返回业务数据后,将返回的字节流发送给IVR;
(11)、IVR收到该返回字符串” 11$2$10001$1000$”,然后根据业务流程对之进行解析,做进一步的处理,譬如提示用户说,该帐户不存在等;
(12)、如果SP应用服务程序在5秒钟中时间内,没有返回处理结果,通用网关会向IVR报告处理超时消息;
(13)、通用网关服务模块退出或停止的时候断开和SP应用服务器的连接。
6、根据密钥加密的长连接传输协议
这种方式可靠性高,安全性高,能够保持持续的连接,但对于资源的消耗比较高,并发性不太好,调试跟踪不太方便,一般不建议采用这种方式。
本方式采用DES加密,双方需要约定一个密钥(Key),目前约定密钥为长度额为8位的字符串,一般由SP服务器端来指定,提供给通用网关的维护人员,由维护人员在本地对通用网关进行配置。
在发送数据给对方之前,通信的双方根据本地配置的密钥对数据进行DES加密处理;在收到数据后,同样根据本地配置的密匙进行解密处理;通信连接方式上和上述第三种完全一样。
具体过程详细说明如下,如图所示:
(1)、通用网关启动服务模块时向SP服务器程序启动一个连接(Connect)请求;
(2)、SP应用服务程序此时应处于监听(Listen)状态,监听到有客户端请求连接;
(3)、SP应用服务程序根据此连接请求的IP地址等信息进行身份验证,如果验证通过则接受(Accept)连接请求,双方建立一个Socket连接;
(4)、IVR流程中收集完用户的相关信息之后,发送一个字符串给通用网关;在上述的那个例子中,这个字符串是”10$057188880000$12345$10001$1000$20071115165500$”;
(5)、通用网关收到IVR流程业务应用请求之后,根据配置的8位密钥(这里假设为” SuntekD6”)进行加密处理,得到加密后的字节流,假设为32f69fce6dca6ace576b08115c099975817e2b3b68f9eafd6ca55dfe(56字节的二进制字节流)存储在本地;
(6)、通用网关在连接建立之后,根据刚才加密的字节流,加上信息包头,组合成信息包,然后发送(Send)信息包,发送的字节数为加密后的字节流字节数+24(24信息包头的字节长度);在上述的例子中,信息包大约如ffff0200 00001100 00004e5f 00114b3f 00000000 0100 0038 2fd65329e2770074791503c2dab1d209fe0225636dd07f7277bd291209e1a498df28f7af
2f0eb4f1be2831f0fa8987b7f9;其中业务加密字节流的长度这里是56,体现在网络字节中是0x0038,如果是x86系列的PC,需要做主机到网络(ntohs)字节顺序转换;
(7)、SP应用服务程序接收(Recv)该信息包,根据包头信息截取对应的字节流,然后进行解密处理,得到加密前的业务字符串,另外还需要把其他的包头标识、两个包头保留字,存储在本地;
(8)、SP应用服务程序根据流程开发人员与之协商好的格式对接收的字符串进行解析,然后进行响应的处理;譬如例子中,分解出操作码10为充值操作,分解主叫为057188880000,帐号为10001,充值金额为10元等,然后查询该帐号是否存在和帐号状态是否合法,如果满足条件后,对该卡进行充值等操作;
(9)、SP应用服务程序处理对应的业务后,把处理后的结果数据进行加工,组合成字符串,同样,该字符串格式是事先和流程开发人员进行协商确定的;如在例子中,充值成功后,返回”11$2$10001$1000$”的字符串,表示充值10元失败,11是充值操作响应码,2表示卡号不存在,10001表示卡号,1000表示刚才要充值的金额,以分为单位;
(10)、SP应用服务程序在发送之前,同样根据密匙对该返回字符串进行加密处理,然后对加密字节流长度进行计算,加上刚才发送过来的包头标识和版本号以及保留字等,组合成信息包;注意这时,字节流的长度是返回加密字节流的长度,而且是网络字节的;
(11)、通用网关接收到(Recv)返回业务数据后,主动关闭(Close)和SP服务器的这次Socket连接,将返回的加密字节流进行解密处理之后,还原原有的信息字符串,发送给IVR;
(12)、IVR收到该返回字符串” 11$2$10001$1000$”,然后根据业务流程对之进行解析,做进一步的处理,譬如提示用户说,该帐户不存在等;
(13)、如果SP应用服务程序在5秒钟中时间内,没有返回处理结果,通用网关会向IVR报告处理超时消息。
(14)、通用网关服务模块退出或停止的时候断开和SP应用服务器的连接。