一、数据同步原理
假设A、B两个系统要实现会员数据同步,同步过程是这样的:当A系统要注册(登录/注销/资料修改/删除用户)时,就发一条消息告诉B系统说,我要注册(登录/注销/资料修改/删除用户)了,B系统收到消息后在其系统内进行注册(登录/注销/资料修改/删除用户),完成后返回一条消息告诉A系统执行的结果(成功/失败),如果成功,A系统继续在其系统内进行注册(登录/注销/资料修改/删除用户)操作,如果失败则中止本次操作,反之亦然。
1.数据格式
现在我们引进两个词语:请求和响应,对于上述过程中发出消息我们称它为请求,返回消息我们称它为响应。对于请求和响应的数据格式,PDO是有规定的,它应是一个构造良好的xml文档。标准的请求和响应数据格式如下:
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < root >
3 < appid > 程序标识 </ appid >
4 < action > 请求类型(用户名检测/注册/登录/注销/资料修改/删除用户) </ action >
5 < syskey > 安全码 </ syskey >
6 < username > 用户名 </ username >
7 < 可选元素列表 />
8 </ root >
2 < root >
3 < appid > 程序标识 </ appid >
4 < action > 请求类型(用户名检测/注册/登录/注销/资料修改/删除用户) </ action >
5 < syskey > 安全码 </ syskey >
6 < username > 用户名 </ username >
7 < 可选元素列表 />
8 </ root >
1
<?
xml version="1.0" encoding="gb2312"
?>
2 < root >
3 < appid > 程序标识 </ appid >
4 < status > 请求结果 </ status >
5 < needcookie > 是否需要写cookie </ needcookie >
6 < body >
7 < message > 操作不成功时的错误说明 </ message >
8 < 可选元素列表 />
9 </ body >
10 </ root >
2 < root >
3 < appid > 程序标识 </ appid >
4 < status > 请求结果 </ status >
5 < needcookie > 是否需要写cookie </ needcookie >
6 < body >
7 < message > 操作不成功时的错误说明 </ message >
8 < 可选元素列表 />
9 </ body >
10 </ root >
在请求的XML文档中有些节点是必需的,有些节点是可选的,必需的节点总结如下:
1.注册(reguser):appid,action,syskey,username,password,email,question,answer
2.登录(login):appid,action,syskey,username
3.注销(logout):appid,action,syskey,username
4.资料修改(update):appid,action,syskey,username
5.删除用户(delete):appid,action,syskey,username
6.注册时检测用户名是否可用(checkname):appid,action,syskey,username
在响应的XML文档中有三个节点是必需的:appid,status,message
2.数据如何传递?
对于请求,将使用XMLHttpRequest对象的Send方法以post方式发送,然后再从XMLHttpRequest对象的responseXML属性中获取响应数据。
3.接口安全码
接口安全码(syskey节点)是用来检验程序间传输的数据来源合法性的依据,它的值是由username节点的值和各程序接口配置文件中用户定义的密钥连接起来,再进行16位MD5加密得出一个定长32字节的字符串。
二、动网实现PDO1.0
从第一节的原理中我们可以知道,要支持数据同步,那么每个系统中都必须有请求和响应的程序,这样才能向其他系统发出请求和响应其他系统发出的请求。
对于请求,动网中包含有一个类DvApi,它位于dv_dpo"Cls_DvApi.asp,在各种请求中都使用该类生成请求的XML文档并发送和获取响应值,下边是修改资料的请求:
1
'
-----------------------------------------------------------------
2 ' 系统整合:更新资料(update)
3 ' -----------------------------------------------------------------
4 Dim DvApi_Obj,DvApi_SaveCookie,SysKey
5 If DvApi_Enable Then
6 Set DvApi_Obj = New DvApi
7 DvApi_Obj.NodeValue " syskey " ,SysKey, 0 , False
8 DvApi_Obj.NodeValue " action " , " update " , 0 , False
9 DvApi_Obj.NodeValue " username " ,txtUserName, 1 , False
10 Md5OLD = 1
11 SysKey = Md5(DvApi_Obj.XmlNode( " username " ) & DvApi_SysKey, 16 )
12 Md5OLD = 0
13 DvApi_Obj.NodeValue " syskey " ,SysKey, 0 , False
14 DvApi_Obj.NodeValue " password " ,txtUserPass, 1 , False
15 DvApi_Obj.NodeValue " email " ,txtEmail, 1 , False
16 DvApi_Obj.NodeValue " answer " ,txtQuestion, 1 , False
17 DvApi_Obj.NodeValue " question " ,txtAnswer, 1 , False
18 DvApi_Obj.SendHttpData
19 If DvApi_Obj.Status = " 1 " Then
20 Response.write( " <script>alert("" " & DvApi_Obj.Message & " "");history.go(-1);</script> " )
21 Response.End()
22 End If
23 Set DvApi_Obj = Nothing
24 End If
25 ' -----------------------------------------------------------------
2 ' 系统整合:更新资料(update)
3 ' -----------------------------------------------------------------
4 Dim DvApi_Obj,DvApi_SaveCookie,SysKey
5 If DvApi_Enable Then
6 Set DvApi_Obj = New DvApi
7 DvApi_Obj.NodeValue " syskey " ,SysKey, 0 , False
8 DvApi_Obj.NodeValue " action " , " update " , 0 , False
9 DvApi_Obj.NodeValue " username " ,txtUserName, 1 , False
10 Md5OLD = 1
11 SysKey = Md5(DvApi_Obj.XmlNode( " username " ) & DvApi_SysKey, 16 )
12 Md5OLD = 0
13 DvApi_Obj.NodeValue " syskey " ,SysKey, 0 , False
14 DvApi_Obj.NodeValue " password " ,txtUserPass, 1 , False
15 DvApi_Obj.NodeValue " email " ,txtEmail, 1 , False
16 DvApi_Obj.NodeValue " answer " ,txtQuestion, 1 , False
17 DvApi_Obj.NodeValue " question " ,txtAnswer, 1 , False
18 DvApi_Obj.SendHttpData
19 If DvApi_Obj.Status = " 1 " Then
20 Response.write( " <script>alert("" " & DvApi_Obj.Message & " "");history.go(-1);</script> " )
21 Response.End()
22 End If
23 Set DvApi_Obj = Nothing
24 End If
25 ' -----------------------------------------------------------------
和请求相关的文件还有:dv_dpo"api_user.xml(XML模板)和dv_dpo"Api_Config.asp(接口配置文件)。
对于所有的请求(响应)动网都集中在一个文件中进行处理:dv_dpo.asp,该文件的结构为:
1
<
%
2 If Request.QueryString <> "" Then
3 ' 处理登录和注销请求,参数以调用外部JS的方式发送(A)
4 Else
5 Set XmlDoc = Server.CreateObject( " msxml2.FreeThreadedDOMDocument " & MsxmlVersion)
6 XmlDoc.ASYNC = False
7 If Not XmlDoc.LOAD(Request) Then
8 Status = 1
9 Messenge = " 数据非法,操作中止! "
10 appid = " 未知 "
11 Else
12 If CheckPost() Then
13 Select Case Act
14 Case " checkname "
15 ' 处理用户名检测请求
16 Case " reguser "
17 ' 处理注册请求
18 Case " login "
19 ' 处理登录请求(B)
20 Case " logout "
21 ' 处理注销请求(C)
22 Case " update "
23 ' 处理更新请求
24 Case " delete "
25 ' 处理删除用户请求
26 End Select
27 End If
28 End If
29 ReponseData() ' 生成响应XML文档
30 Set XmlDoc = Nothing
31 End If
32 % >
2 If Request.QueryString <> "" Then
3 ' 处理登录和注销请求,参数以调用外部JS的方式发送(A)
4 Else
5 Set XmlDoc = Server.CreateObject( " msxml2.FreeThreadedDOMDocument " & MsxmlVersion)
6 XmlDoc.ASYNC = False
7 If Not XmlDoc.LOAD(Request) Then
8 Status = 1
9 Messenge = " 数据非法,操作中止! "
10 appid = " 未知 "
11 Else
12 If CheckPost() Then
13 Select Case Act
14 Case " checkname "
15 ' 处理用户名检测请求
16 Case " reguser "
17 ' 处理注册请求
18 Case " login "
19 ' 处理登录请求(B)
20 Case " logout "
21 ' 处理注销请求(C)
22 Case " update "
23 ' 处理更新请求
24 Case " delete "
25 ' 处理删除用户请求
26 End Select
27 End If
28 End If
29 ReponseData() ' 生成响应XML文档
30 Set XmlDoc = Nothing
31 End If
32 % >
通常情况下B、C直接返回status=0(成功)即可,真正的登录和注销操作应在A处,之所以这样主要是由于XMLHttpRequest对象与服务器的会话方式决定的(见参考文章)。
三、准备工作和实现
1.下载动网8.0/8.1版,解压到站点bbs文件内;
8.0版下载: http://down.dvbbs.net/new_Softview/SoftView_5421.asp
8.1版下载: http://forum.dvbbs.net/download/dvbbs8.1.0_ac.exe
2.将动网dv_dpo文件夹和dv_dpo.asp文件夹复制到站点根目录中,并进行以下修改:
① Cls_DvApi.asp:
a. 修改AppID的值
b. 全部Dvbbs.iCreateObject改为Server.CreateObject
② Api_Config.asp:
a. 修改DvApi_SysKey的值,不能用默认的"API_TEST"
③ dv_dpo.asp:
a. 修改XmlDoc.documentElement.selectSingleNode("appid").text的值,一般是和Cls_DvApi.asp中的AppID相同的值。
3.参照动网修改站点注册/登录/注销/资料修改/删除用户相关文件和dv_dpo.asp文件,使其支持系统整合。下边提供一个我已经整合好的一个会员系统,代码不多,应该能看明白: 点击下载
4.设置接口配置文件(Api_Config.asp)中相关文件完成整合。
注:如若是整合动网,动易,oblog三系统可用动易小李刀刀的API整合专用用户数据同步工具,下载地址: http://www.powereasy.net/Soft/PE_Plus/210.html
四、参考文章
1.PDO通行接口开发人员参考规范1.0: http://www.mzwu.com/pic/20070817/pdo.htm
2.解读动网、Oblog、动易三方制订的PDO通行接口: http://www.mzwu.com/article.asp?id=1035
3.说说serverXMLHTTP对象与服务器的会话方式: http://www.mzwu.com/article.asp?id=1039