XML的数据协议组成

名词

说明

md5

message-digest algorithm 5

http

hypertext transfer protocol

xml

extensible markup language

交易交互是以http协议作为数据传输协议,这里定义发起交易请求的一端为客户端,客户端需要以http post 数据流(非表单方式)的方式提交交易请求,如下所示:

假设有一个查询指定玩法可销售期信息的交易请求,那么http消息体的内容如下:

  1. <?xml version=”1.0 encoding=”utf-8”?>
  2.  
  3. <message version="1.0">
  4.  
  5. <header>
  6.  
  7. <messengerid>20091113101533000001</messengerid>
  8.  
  9. <timestamp>20091113101533</timestamp>
  10.  
  11. <transactiontype>12002</transactiontype>
  12.  
  13. <digest>7ec8582632678032d25866bd4bce114f</digest>
  14.  
  15. <agenterid>889931</agenterid>
  16.  
  17. <source>ivr</source>
  18.  
  19. <username>张三</username>
  20.  
  21. <compress>DES</compress>
  22.  
  23. </header>
  24.  
  25. <body>
  26.  
  27. <elements>
  28.  
  29. <element>
  30.  
  31. <lotteryid>118</lotteryid>
  32.  
  33. <issues>1</issues>
  34.  
  35. </element>
  36.  
  37. </elements>
  38.  
  39. </body>
  40.  
  41. </message>

注:实际http传输中,对内容进行编码,编码字符集utf-8(这主要是考虑到AJAX传输过程是以UTF-8编码)。

开发过程中会遇到这种情况,明明已经发送数据到服务器了,可是服务器收不到数据,遇到这种问题时的处理办法是,查看一下发送程序代码,是否进行了如下设置:

‘content-type’, ‘application/x-www-form-urlencoded’

如果有,去除,或者修改成:

‘content-type’,‘text/xml charset=utf-8'

1.0、消息包

每一个请求/响应的消息包都是一个xml,包含消息头和消息体,对于不同类型的请求/响应,消息头的格式是相同的,而消息体会携带具体的类型的请求/响应信息。请参照下面的消息包格式定义。

  1. <?xml version=”1.0 encoding=”utf-8”?>
  2.  
  3. <message version="1.0">
  4.  
  5. <header>
  6.  
  7. <messengerid>200911131015330000000001</messengerid>
  8.  
  9. <timestamp>20091113101533</timestamp>
  10.  
  11. <transactiontype>102</transactiontype>
  12.  
  13. <username>张三</username>
  14.  
  15. <digest>7ec8582632678032d25866bd4bce114f</digest>
  16.  
  17. <agenterid>800001</agenterid>
  18.  
  19. </header>
  20.  
  21. <body>
  22.  
  23. <elements>
  24.  
  25. <element>
  26.  
  27. < lotteryname >D11</lotteryname>
  28.  
  29. <issue>2009111301</issue>
  30.  
  31. </element>
  32.  
  33. </elements>
  34.  
  35. </body>
  36.  
  37. </message>

整个消息包是一个xml字符串,首先声明xml的版本和编码,这里定义encoding为utf-8。在消息包元素message中声明了version属性,表示该消息包使用的数据通信协议的版本,当前为1.0

1.1消息头

消息头对于所有的交易请求以及对每个交易请求的请求/响应都具有同样的数据结构。请参照下面的消息体格式定义。

在后面对交易请求消息体的描述中不再重复说明消息头的结构。

 

  1. <header>
  2.  
  3. <messengerid>20091113101533000001</messengerid>
  4.  
  5. <timestamp>20091113101533</timestamp>
  6.  
  7. <transactiontype>102</transactiontype>
  8.  
  9. <digest>7ec8582632678032d25866bd4bce114f</digest>
  10.  
  11. <agenterid>800001</agenterid>
  12.  
  13. <username>张三</username>
  14.  
  15. <source>ivr</source>
  16.  
  17. <ipaddress>33.22.11.22</ipaddress >
  18.  
  19. <compress>DES</compress>加密用的标签:使用什么方式加密(DES)
  20.  
  21. </header>

header 元素定义了消息头的数据结构,其中:

名称

类型

长度

描述

messengerid

String

20

消息编号,格式为

yyyymmddhh24miss+六位递增序号。注:在非大客户模式下,可以为空。

timestamp

String

14

格式为:yyyymmddhh24miss或者yyyy-mm-dd hh24:mi:ss

transactiontype

String

3

交易类型,详见附件

agenteridid

String

6

代理编号

username

String

<16

用户账号

digest

String

32

对消息包的摘要,摘要算法为md5,摘要内容为(时间戳+代理密码+消息体)

source

String

16<=

用户操作终端来源,如:ivr,sms,web等。

ipaddressaddress

String

20<=

对于digest部分,表中已经定义了需要对消息体的哪些部分进行摘要,这里需要进行更进一步的说明,其中:

l  代理商密码:彩票支撑系统会为每个投注代理商分配一个交易访问密码,这个密码不会在消息中直接传输。无论是投注代理商向彩票支撑系统发送消息还是彩票支撑系统向某个代理发送消息,都会使用投注代理商的密码来执行摘要。

l  消息体: 消息包中body元素部分,包含<body>与</body>。

假如一个数据包的格式如下:

  1. <?xml version='1.0' encoding='utf-8' ?>
  2.  
  3. <message version="1.0">
  4.  
  5. <header>
  6.  
  7. <messengerid>200911131015330000000001</messengerid>
  8.  
  9. <timestamp>20091113101533</timestamp>
  10.  
  11. <transactiontype>12002</transactiontype>
  12.  
  13. <digest>7ec8582632678032d25866bd4bce114f</digest>
  14.  
  15. <compress>DES</compress>
  16.  
  17. <agenterid>800001</agenterid>
  18.  
  19. </header>
  20.  
  21. <body>
  22.  
  23. <oelement>
  24.  
  25. <errorcode>0</errorcode>
  26.  
  27. <errormsg>操作成功</errormsg>
  28.  
  29. </oelement>
  30.  
  31. <elements>
  32.  
  33. <element>
  34.  
  35. <lotteryid>118</lotteryid>
  36.  
  37. <lotteryname>双色球</lotteryname>
  38.  
  39. <issue>2012070</issue>
  40.  
  41. <lasttime>86400</lasttime>
  42.  
  43. </element>
  44.  
  45. </elements>
  46.  
  47. </body>
  48.  
  49. </message>
  50.  
  51. <?xml version="1.0" encoding="utf-8"?>
  52.  
  53. <message version="1.0">
  54.  
  55. <header>
  56.  
  57. <messengerid>20091113101533000001</messengerid>
  58.  
  59. <timestamp>20091113101533</timestamp>
  60.  
  61. <transactiontype>12002</transactiontype>
  62.  
  63. <digest>041a1f10e7cd9fe5531a61f8bdef5faa</digest>
  64.  
  65. <compress>DES</compress>
  66.  
  67. <agenterid>1000002</agenterid>
  68.  
  69. </header>
  70.  
  71. <body>HmtGfqfbbCvzJvIvv+HjhHmbzgj+JRAutc2wOfw9+rsKAEKJX79jf2chPUk9XZTaMYphue6K/FeOZ3BNFjdnPsPvvL/1/vA75iGWiU8zKDYa9/jKDwz3Rbe1X6m3hamZPMLXz7FSXnD/Ur/BTZqfmta+0yJuMPGcWQEFjVnO/10amdeXoQDJDjP9gmOWb7r7WiMcXRYTSTmH1F8a5a1tVXQnK6WU4fmDkCU1Yq+RAowxwAH9VzvZiOP8ISyCGHpYPCADWcvpE5RtH0Le674kW29XIisxTJvcVhuDDamnMa0=
  72.  
  73. </body>
  74.  
  75. </message>

那么,被摘要的字串应该是(假设投注代理商的密码为111111)

111111<body><oelement><errorcode>0</errorcode><errormsg>操作成功</errormsg></oelement><elements><element><lotteryid>D11</lotteryid><issue>2009111301</issue></element></elements></body>

被摘要的body元素部分应该保留消息字串中的所有格式信息,比如空格,回车符等。

 

1.2 协议中协议头使用说明

协议头中包含一些通用的信息,对于系统中不同的环节,有些协议字段可以不填,有些协议字段需要在应用服务器端填写后,发送到无纸化平台。

  1. <header>
  2.  
  3. <messengerid>200911131015330000000001</messengerid>
  4.  
  5. <timestamp>20091113101533</timestamp>
  6.  
  7. <transactiontype>102</transactiontype>
  8.  
  9. <digest>7ec8582632678032d25866bd4bce114f</digest>
  10.  
  11. <agenterid>800001</agenterid>
  12.  
  13. </header>

 

对于:flash,ajax + js等客户端模式下,messengerid,digestagenteridusername等字段是不需要填写的。这些信息可以在服务端由具体的服务平台进行被充填写。因为有些安全信息,是不能在用户的电脑上执行的。

附录A:DES数据加密

为了数据的安全,XML协议在传输过程中,可以使用加密处理。

1、  数据按照PKCS5规则进行补位.(缺7位补7个0x07,缺6位则补6个0x06,以次类推,如果正好8位,也需要补8个0x08)。

2、  实际加密模式选择DES-ECB。

3、  经过DES加密后的数据必须通过Base64编码转换为明文的字符串。

在XML约定协议的header部分中,增加一个标签compress,如:<compress>DES</compress>,DES标明为加密的类型,如下:

  1. <?xml version=”1.0 encoding=”utf-8”?>
  2.  
  3. <message version="1.0">
  4.  
  5. <header>
  6.  
  7. <messengerid>200911131015330000000001</messengerid>
  8.  
  9. <timestamp>20091113101533</timestamp>
  10.  
  11. <transactiontype>102</transactiontype>
  12.  
  13. <digest>7ec8582632678032d25866bd4bce114f</digest>
  14.  
  15. <agenterid>800001</agenterid>
  16.  
  17. </header>
  18.  
  19. <body>
  20.  
  21. <oelement>
  22.  
  23. <errorcode>0</errorcode>
  24.  
  25. <errormsg>操作成功</ errormsg >
  26.  
  27. </oelement>
  28.  
  29. <elements>
  30.  
  31. <element>
  32.  
  33. <lotteryid>d11</lotteryid>
  34.  
  35. <issue>2009111301</issue>
  36.  
  37. </element>
  38.  
  39. </elements>
  40.  
  41. </body>
  42.  
  43. </message>
  44.  
  45. 需要DES加密的数据:
  46.  
  47. <oelement>
  48.  
  49. <errorcode>0</errorcode>
  50.  
  51. <errormsg>操作成功</ errormsg >
  52.  
  53. </oelement>
  54.  
  55. <elements>
  56.  
  57. <element>
  58.  
  59. <lotteryid>d11</lotteryid>
  60.  
  61. <issue>2009111301</issue>
  62.  
  63. </element>
  64.  
  65. </elements>
  66.  
  67. 加密后提交的数据包:
  68.  
  69. <?xml version=”1.0 encoding=”utf-8”?>
  70.  
  71. <message version="1.0">
  72.  
  73. <header>
  74.  
  75. <messengerid>200911131015330000000001</messengerid>
  76.  
  77. <timestamp>20091113101533</timestamp>
  78.  
  79. <transactiontype>102</transactiontype>
  80.  
  81. <digest>7ec8582632678032d25866bd4bce114f</digest>
  82.  
  83. <agenterid>800001</agenterid>
  84.  
  85. <compress>DES</compress>
  86.  
  87. </header>
  88.  
  89. <body>
  90.  
  91. =xxxxdafdfdsafsa==
  92.  
  93. </body>
  94.  
  95. </message>

附录B:数据DES加密与MD5的双重性问题。

MD5是在DES加密前进行的,MD5签名使用的密钥是用的渠道的密钥,DES加密数据使用的密钥是当前用户的密码明文经过MD5处理后,生成的长度为32字节的十六进制字符串的前16个字符。

比如:一用户的密码明文为:1234567890,经过MD5处理后,则数据转成为:e807f1fcf82d132f9bb018ca6738a19f,则进行DES加密数据时,密钥为:e0fff2129b1c63a9。

附录C:GZIP压缩传输

手机客户端与中间件接口传输与接收数据,均需要进行GZIP压缩传输,减少数据库传输流量。

 

ios开发——实用技术篇&XML协议详解的更多相关文章

  1. iOS开发--常用技巧 (MJRefresh详解)

         iOS开发--常用技巧 (MJRefresh详解) https://github.com/CoderMJLee/MJRefresh 下拉刷新01-默认 self.tableView.head ...

  2. iOS开发——多线程OC篇&多线程详解

    多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念 ...

  3. iOS开发——屏幕适配篇&Masonry详解

    Masonry详解 前言 MagicNumber -> autoresizingMask -> autolayout 以上是纯手写代码所经历的关于页面布局的三个时期 在iphone1-ip ...

  4. iOS开发——实用技术OC篇&事件处理详解

    事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic ...

  5. ios开发——实用技术篇&Pist转模型详细介绍

    Pist转模型详细介绍 关于Plist转模型在iOS开发中是非常常见的,每开一一个项目或者实现一个功能都要用到它,所以今天就给大家讲讲Plist怎么转成模型数据, 前提:必须有一个Plist文件或者通 ...

  6. iOS开发——UI篇OC&transform详解

    transframe属性详解 1. transform属性 在OC中,通过transform属性可以修改对象的平移.缩放比例和旋转角度 常用的创建transform结构体方法分两大类 (1) 创建“基 ...

  7. ios开发——实战OC篇&FMDB详解

    FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...

  8. ios开发——实用技术篇&网络音频播放

    网络音频播放 在日常的iOS开发中,我们通常会遇到媒体播放的问题,XCode中已经为我们提供了功能非常强大的AVFoundation框架和 MediaPlayer框架.其中AVFoundation框架 ...

  9. iOS开发中UIPopoverController的使用详解

    这篇文章主要介绍了iOS开发中UIPopoverController的使用,代码基于传统的Objective-C,需要的朋友可以参考下 一.简单介绍 1.什么是UIPopoverController ...

随机推荐

  1. [irving] C# Windows Beep 调用声音文件

    方法一:Console.Beep(); 方法二:可以用Console.WriteLine("/a");来代替Beep(). MSDN:http://msdn.microsoft.c ...

  2. C语言中 v...printf类函数的用法

    C语言的自学渐渐接近尾声,今天学到了标准库中的stdarg.h头,里面关联了stdio.h头里面的一类函数:v...printf函数,里面举的例子看了之后还是不太明白,google了一下依旧不是很懂, ...

  3. C/C++:类模板

    类模板就是为类声明一种模板,使得类中的某些数据成员,或某些成员函数的参数,又或者是某些成员函数的返回值可以取任意的数据类型,包括基本数据类型和自定义数据类型. 类模板的声明形式如下: template ...

  4. 初识HTML 5:关于它的三个三

    来源:http://www.ido321.com/949.html 一.HTML 5受欢迎的三个理由 1.IE.Google.Firefox.Safari.Opera等主流浏览器的支持 1.1  微软 ...

  5. PHP中的替代语法

    今天看了一下wordpress的代码,里面有些少见的php替代语法, <?php else : ?> <div class="entry-content"> ...

  6. jQuery Mobile入门教程

    简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的.可跨设备的Web应用程序.我们将后续的介绍中向大家介绍大量的代码及实例. jQuery一直以来都是非常流行的富客户端及Web应用程 ...

  7. bzoj 1576 [Usaco2009 Jan]安全路经Travel(树链剖分,线段树)

    [题意] 给定一个无向图,找到1-i所有的次短路经,要求与最短路径的最后一条边不重叠. [思路] 首先用dijkstra算法构造以1为根的最短路树. 将一条无向边看作两条有向边,考察一条不在最短路树上 ...

  8. Install_ruby

    Install rvm 1 2 3 $ curl -L get.rvm.io | bash -s stable $ source ~/.bashrc $ source ~/.bash_profile ...

  9. Windows7 32位下opencv与python2.66的环境配置

    刚接触Python和OpenCV,对两者都不太了解,因为今后学习会使用到这两种工具,特此学习配置.PS:本帖适用小白. 一. 需要的文件 1. OpenCV 可用OpenCV-2.3.1-win-su ...

  10. 安卓升级提示 phoneGap APK软件更新提示

    以下代码由PHP200 阿杜整理 package com.example.syzx;   import java.io.BufferedReader; import java.io.File; imp ...