本文主要介绍OA—RTX常见功能集成,其中包括RTXName控件、SessionKey登录、Web获取当前登录用户帐号、用户名密码登录、发送消息提醒等功能,以及开发这些功能常见问题。
RTXName控件:
标准的ActiveX控件,让二次开发人员可以快速高效的完成基于Web应用的RTX集成。使用RTXName.dll、rtxint.js、browinfo.js 就可以轻松实现Web Application 的RTX集成。
例: <img align="absbottom" width=16 height=16 src="/images/blank.gif" οnlοad="RAP('share');">
一行代码即可完成Web集成。RAP是Helper函数(是“RTX Add Presence”的缩写), 是一个用Jscript封装好的函数,您只需要在Web应用中引用我们提供的Js文件即可,代码和下面的类似:
language="JScript.Encode" src="js/browinfo.js"></script>
language="JScript.Encode" src="js/rtxint.js"></script>
——RTXName在Web页面上的示例:
使用该功能必须先把image和js两个文件夹拷进拷贝到您的Web应用工作目录下,如果您使用的是RTX3.61版本,可以在RTXServer安装目录/Apache/htdocs 拷贝这两个文件夹;如果您使用的是RTX2006版本,请到RTXServer安装目录/webroot 拷贝这两个文件夹。
经常有开发人员反馈把鼠标移至某个人的头像时,不会弹出下拉菜单,出现该问题一般有两种原因:1. 被发起人为自己,例如:share登录RTX,share把鼠标移至WEB的share上面,是不会弹出下拉菜单,因为自己不能对自己发起会话。2. 没有把browinfo.js、rtxint.js引用进来,请确认是否成功引入。3. 开发人员反馈RTX2006的RTXName.dll控件失败,使用RTX3.61该文件覆盖之后正常,我们测试没有发现该问题,如果排除以上两种情况,可以试试用3.61的dll覆盖。
WEB上RTX头像状态图标无法即时更新,这个浏览器自身原因,IE把当前的图片(离线)保存在内存里面,刷新网页就可以显示正常。IE显示状态由两部分组成 blank.gif文件和 Rap()函数,Rap是控件里面的一个函数,因此可以实时更新状态,但blank.gif是一个图片文件,IE无法实时更新(其实QQ也是这样)。所以当某个人在线时,可能页面上显示的图标是灰色,当鼠标移动图标上方时,显示出来的图标是彩色。该问题后续我们寻找更好的解决方法。
SessionKey登录:
很多单位希望在登录OA成功之后,RTX自动登录,这是可以实现的,先在OA服务器上安装Server SDK API包,下面是登录流程图:
看完这个图之后,您应该明白单点登录需要写两个程序:一个后台程序和一个前台程序。后台程序负责中转SessionKey作用,该程序放在OA服务器上(OA服务器需安装Server SDK API ),如下示例代码的GetSessionKey()函数。前台程序则是通过浏览器调用客户端SessionKey登录接口,登录RTX。我们示例程序为了演示方便,把后台程序和前台程序写在一起,您在实际开发中注意分开。否则将出现只能在安装SSDK API机器登录成功,其他机器登录失败。
- //C# 示例代码,针对RTX2006
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using RTXServerApi;
- using RTXClient;
- using RTXCAPILib;
- using System.Runtime.InteropServices;
- namespace SessionKeyLogin
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- RTXClient.RTXAPIClass ObjApi = new RTXAPIClass();
- RTXCAPILib.IRTXCRoot RTXCRoot =(RTXCAPILib .IRTXCRoot) ObjApi.GetObject("KernalRoot");
- try
- {
- string Account = textBox1.Text;
- string SessionKey = GetSessionKey(Account);
- RTXCRoot.LoginSessionKey("127.0.0.1", 8300, Account, SessionKey);
- }
- catch (COMException ee)
- {
- }
- }
- private string GetSessionKey(string Account)
- {
- RTXServerApi.RTXObjectClass RTXObj = new RTXObjectClass();
- RTXServerApi.RTXCollectionClass RTXParams = new RTXCollectionClass();
- RTXObj.Name = "SYSTOOLS";
- RTXObj.ServerIP = "127.0.0.1";
- RTXObj.ServerPort = 6000;
- RTXParams.Add("USERNAME", Account );
- string SessionKey = (string)RTXObj.Call2(enumCommand_.PRO_SYS_GETSESSIONKEY, RTXParams);
- return SessionKey;
- }
- }
- }
- //Java示例代码,针对RTX2006
- <%@ page contentType="text/html; charset=GBK" %>
- <%@ page import="rtx.RTXSvrApi"%>
- <%
- RTXSvrApi rtxApi = new RTXSvrApi();
- String account=UserSession.user_login;//我是通过一个session类来获得当前用户登陆名称的
- String ip = rtxApi.getServerIP();
- String key= rtxApi.GetSessionKey(account); //这个GetSessionKey的方法就在RTX SDK下面JAVA例子RTXSvrApi.java里面有
- %>
- <html>
- <body οnlοad="RtxSycn();">
- <OBJECT classid=clsid:5EEEA87D-160E-4A2D-8427-B6C333FEDA4D id=RTXAX></OBJECT>
- </body>
- </html>
- language="javascript">
- function RtxSycn(){
- try{
- var key="<%=key%>"; //上面取到的sessionkey
- var account="<%=account%>"; //用户登陆名,当然在RTX里面也要有一个一样的用户名
- var ip="<%=ip%>";
- var RTXCRoot = RTXAX.GetObject("KernalRoot"); //客户端SDK
- RTXCRoot.LoginSessionKey(ip,8000,account,key);
- }catch(e){
- alert("RTX未能成功登陆,请重试或与管理员联系!");
- }
- }
- </script>
- //VBScript示例代码,RTX2006与RTX3.61皆可用
- <html>
- <head>
- <TITLE>腾讯通RTX Client SDK功能演示</TITLE>
- language="vbscript" id="clientEventHandlersVBS">
- <!--
- '从服务端获取SessionKey
- Function GetSessionKey()
- on error resume next
- Set ObjApi = createobject("Rtxserver.rtxapi")
- Set objSMS = objAPI.GetObject("SYSTOOLS")
- Set objProp = objAPI.GetObject("Property")
- objProp.Value("USERNAME") = "herolin"
- on error resume next
- GetSessionKey = objSMS.Call2(&H2000, objProp)
- If Err.Description <> "" Then
- MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
- Err.Clear ' Clear the error.
- End If
- End Function
- '单点登录
- Sub RTX_btnSessionKeyLogin_onclick
- on error resume next
- Set objProp = RTXAX.GetObject("Property")
- objProp.Value("RTXUsername") = "herolin"
- objProp.Value("LoginSessionKey") = GetSessionKey()
- objProp.Value("ServerAddress") = "127.0.0.1"
- objProp.Value("ServerPort") = 8300
- RTXAX.Call 2, objProp
- If Err.Number <> 0 Then
- MsgBox "Error # " & CStr(Err.Number) & " " & Err.Description
- Err.Clear ' Clear the error.
- End If
- end sub
- -->
- </script>
- </head>
- <body >
- <INPUT id="RTX_btnSessionKeyLogin" type="button" value="vbscript登录" style="WIDTH: 100px; HEIGHT: 21px" size="18" name="RTX_btnSessionKeyLogin" >
- <OBJECT id=RTXAX
- data=data:application/x-oleobject;base64,fajuXg4WLUqEJ7bDM/7aTQADAAAaAAAAGgAAAA==
- classid=clsid:5EEEA87D-160E-4A2D-8427-B6C333FEDA4D VIEWASTEXT>
- </OBJECT>
- </BODY>
- </HTML>
- 获取当前用户帐号:
- 有些单位还想登录RTX时,OA自动登录。RTX3.61由于没有提供“获取当前用户帐号”接口,因此无法实现该功能。RTX2006提供了该接口,因此RTX2006可以实现。注意,RTX只提供获取当前登录RTX帐号接口,但没有提供获取登录帐号的密码功能。您获取到用户名之后,与OA进行身份验证的工作由您自己实现。(如果判断用户已经登录了RTX,可以不需身份验证就直接登录OA,这是最简单的方法)。下面是获取当前登录RTX用户帐号示例代码:
- //VBScript获取当前用户帐号<html>
- <html>
- <head>
- <TITLE>GetUserName</TITLE>
- language="vbscript" id="clientEventHandlersVBS">
- <!--
- Sub RTX_btnSessionKeyLogin_onclick
- Set objKernal = RTXAX.GetObject("KernalRoot")
- Account = objKernal.Account
- If Account = "" Then
- MsgBox "您未登录RTX"
- Else
- MsgBox "当前登录的用户名: " & Account
- End If
- end sub
- -->
- </script>
- </head>
- <body >
- <INPUT id="RTX_btnSessionKeyLogin" type="button" value="获取用户名" style="WIDTH: 100px; HEIGHT: 21px" size="18" name="RTX_btnSessionKeyLogin" >
- <OBJECT id=RTXAX
- data=data:application/x-oleobject;base64,fajuXg4WLUqEJ7bDM/7aTQADAAAaAAAAGgAAAA==
- classid=clsid:5EEEA87D-160E-4A2D-8427-B6C333FEDA4D VIEWASTEXT>
- </OBJECT>
- </BODY>
- </HTML>
- //C#示例代码
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
- using RTXClient;
- using RTXCAPILib;
- using System.Runtime.InteropServices;
- namespace GetLoginAccount
- {
- public partial class Form1 : Form
- {
- public Form1()
- {
- InitializeComponent();
- }
- private void button1_Click(object sender, EventArgs e)
- {
- RTXClient.RTXAPIClass ObjApi = new RTXAPIClass();
- RTXCAPILib.IRTXCRoot RTXCRoot = (RTXCAPILib.IRTXCRoot)ObjApi.GetObject("KernalRoot");
- try
- {
- string Account = (string)RTXCRoot.Account;
- MessageBox.Show("当前登录的用户名:" + Account);
- }
- catch (COMException ee)
- {
- }
- }
- }