找回密码
 开放注册

QQ登录

只需一步,快速开始

微信登录

微信扫码,快速开始

搜索
查看: 1611|回复: 2

同步设置

[复制链接]

85

主题

16

回帖

307

牛毛

一级牛人

积分
307
发表于 2012-9-9 11:20:19 | 显示全部楼层 |阅读模式 来自 甘肃省兰州市
己也从网上下了接口文件,但都只说到通信成功,可实际上还有很多后续问题需要处理,这里就把我做这个同步的经验与大家进行分享。
      首先来说一下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加密方式,自己直接写个一样的加密函数,那就不用这么麻烦了。

4

主题

20

回帖

46

牛毛

初生牛犊

积分
46
发表于 2012-9-10 14:57:20 | 显示全部楼层 来自 浙江省温州市
观摩观摩  

4

主题

20

回帖

46

牛毛

初生牛犊

积分
46
发表于 2012-9-10 14:57:32 | 显示全部楼层 来自 浙江省温州市
观摩观摩  
您需要登录后才可以回帖 登录 | 开放注册

本版积分规则

帮助|Archiver|小黑屋|通信管理局专项备案号:[2008]238号|NB5社区 ( 皖ICP备08004151号;皖公网安备34010402700514号 )

GMT+8, 2025-4-7 14:24 , Processed in 0.196119 second(s), 43 queries .

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表