|
己也从网上下了接口文件,但都只说到通信成功,可实际上还有很多后续问题需要处理,这里就把我做这个同步的经验与大家进行分享。
首先来说一下ucenter的运行机制,ucenter相当于一个中间件,在ucenter中也同样存有会员信息,表名为:pre_ucenter_members,各应用登录或注册时需要发同步指令给它,它通过判断之后发送同步信息给其它所有应用。
再来介绍一下几个文件,首先最重要的是接口文件,必须放在根目录下的api文件夹里,通常叫uc.asp,这个文件用来接收ucenter发来的同步指令,注意这个文件我们是需要修改的,即在接收到同步指令之后做asp网站的相关操作,代码就自己根据自己网站的需要在这个文件的相关函数中间插入。
例如:同步退出
Case "synlogout" '退出
If API_SYNLOGOUT = 0 Then echo API_RETURN_FORBIDDEN end if
Response.Addheader "P3P","CP=""CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"""
'处理方式
session.abandon
'处理方式(完)
echo API_RETURN_SUCCEED '最后返回 成功
这里的“处理方式”这一段就是要自己写的代码,我这里加的是释放session,也就是退出asp网站的登录。
再比如注册的代码
Case "register" '注册
username = tget("username") '用户名
password = tget("password") '密码
email = tget("email") '邮箱
questionid = tget("questionid") '安全问题
answer = tget("answer") '安全答案
'处理方式
set rs=server.CreateObject("adodb.recordset")
rs.open "select * from [shop_user] where username='"&username&"'",conn,1,3
if rs.recordcount=0 then
rs.addnew
rs("username")=username
rs("userpassword")=password
rs("useremail")=email
rs("quesion")=quesstioned
rs("answer")=answer
rs("adddate")=now()
rs("lastlogin")=now()
end if
rs.update
rs.close
set rs=nothing
'处理方式(完)
echo API_RETURN_SUCCEED '最后返回 成功
这里的处理方式中间一段也就是我自己写的同步注册的代码,即当ucenter发来同步注册指令之后,如果asp程序里没有这个会员就新增一个会员信息。
其它的同步登录、修改会员信息、修改密码、修改头像等功能都是这样写的。
而这个文件中第一个函数是“test”,这个就是我们在ucenter中配置应用时所用到的检测函数,这个函数如果能返回成功值给ucenter,那么它就会认为通信是成功的。至于如何配置应用这里我就不细说了,和别的配置都差不多,一般密钥对了就不会有什么问题。
再来介绍另外一个重要的文件client.asp,这个文件与uc.asp是相反的,这个文件是用来给ucenter发同步指令的,也就是说当在asp程序中发生什么操作时,我们通过client.asp这个文件来发送一个同步指令给ucenter,这样ucenter做出判断之后给其它应用发送同步指令。
这个文件可以不用改,我们在需要发送同步指令的地方直接调用这个文件里的函数就行了。
比如说登录的时候需要发同步登录指令给ucenter,我们在asp程序登录的地方直接调用同步登录函数即可uc_user_synlogin(uid),这个参数是ucenter的uid,可以通过先调用一次用户检测得到uc_user_login(user,pwd)。
不过这个调用有个很特别的地方,一定要仔细的去研究这些函数,事实上大部分的函数并不是调用了之后ucenter就直接发同步指令给别的应用了,这里一定需要注意,很多函数返回的是一串同步的html代码,这串代码中包含了给其它所有应用的同步信息,所以你得到这串html代码之后,需要执行一次。
比如我的同步登录就是这样写的,得到uchtml这串代码之后,执行一次。
uchtml = uc_user_synlogin(uid)
response.write uchtml
注意这串代码写在asp程序登录的地方即可,当然前面还要加一段取得ucenter中会员uid的代码,注意这里的返回值又是一个xml数组。
XML_login = uc_user_login(username,userpassword) ' 需要xml转化提取数组出来
arr_login = xml2array(XML_login)
uid = arr_login(0)
uname= arr_login(1)
password= arr_login(2)
email = arr_login(3)
这一串就是检查登录的,把返回值中的uid以及其它信息取出来。
好了,原理基本上介绍完了,但是这里还有一个很重要的问题,通过跟踪数据库发现,当用户从asp注册时,调用同步注册,完成之后,在ucenter中能查到该会员信息,即pre_ucenter_members表中有,但DZ论坛的会员表中却没有该会员信息,即pre_common_member这个表中没有,接下来我们直接拿该帐号去论坛登录,奇迹发生了,可以登录,而且同时pre_common_member这个表中有了该会员信息,也就是说在DZ论坛登录时是先检查ucenter的会员信息,即ucenter中有时,自动把会员信息取过来。那么我们就明白了,同步注册的时候会员信息并没有直接写到DZ应用中去。
这就带来了一个问题,即通常会员注册完了之后马上都是登录状态,但如果这样的话会员在asp中注册了之后在其它应用中不是立即登录的,而是需要再手工登录一次,同理在论坛中注册也一样,论坛是登录状态,但其它应用包括asp程序里也不是立即登录的。
我这里完全重做了注册页面,包括DZ论坛的注册也跳转到该页面来注册,注册的时候先写asp程序的相关数据,然后同步ucenter注册,这样ucenter中有会员了但论坛里还没有,由于我自己asp程序所采用的MD5加密方式与DZ的不一致,所以不能直接往DZ论坛的会员表里插入会员数据,不过ucenter和论坛的密码加密方式是一样的,于是可以先调用一次获取会员信息的函数,把ucenter的密码取出来之后,自己写代码直接插入到DZ论坛的pre_common_member这个表中。
OK!到现在为止,90%的功能都实现了,唯一还有一个问题没有解决,那就是当用户设了默认登录的时候,在asp程序里面我们可以添加一段代码,同步其它应用登录,但是DZ论坛好象对于默认登录的用户没有给ucenter发同步登录指令,不过对php熟悉的应该可以找到DZ处理默认登录的地方,补上一条给ucenter的同步指令就可以了。
下面把我在润家网http://www.51enjoy.cn写的注册程序reg.asp代码贴出来一段,,asp这边的注册就没有贴出来
uid = uc_user_register(username,userpassword,useremail)
if(uid <= 0) Then
if(uid = -1) Then
response.write "用户名不合法"
elseif(uid = -2) Then
response.write "包含要允许注册的词语"
elseif(uid = -3) Then
response.write "用户名已经存在"
elseif(uid = -4) Then
response.write "Email 格式有误"
elseif(uid = -5) Then
response.write "Email 不允许注册"
elseif(uid = -6) Then
response.write "该 Email 已经被注册"
else
response.write "未知错误"
End if
else
connstr="dsn=mysql;driver={mysql odbc 3.51 driver};database=ultrax;server=localhost;uid=root;password=1234"
set mysqlconn = server.createobject("adodb.connection")
mysqlconn.open connstr
strquery1 = "select password from pre_ucenter_members where uid="&uid
set mysqlrs=mysqlconn.execute(strquery1)
strquery = "insert into pre_common_member (uid,email,username,password) values ("&uid&",'"&useremail&"','"&username&"','"&mysqlrs("password")&"')"
mysqlconn.execute(strquery)
mysqlrs.close
set mysqlrs=nothing
set mysqlconn=nothing
session("username") = username
uchtml = uc_user_synlogin(uid) '返回javascript分别调用各个应用进行登陆
response.write uchtml
End If
可能有人觉得这段代码有点奇怪,其实就是我前面讲到的问题,先调用同步注册,此时会返回uid,但是DZ论坛中并没有该会员信息,于是连接MYSQL的数据库,从ucenter中取出该会员加密后的密码,再存入到DZ论坛的会员表中,当然如果你能了解DZ的MD5加密方式,自己直接写个一样的加密函数,那就不用这么麻烦了。 |
|