在网上参考了很多资料后,终于完美实现了网站和discuz!nt论坛的双向整合,整合后网站和论坛之间可以同步注册、登录、退出和修改登录密码操作。 本系统的实现形式是新云CMS网站(ASP)和Discuz!NT3.1论坛(ASP.NET)的同步,使用的API(应用程序编程接口)是新云CMS提供的api(做较大修改)和Discuz!NT提供的API(不做修改)。API使用REST形式的接口,这就意味着Discuz!NT API方法可以用HTTP GET 或 POST方式来调用,几乎每一种计算机语言都可以通过HTTP来与REST服务器进行通讯,REST Server的地址是 [论坛地址/services/restserver.aspx]。 如果主网站是ASP.NET做的,参考本文方法也能轻松实现ASP.NET网站和Discuz!NT论坛的同步。 第一节 从网站同步到论坛的实现 主要功能: 用户在网站注册会员、登录、注销或修改登录密码后,将相关数据以HTTP方式传递到论坛API中,然后论坛执行相应的操作与网站同步(反过来的操作在第二节)。 实现步骤: 一、在论坛后台“扩展”项的“通行证设置”中添加整合程序设置,可参考http://nt.discuz.net/showtopic-62656.html。 二、在论坛后台“全局”项的“基本设置”-“身份验证Cookie域”中设置域名。 三、添加实现同步的代码。 md5_utf8文件:md5的UTF-8版本加密函数,这个网上很多,注意生成的是32为的MD5密码 RestClient.asp文件: 该文件详细代码见:http://www.cnblogs.com/glaivelee/archive/2010/09/13/1824674.html api_bbs.asp文件: 该文件详细代码见:http://www.cnblogs.com/glaivelee/archive/2010/09/13/1824674.html 最后在网站相关的代码文件中加入如下代码即可: ’同步注册论坛会员 rabtor2010-9-7添加 ’同步登录论坛 ’同步退出论坛 ’同步更新论坛用户的密码 第二节 从论坛同步到网站的应用 主要步骤: 一、开启Discuz!NT论坛的“同步数据模式”功能 在Discuz!NT论坛的后台“扩展”菜单项里单击[通行证设置],设置如下: 应用程序类型:web 应用程序:Url 地址:http://www.Discuz!NT.com/bbs/services/restserver.aspx 同步数据模式:开启 同步数据的 URL 地址:http://www.Discuz!NT.com/api/api_reponse.asp (红色网址部分改成你自己的)。 操作界面图: 二、编写处理同步数据文件 这里以asp网站程序为例,其他语言与此类似。本系统中用到的处理论坛同步数据文件为改写新云CMS的api_reponse.asp以便与已有的asp网站整合。 api_reponse.asp主要代码部分: (由于本系统要求会员注册比较严格,论坛的注册跳转至主网站的会员注册页面) If Request.QueryString<>"" Then Sub SaveUserCookie() If UserName="" or sig="" Then Exit Sub Function ChkUserLogin(username,usercookies) Sub UpdatePWD() 在使用Discuz!NT 的ASP接口函数(API)-users_getid(user_name)文件时出现错误提示:未知方法或方法内部错误 需要修改Discuz.Data.SqlServer项目下UserManage.cs类文件中第2036行: 同样,该类文件中函数public IDataReader GetShortUserInfoToReader(int uid)、public IDataReader FindUserEmail(string email)和public IDataReader GetUserInfoByIP(string ip)都是类似的一样的错误
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=register&username="&Server.URLEncode(strUserName)&"&password="&Server.URLEncode(UserPassWord)&"&email="&Server.URLEncode(usermail)&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=login&username="&Server.URLEncode(username)&"&password="&Server.URLEncode(Request("password"))&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")
’response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=logout&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")
response.write("<script language=""JavaScript"" src=""../api/api_bbs.asp?action=updatepwd&username="&Server.URLEncode(username)&"&password="&Server.URLEncode(Trim(Request.Form("password")))&"&password1="&Server.URLEncode(Trim(Request.Form("password1")))&"&password2="&Server.URLEncode(Trim(Request.Form("password2")))&"&key=z235x6h5c456hv78p05q3w2eopfaw71v""></script>")
Act=Request.QueryString("action")
Select Case Act
Case "login" ‘同步会员登录
SaveUserCookie()
Case "logout" ’同步会员退出
LogoutUser()
Case "updatepwd" ’同步更改会员修改密码
UpdatePWD()
End Select
Else
Dim S_syskey,Password,usercookies,TruePassWord,userclass,Userhidden
Dim sig
sig = Request.QueryString("sig")
UserName = Inen.CheckBadstr(Request.QueryString("user_name"))
usercookies = Request.QueryString("savecookie")
If usercookies="" or Not IsNumeric(usercookies) Then usercookies = 0
ChkUserLogin username,usercookies
End Sub
ChkUserLogin = False
Dim Rs,SQL,Group_Setting
If Not IsObject(Conn) Then ConnectionDatabase
Set Rs = Server.CreateObject("ADODB.Recordset")
SQL = "SELECT * FROM [IE_User] WHERE username=’" & UserName & "’"
Rs.Open SQL, Conn, 1, 3
If Not (Rs.BOF And Rs.EOF) Then
If Rs("UserLock") <> 0 Then
ChkUserLogin = False
Exit Function
End If
Response.Cookies(Inen.Cookies_Name)("LastTimeDate") = Rs("LastTime")
Response.Cookies(Inen.Cookies_Name)("LastTimeIP") = Rs("userlastip")
Response.Cookies(Inen.Cookies_Name)("LastTime") = Rs("LastTime")
Group_Setting=Split(Inen.UserGroupSetting(Rs("UserGrade")), "|||")
If Rs("userpoint") < 0 Then
Rs("userpoint") = CLng(Group_Setting(25))
Else
Rs("userpoint") = Rs("userpoint") + CLng(Group_Setting(25))
End If
If Rs("experience") < 0 Then
Rs("experience") = CLng(Group_Setting(32))
Else
Rs("experience") = Rs("experience") + CLng(Group_Setting(32))
End If
If Rs("charm") < 0 Then
Rs("charm") = CLng(Group_Setting(33))
Else
Rs("charm") = Rs("charm") + CLng(Group_Setting(33))
End If
Rs("LastTime") = Now()
Rs("userlastip") = Inen.GetUserip
Rs("UserLogin") = Rs("UserLogin") + 1
Rs.Update
Select Case usercookies
Case 0
Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
Case 1
Response.Cookies(Inen.Cookies_Name).Expires=Date+1
Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
Case 2
Response.Cookies(Inen.Cookies_Name).Expires=Date+31
Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
Case 3
Response.Cookies(Inen.Cookies_Name).Expires=Date+365
Response.Cookies(Inen.Cookies_Name)("usercookies") = usercookies
End Select
Response.Cookies(Inen.Cookies_Name).path = "/"
Response.Cookies(Inen.Cookies_Name)("userid") = Rs("userid")
Response.Cookies(Inen.Cookies_Name)("username") = Rs("username")
Response.Cookies(Inen.Cookies_Name)("password") = Rs("password")
Response.Cookies(Inen.Cookies_Name)("nickname") = Rs("nickname")
Response.Cookies(Inen.Cookies_Name)("UserGrade") = Rs("UserGrade")
Response.Cookies(Inen.Cookies_Name)("UserGroup") = Rs("UserGroup")
Response.Cookies(Inen.Cookies_Name)("UserClass") = Rs("UserClass")
Response.Cookies(Inen.Cookies_Name)("UserToday") = Rs("UserToday")
ChkUserLogin = True
End If
Rs.Close
Set Rs = Nothing
End Function
Dim Rs,SQL
Dim UserName, UserPass
UserName = Inen.CheckBadstr(Request.QueryString("user_name"))
UserPass = mid(Inen.CheckBadstr(Request.QueryString("password")),9,16)
Status = 1
If UserName = "" or UserPass = "" Then Exit Sub
Set Rs = Server.CreateObject("Adodb.RecordSet")
SQL = "SELECT TOP 1 * FROM [IE_User] WHERE Username=’" & UserName & "’"
If Not IsObject(Conn) Then ConnectionDatabase
Rs.Open SQL,Conn,1,3
If Not Rs.Eof And Not Rs.Bof Then
Rs("password") = UserPass
Rs.update
Status = 0
End If
Rs.Close
Set Rs = Nothing
If UserPass <> "" And Status = 0 Then
Response.Cookies(Inen.Cookies_Name)("password") = UserPass
End If
End Sub
Sub LogoutUser()
Response.Cookies(Inen.Cookies_Name).path = "/"
Response.Cookies(Inen.Cookies_Name)("userid") = ""
Response.Cookies(Inen.Cookies_Name)("username") = ""
Response.Cookies(Inen.Cookies_Name)("password") = ""
Response.Cookies(Inen.Cookies_Name)("nickname") = ""
Response.Cookies(Inen.Cookies_Name)("UserGrade") = ""
Response.Cookies(Inen.Cookies_Name)("UserGroup") = ""
Response.Cookies(Inen.Cookies_Name)("UserClass") = ""
Response.Cookies(Inen.Cookies_Name)("UserToday") = ""
Response.Cookies(Inen.Cookies_Name)("usercookies") = ""
Response.Cookies(Inen.Cookies_Name)("LastTimeDate") = ""
Response.Cookies(Inen.Cookies_Name)("LastTimeIP") = ""
Response.Cookies(Inen.Cookies_Name)("LastTime") = ""
Response.Cookies(Inen.Cookies_Name) = ""
End Sub