经常在论坛上看到不少网友求助关于动网整合的相关问题,建议大家好好去看下PDO通行接口开发人员参考规范1.0。
整合其实并非是一件难事,其实你只要从真正意义上去了解它之后,你就会知道解决论坛整合问题并非是件很难的事。
一、数据同步原理
假设A、B两个系统要实现会员数据同步,同步过程是这样的:当A系统要注册(登录/注销/资料修改/删除用户)时,就发一条消息告诉B系统说,我要注册(登录/注销/资料修改/删除用户)了,B系统收到消息后在其系统内进行注册(登录/注销/资料修改/删除用户),完成后返回一条消息告诉A系统执行的结果(成功/失败),如果成功,A系统继续在其系统内进行注册(登录/注销/资料修改/删除用户)操作,如果失败则中止本次操作,反之亦然。
1.数据格式
现在我们引进两个词语:请求和响应,对于上述过程中发出消息我们称它为请求,返回消息我们称它为响应。对于请求和响应的数据格式,PDO是有规定的,它应是一个构造良好的xml文档。标准的请求和响应数据格式如下:
- <?xml version="1.0" encoding="gb2312"?>
- <root>
- <appid>程序标识</appid>
- <action>请求类型(用户名检测/注册/登录/注销/资料修改/删除用户)</action>
- <syskey>安全码</syskey>
- <username>用户名</username>
- <可选元素列表 />
- </root>
- <?xml version="1.0" encoding="gb2312"?>
- <root>
- <appid>程序标识</appid>
- <status>请求结果</status>
- <needcookie>是否需要写cookie</needcookie>
- <body>
- <message>操作不成功时的错误说明</message>
- <可选元素列表 />
- </body>
- </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文档并发送和获取响应值,下边是修改资料的请求:
- '-----------------------------------------------------------------
- '系统整合:更新资料(update)
- '-----------------------------------------------------------------
- Dim DvApi_Obj,DvApi_SaveCookie,SysKey
- If DvApi_Enable Then
- Set DvApi_Obj = New DvApi
- DvApi_Obj.NodeValue "syskey",SysKey,0,False
- DvApi_Obj.NodeValue "action","update",0,False
- DvApi_Obj.NodeValue "username",txtUserName,1,False
- Md5OLD = 1
- SysKey = Md5(DvApi_Obj.XmlNode("username")&DvApi_SysKey,16)
- Md5OLD = 0
- DvApi_Obj.NodeValue "syskey",SysKey,0,False
- DvApi_Obj.NodeValue "password",txtUserPass,1,False
- DvApi_Obj.NodeValue "email",txtEmail,1,False
- DvApi_Obj.NodeValue "answer",txtQuestion,1,False
- DvApi_Obj.NodeValue "question",txtAnswer,1,False
- DvApi_Obj.SendHttpData
- If DvApi_Obj.Status = "1" Then
- Response.write("<script>alert(""" & DvApi_Obj.Message & """);history.go(-1);</script>")
- Response.End()
- End If
- Set DvApi_Obj = Nothing
- End If
- '-----------------------------------------------------------------
和请求相关的文件还有:dv_dpo\api_user.xml(XML模板)和dv_dpo\Api_Config.asp(接口配置文件)。
对于所有的请求(响应)动网都集中在一个文件中进行处理:dv_dpo.asp,该文件的结构为:
- <%
- If Request.QueryString<>"" Then
- '处理登录和注销请求,参数以调用外部JS的方式发送(A)
- Else
- Set XmlDoc = Server.CreateObject("msxml2.FreeThreadedDOMDocument" & MsxmlVersion)
- XmlDoc.ASYNC = False
- If Not XmlDoc.LOAD(Request) Then
- Status = 1
- Messenge = "数据非法,操作中止!"
- appid = "未知"
- Else
- If CheckPost() Then
- Select Case Act
- Case "checkname"
- '处理用户名检测请求
- Case "reguser"
- '处理注册请求
- Case "login"
- '处理登录请求(B)
- Case "logout"
- '处理注销请求(C)
- Case "update"
- '处理更新请求
- Case "delete"
- '处理删除用户请求
- End Select
- End If
- End If
- ReponseData()'生成响应XML文档
- Set XmlDoc = Nothing
- End If
- %>
三、准备工作和实现
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/3113.html
四、注意事项
问:为什么在登录和注销时不能使用Response.Redirect进行跳转?
答:在登录和注销成功时需构造一个script脚本输出到页面进行真正的登录或注销,如果使用Response.Redirect会导致script不能输出到页面,结果就是当前系统能成功登录或注销,其他系统却不行,也没报错。
问:整合的系统数目多少个最合适?
答:2个。假设我们按要求成功的整合了A、B、C三个系统,现在A中开始注册,A就要向B和C两个系统发送请求说要注册,假设B系统是正常的并注册成功了(用户信息写入B数据库中),再假设C系统突然出问题了不能成功注册,那么返回的值就是失败的(Status = "1"),结果是A系统也不再继续注册了,但B系统中新加的用户信息却是不能撤销的!当整合的系统数不小于3时都可能出现上述的问题,所以整合数目为2是最佳的!
问:生成请求XML文档的节点时,DvApi_Obj.NodeValue "username",username,1,False和DvApi_Obj.NodeValue "username",username,0,False有什么区别?
答:没有区别。当用1时生成的节点为"<username><![CDATA[admin]]></username>",当用0时生成的节点为"<username>admin</username>"。也就是说,当节点的内容比较多时,最好采用1,比较少时采用0,结果都能被正常获取的!
五、事例过程中常见错误
1.提示"请求数据错误"
答:检查配置文件Api_Config.asp中接口文件地址是否正确(DvApi_Urls的值)!
2.提示"默认非法请求"
答:出于安全考虑,系统密钥的值不能采用默认的"API_TEST"或"Syskey",请检查配置文件Api_Config.asp中DvApi_SysKey的值。
3.提示"请求数据验证不通过,请与管理员联系"
答:各系统MD5加密的结果不一样,可先从位数上检查(MD5有16位和32位加密),再检查各系统MD5函数对同一字符串加密的结果是否相同(有一次我就发现竟然不同的:(),最后再检查下是否由于大小写的原因。
4.没有出错,但一个系统能操作(登录/注销)成功,其他系统都没操作成功(没同步)
答:检查构造script脚本是否有输出到页面上,即第四节注意事项第1问的内容。
注:先按照信息分类网中整合的说明进行设置,如果不行再按上面设置进行操作。