基于 Lotus Expeditor on Device 的手机银行交易开发
menghe@cn.ibm.com
随着 3G 无线网络的发展、手持设备上网速度的提高、手持设备的性能提高、移动技术和规范的发展、以及越来越庞大的手持设备上网用户群,手机等无线手持设备渠道已经成为银行多渠道平台的一个非常重要的组成部分。所以,近年来国内外很多银行也都纷纷加大了手机渠道的投入。
从手机银行的架构来说,主要有两种方式:B/S(Browser/Server)和 C/S(Client/Server);从手机银行业务来讲,则包括 手机银行交易开发,以及 手机特色业务(如基于位置的服务)二者。由于篇幅所限,这一篇文章主要介绍手机银行的一些特点,以及基于 Lotus Expeditor,也就是 C/S 架构的富客户端的手机银行交易开发。
文章的几位作者具有丰富的手机银行开发经验,将就自身经验和大家一起讨论手机银行的现状、特点、架构,以及交易开发等内容。
正所谓哪里有用户,哪里就有业务,近年来手机银行的逐渐“走红”离不开广大的用户基础。在国内,手机用户群已经是个非常庞大的用户群体。根据 CNNIC(中国互联网络信息中心)发布的《中国手机上网行为研究报告》和《中国手机媒体研究报告》报告显示,2008 年中国手机用户达到 6.4 亿,手机上网用户达到 1.176 亿,每天多次使用手机上网的用户接近 4000 万。在欧洲等发达国家,手机使用率和手机上网率要比中国等发展中国家更高。
图 1. 手机上网用户比例
通过报告,我们知道手机上网用户群体正在每年不断增长,而这些用户都是潜在的银行手机渠道的潜在用户,可观的用户群体可以看出手机渠道对银行电子渠道的重要性。根据 Berg Insight 机构的研究报告,全世界的手机银行用户将从 2008 年的 2000 万,以每年 89% 的年增长率增长,预计到 2014 年,全世界手机银行的用户量将达到 9.13 亿。Berg insight 分析师说:“在新兴市场中,移动银行正逐渐成为主要的电子服务渠道。”
图 2. 2008 年和 2014 年全世界手机银行用户
手机银行作为继网上银行、电话银行、POS 机之后的又一大银行服务创新。在传统的银行前端渠道(Front Office)系统中,网点由于地域时间限制只能服务于有限客户,传统网上银行由于软硬件特性也有一定的局限性,手机渠道的产生使企业的服务平台突破了以往所有的银行前端渠道的局限,实现了实时的 3A 式服务,即任何时间 (Anytime)、任何地方 (Anywhere) 和任何方式 (Anyhow)。手机银行具有以下特点:
- 贴身特性 – 方便,实时:
作为网上银行的派生产品之一,手机银行和网上银行相比,具有“贴身特性”,它比网上银行更方便、实时。客户利用手机银行在任何地方和任何时间都可以方便、及时的交易,延伸了银行的服务群体和广度,也能一定程度缓解 ATM 机和银行网点的排队等候时间。手机的贴身、实时的特性,延伸了手机炒股、炒汇、证券、手机电子商务热潮。
- 成本低
对银行来说,手机银行是银行渠道前端转型的重要渠道之一。手机银行的交易成本仅为传统方式的五分之一。据统计,国外传统柜台每笔交易成本为 1.07 美元,而使用手机银行每笔交易成本则只为 0.16;国内柜台每笔交易成本约为 4 元,手机银行每笔交易成本则只有 0.6 元。一方面在方便用户的同时,能减少了银行的成本;另一方面银行也能释放出员工进行中间业务等更高附加值的服务,从劳动密集型渠道转型向知识密集型渠道。
- 设备特性 – 屏幕小,显示差异性大
手机银行顾名思意是依赖于手机上运行,手机相比于 PC 的一个特性就是显示屏幕小。另外,当前的手机厂商数目繁多,手机型号更是不断更新换代,造成了当前的手机型号多,各型号显示屏幕存在较大的差异性的特点,比如各种手机型号的屏幕尺寸,分辨率,色素等差异。这种设备的差异对手机银行的应用会造成一定的影响。因为很难开发一种手机银行应用去符合所有的设备需求,根据屏幕的大小来决定显示的内容长短,根据屏幕的分辨率来显示图片等。所以当前很多银行的做法是开发符合最低配置手机配置的需求。这一定程度上影响了大部分手机银行用户的用户体验。
手机银行对商业银行电子渠道至关重要,而当前手机银行技术和业务的特点和现状大大限制了它能产生的作用。在国内商业银行中,当前的手机银行基本是作为网上银行的交易的延伸,没有给客户带来新的增值的服务,由于屏幕硬件的限制易用性也很差,不能和银行的网点或其它渠道形成有效的集成和交叉销售。所以当前虽然手机上网用户群体很多,但手机银行的用户群体还相对较少。目前国内外银行的手机银行的现状和局限如下:
- 较少的手机特色业务和新的商业模式,单纯作为网上银行的交易延伸:
从目前国内手机银行应用来看,大多是传统网上银行的延伸。包括缴费业务,如账户查询、余额查询、账户的明细、转账、银行代收的水电费等;信用卡业务,如账单查询、还款通知、自动还款、额度设置等;理财业务,如炒股和炒汇等。这些业务是传统的柜台和网上银行的业务,通过手机银行这个新平台服务客户。
手机银行更多更重要的价值是新的业务和商业模式的诞生,如基于位置的服务、近距离支付、虚拟货币、二维码支付等等。这些新的商业模式会带为银行用户带来增值服务,同时也是银行的新的利润增长点。
- 没有体现营销的理念:
现在的商业银行同质化竞争日趋激烈,金融市场犹如电器市场一般,陷入红海战争,陷入价格战的博弈中。如信用卡市场,各大商业银行为了抢夺市场,免年费,送礼品,积分换好礼,各种促销活动层出不穷,而且各种信用卡的产品定位和功能类似,同质化竞争抢夺非常激烈。
银行要在激烈的竞争市场中占据一席之地,就需要充分了解客户、挖掘客户需求、把合适的产品在用户合适的价值生命周期内通过合适的渠道推给合适的客户。此外,银行的各个渠道应无缝的结合,为客户提供统一的、良好的客户服务。
当前的手机银行更多的是信息平台和交易平台,而不是一个营销的渠道平台。
- 较差的用户体验:
当前国内外的手机银行用户用户体验不太令人满意。
- 当前的手机银行是银行为主,提供的内容、信息、服务是从银行的角度进行设计和发布,而每个客户由于需求层次不一样,个性喜好都不一样,导致对银行服务的需求也是不一致。但当前的手机银行上用户很难在手机银行上找到自己需要的服务、感兴趣的信息。
- 当前的手机银行在不同的手机型号上不能展示很好的效果。不能根据用户手机的屏幕宽度、分辨率、色彩,区分用户的手机型号。
基于 Lotus Expeditor On Device 的手机银行的架构
对于传统的应用程序而言,有两种程序架构,一种是 C/S 架构,一种是 B/S 架构,对于手机设备的应用程序,也有这两种架构。接下来,我们比较一下这两种架构 C/S 和 B/S 优缺点:
- C/S 架构的优缺点
C/S 的优点:具有客户端硬件设备、存储文件的访问能力,例如地理位置服务需要客户端硬件的支持,这时候应用程序必须采用 C/S 架构才能访问客户端的硬件。第二个优点,就是 C/S 架构,一般客户端提供 UI 的展示,所以响应速度更快,展示能力更强。此外,还可以支持离线处理,即手机银行没有连接在互联网上时,也可以进行操作,并在连线时和远程服务同步。
C/S 的缺点:需要在客户端安装单独的软件,造成一定使用上的不变,此外维护和升级的成本较高。
- B/S 架构的优缺点
B/S 的优点:可以在任何地方、任何时候访问手机银行,只需要手机内嵌浏览器即可,而无需安装任何专门的软件。所有的维护成本都是在服务器端,客户端无需版本控制、升级等维护成本。
B/S 的缺点:因为所有的展示逻辑和业务逻辑都放在服务器端,所以不能充分发挥客户端的运算能力,所有的压力都在服务器端;此外浏览器的展示能力和响应速度也很难和单独的客户端相比;最后就是无法访问客户端的硬件设备和存储,无法离线运行。
基于 Lotus Expeditor On Device 的手机银行,兼容了以上两种架构的优点同时又克服了两种架构的缺点:
第一,它提供工具来开发丰富的客户端的 UI 展现,从而充分利用客户端的计算能力来提高响应速度和展现能力,提供给客户丰富的客户体验。
第二,它提供了本地端的编程方式,可以访问客户端的硬件设备和存储文件,如本地文件存储,GPS 设备,计算器,短信电话等功能。
第三,提供客户端软件的自动更新和升级方法,从而降低了维护和升级成本。
基于 Lotus Expeditor on Device 的手机银行架构如下图所示:
图 3. 基于 Lotus Expeditor On Device 的手机银行架构图(查看大图)
架构中包括手机银行客户端,客户端与服务器端通讯连接,渠道整合服务器,业务逻辑层,与银行主机通信连接等几个部分。手机银行交易的序图图如下所示:
图 4. 手机银行交易时序图(查看大图)
基于 Lotus Expeditor On Device 的手机银行交易开发
如上面架构所示,手机银行的交易包括几个部分:界面及界面逻辑开发,与渠道服务器通讯,交易逻辑,与后台主机核心银行通讯。下面以转账交易为例,依次介绍手机银行交易开发的各个部分逻辑:
Lotus Expeditor 的客户端界面基于 Eclipse 的嵌入式富客户端平台(eRCP)。eRCP 把 Eclipse 的富客户端平台(RCP)带到嵌入式领域。它是基于 SWT 的 widget(称作 eSWT)和基于 JFace 的高级 widget(称作 eJFace)的子集。eRCP 由以下组件构成:
- 标准部件工具包(eSWT):桌面 SWT 的一个子集,它又分为两部分,核心 eSWT,包含基本的功能和简单的 widget。扩展的 eSWT, 包含了更多复杂的 widget 和布局。
- eJFace:提供了一系列的扩展于 eSWT 的类,使 eRCP 的应用程序可以和 eWorkbench 集成。
- eWorkbench:支持多个 eRCP 程序协作的 UI 框架。
- eUpdate:提供了一系列的 API 和接口来动态更新设备上的软件。
下图是基于 Lotus Expeditor eRCP 的手机银行转账交易交易界面展现:
图 5. 手机银行转账交易界面展现
下面是转账交易界面的示意代码。
清单 1. 转账交易手机客户端页面代码
Composite container = new Composite(parent, SWT.NONE); accountFromCombo = new Combo(container, SWT.NONE); accountFromCombo.setBounds(25, 64, 170, 20); accountFromCombo.setItems(new String[] { CurrentUser.accounrNumber }); accountToCombo = new Combo(container, SWT.NONE); accountToCombo.setBounds(25, 126, 170, 20); moneyText = new Text(container, SWT.BORDER); moneyText.setBounds(25, 188, 170, 20); Button btnSubmit = new Button(container, SWT.NONE); btnSubmit.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { } public void widgetSelected(SelectionEvent arg0) { } }); btnSubmit.setBounds(49, 214, 60, 20); btnSubmit.setText(Messages.getInstance().getString("Button.Submit")); Button btnBack = new Button(container, SWT.NONE); btnBack.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { } public void widgetSelected(SelectionEvent arg0) { Util.getInstance().gotoView(TransferView.this, Menu.ID); } }); btnBack.setBounds(115, 214, 60, 20); btnBack.setText(Messages.getInstance().getString("Button.Back")); Label label = new Label(container, SWT.WRAP); label.setAlignment(SWT.LEFT); label.setBounds(25, 28, 170, 30); label.setText(Messages.getInstance().getString("TransferView.AccoutFrom")); Label label = new Label(container, SWT.WRAP); label.setBounds(25, 90, 170, 30); label.setText(Messages.getInstance().getString("TransferView.AccoutTo")); label.setAlignment(SWT.LEFT); Label label = new Label(container, SWT.WRAP); label.setBounds(25, 152, 170, 30); label.setText(Messages.getInstance().getString("TransferView.money")); label.setAlignment(SWT.LEFT);
开发完相应界面后,接下来是客户端和银行的渠道服务器通讯。通讯时,会把界面端收集的业务数据封装,并调用服务器端相应的业务逻辑,等待服务器端执行完业务逻辑后,把返回结果显示在客户端。与银行渠道服务器的交互模块是通过 MobileChannelAdaptor 适配器组件来实现,该模块和渠道服务器交互,发送交易请求以及交易数据,并返回处理结果给手机客户端。MobileChannelAdaptor 适配器可以通过多种协议方式与后台渠道服务器交互,有 HTTP、Web Service、MQ 消息等方式。对于手机的客户端,由于安装了 Lotus Expeditor 和 IBM J9 Java 虚拟机,它提供了对 HTTP、Web Service、JMS 等协议的封装。
下面是转账交易中通过 HTTP 协议和后台渠道服务器交互的实例,交易的请求和交易参数通过序列化将 Java 对象通过 HTTP 协议发送到服务器端进行通信,运行的结果也可以通过序列化从服务器端发送到客户端。
清单 2. MobileChannelAdaptor 模块的 HTTP 协议实现
HttpConnection connection = ConnectionFactory.getConnection(query); if (cookie != null) { connection.setRequestProperty("cookie", cookie); } ObjectOutputStream stream = null; OutputStream os = null; try { connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("User-Agent", "mobile"); if (param != null) { os = connection.openOutputStream(); stream = new ObjectOutputStream(os); stream.writeObject(param); os.flush(); } return processResponse(connection); } finally { try { if (stream != null) { stream.close(); } if (os != null) { os.close(); } if (connection != null) { // close the connection connection.close(); connection = null; } } catch (Exception e) { // do nothing; } }
银行渠道服务器处理各个不同渠道发送过来的业务请求,手机银行只是其中的一个渠道。通过 MobileHandler 组件接受 MobileChannelAdaptor 适配器发送过来的业务请求,并执行交易逻辑。
一般来说一个交易逻辑包括渠道逻辑和业务逻辑两个方面,渠道逻辑主要包括渠道控制、渠道管理,以及多渠道交互。业务逻辑是银行业务流程执行。由于篇幅关系,这里不介绍渠道逻辑。下图是转账交易的业务逻辑:
图 6. 转账交易业务逻辑图
简单来说,转账交易由业务操作,以及业务操作之间的逻辑跳转组成。上图的转账业务逻辑由转账限额判断、连接主机、转账、记日志、发送通知短信等几个转账交易操作组成。其中中间部分的“转账”业务操作,是将转账交易数据封装并调用下面主机通讯模块在主机上执行转账交易,示意代码如下所示:
清单 3. 转账交易其中的转账业务逻辑步骤代码
public class TransferOperation extends BTTServerOperation { public void execute() throws Exception { Account fromAccount = (Account) this.getValueAt("fromAccount"); Account toAccount = (Account) this.getValueAt("toAccount"); Double transferAmount = (Double) this.getValueAt("transferAmount"); // 通过主机连接调用主机逻辑 boolean result = transfer(fromAccount,toAccount,transferAmount); this.setValueAt("resultBean.result", result); } }
良好的业务逻辑是与渠道特性无关的,即可以被多渠道复用。基于统一的多渠道平台,手机银行开发的业务逻辑可以被 ATM,网上银行等渠道复用。达到多渠道复用的目的。
银行的核心交易发生在银行主机系统中,所以业务逻辑需要和主机通讯,按照主机的通讯协议、数据格式来调用主机逻辑。在手机银行交易中,我们利用 SNA Adaptor 适配器模块与银行主流的 SNA 协议的 Lu0,Lu62 主机通讯。和 OSI 模型相对,系统网络架构(SNA)由 IBM 提出,也是最为流行的网络架构模型之一。
- LU0 (用于 LUA):LU0 是早期的 LU,支持最初的程序间通信。有些主机数据库系统,例如信息管理系统 / 虚拟存储(IMS/VS)以及一些零售商店和银行使用的收款机(如 IBM 4680 存储系统操作系统)采用的都是 LU0。当前的各种版本也支持 LU62 通信,而 LU 62 是开发新应用程序的首选协议。
- LU62(用于 APPC、5250、APPC 应用程序组和 CPI-C):LU 62 支持分布式数据处理(distributed data processing)环境下的程序间通信。LU62 数据流既可以是通用数据流(是一种结构化字段数据流),也可以是用户定义数据流。可以用于两个 5 类节点间、一个 5 类节点和另一个 2.0 类或 2.1 类节点间、或者两个都是 2.1 类节点间的通信(2.1 类节点可以当作 APPN 节点使用)
转账交易中,和主机通讯的示意代码如下:
清单 4. 转账交易和主机通讯的代码
// 采用 Lu0 协议和主机通讯的代码: public class SendHostStep extends OperationStep { public void execute() throws Exception { Lu0SnaSessionService lu0Instance = (Lu0SnaSessionService) getService("host"); // 1 - Format the data. messageToSend is a formatted string String messageToSend =getHostSendFmt().format(getContext()); // 2 - Instantiate semaphore and response handler lu0Instance.addHandler(this, "allEvents"); setHostSemaphore(new Semaphore()); // 3 - Send the formatted Message and wait for the semaphore lu0Instance.send(messageToSend); getHostSemaphore().waitOn(10000); // 7 - If semaphore has been signaled, data already in context if (getHostSemaphore().hasTimedOut()) { /* Timeout */ throw new DSEException(DSEException.harmless, "000000000000", "TimeOut"); } // 8 - Remove the operation as handler lu0Instance.removeHandler(this, "allEvents"); } } // 采用 Lu62 协议和主机通讯的代码: public class SendHostStep extends OperationStep { public void execute() throws Exception { Lu62Conversation aConversation = (Lu62Conversation)getService("myConversation1"); // 1) Format the data, messageToSend is a formatted string: String messageToSend = ((FormatElement)getHostSendFormat()).format(getContext()); // 2) Instantiate semaphore and response handler: handleEvent("allEvents", "myConversation1", getContext()); setHostSemaphore(new Semaphore()); // 3) Send the formatted message and wait for the semaphore: aConversation.sendAndPrepareToReceive(messageToSend); getHostSemaphore().waitOn(10000); // 7) If semaphore has been signaled, data already in context // 7a) If timeout expired, raise an exception if (getHostSemaphore().hasTimedOut()) { throw new DSEException(DSEException.critical, "000000000000", "TimeOut"); } // 7b) Remove the operation as handler else { stopHandlingEvent("allEvents", "myConversation1", getContext()); } } }
在手机银行交易开发中,还需要考虑会话管理问题。因为手机银行是有状态的,所以与渠道服务器存在会话管理。不同的连接协议需要应用不同的会话管理方案,如对于 Web Service 协议来说,它是无状态的,所以需要在系统中自动的生成会话 ID,并在手机银行的客户端和服务器端管理会话生命周期。
对于上面介绍的采用 HTTP 协议和服务器进行通讯的情况下,对于会话的管理,可以依赖于 HTTP 的 session 会话管理机制,就是当客户端和服务器进行通讯时,生成 session ID,然后保留在客户端的 cookie 对象中,然后在后来的每次和渠道服务器的通讯过程中,都利用该会话 Session ID 来管理会话。下面客户端和渠道服务器的会话管理示意代码:
清单 5. 手机客户端和渠道服务器的会话管理
public boolean establishSession() throws Exception { Map query = new HashMap(); query.put("createSession", "true"); HttpConnection connection = ConnectionFactory.getConnection(query); try { connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("User-Agent", "mobile"); int responseCode = connection.getResponseCode(); if (responseCode == HttpConnection.HTTP_OK) { String setCookie = connection.getHeaderField("Set-cookie"); System.out.println(setCookie); int i = setCookie.indexOf(";"); if (i == -1) { return false; } cookie = setCookie.substring(0, i); return true; } return false; } finally { try{ if (connection != null) { connection.close(); connection = null; } } catch (Exception e) { } } }
当客户端建立连接时,服务器端将会话 session 的信息自动传递回来,客户端会保留会话 Session 信息在客户端 Cookie 对象中,以后每次发送请求时,都会将 Cookie 的信息一起传递到服务端。
Lotus Expeditor Client for Device 提供了一个可延伸的平台,让采用此结构的开发者可以快速的开发出适合在手机上运行的应用程序。这些应用可以独立的直接运行程序逻辑(如一连串交易表单的输入),只在所有在终端输入完成之后(如提交表单后)才与服务器连线完成交易,而不需要让手机保持随时连线的状态。这对于目前手持设备运算效能越来越好,行动上网连线品质却还未能达到普及和稳定来说,此结构不但减少了开发的成本,更提供了符合手机特性的应用执行环境。但是将此结构与目前一般网络银行普遍采用的 web-based 结构相比,其部署成本却可能因此增加不少。适用于桌上型电脑的 web-based 应用程序的部署与更新只需要将开发测试完成的应用部署在应用服务器上,即完成了部署,使用者只要把浏览器连上服务器,就可以使用最新版的应用程序。而 Lotus Expeditor 的应用如果没有一个完整的管理方式,将新的版本的应用程序自动的安装到每一支手持设备上的执行环境,势必将造成部署成本的增加。
因此 Lotus Expeditor Server 所提供的 Expeditor Client Management 管理服务,正是为了加速部署并且提供可靠以及充分的终端设备管理情报为主。Expeditor Client Management 可以将每个开发测试完成,并放置在 eclipse update site 的应用 application ( 或特性 feature),一次性的下达安装应用的工作指令给指定的用户端群组。系统管理员不仅可以通过管理介面看到此部署工作的完成进度和完成比率,更可以利用此服务查询特定用户端执行环境上的所有应用 / 特性。并针对其应用 / 特性下达更新或移除的工作指令。
在手机银行的环境中,由银行主动提供不同的服务来满足不同客户的需求是必要而且吸引人的,这可以藉由在 Expeditor for device 中所提供的 eclipse preference 技术来达成。由客户设置自己的喜好设置,经由应用程序把这些喜好设置存贮在 eclipse preference 中,最后由 Expeditor Client Management 根据这些喜好设置再配合 server 上的 client filter 功能从远端把不同的服务提供给需要的客户来达成主动服务以及客制化的效果。
相较于 web-based 的应用程序,Lotus Expeditor 的应用程序在程序有新的版本或需要修改时,都必须再做一次更新的动作,这包含了下载新的程序,安装,甚至重新启动 Lotus expeditor 平台的时间,并不像 web-based 的应用程序,所显示的内容都是更新过的。不需要再花更新的时间。在 Lotus Expeditor 中,除了提供 web container 和 web application model 的 framework,更可以用 eclipse property 技术来达成部份更新,举个例来说:当客户有一个 Expeditor 应用程序里面含有某个银行首页的 url,程序设计师可以把 url 用 eclipse property 记录下来,当这个 url 改变时,远端的系统管理者可以用 Expeditor Client Management 所提供的 property control task 来达成 url 的部份更新,而不需要整个程序做完整的更新。
除了提供安装部署应用 / 特性的服务,Expeditor Client Management 也可查询终端设备执行环境上的设置,增加管理者客制化或效能优化执行环境提供便利性。也就是手持设备的使用者不需要管理在自己手机上 Lotus Expeditor Device 的设置和应用,这些工作将由 Expeditor Client Management 的系统管理者来完成。
图 7. Expeditor 客户端管理架构图
图 6 是 Expeditor Client Management 的设备管理结构图。Expeditor Server 包含了 Expeditor Client Management service,在 Lotus Expeditor on Device 中有 Device Agent 元件通过 Http or SSL 网络跟 Expeditor Client Management 做注册的动作,一旦注册完成,在 Expeditor server 中就会有一个 entry 来记录刚注册上的装置,系统管理者就可以用 web 介面的 Administrator console 通过 Expeditor Client Management service 远端管理已注册的装置。而应用程序 (eclipse update site) 可以放置在的 http server 上,当系统管理者执行一个远端应用程序安装或更新的任务,可以通知在装置上的 device Agent 元件来执行这个任务,而 update installer 元件就会被驱动去 http server 下载 update site 安装。除了应用程序的管理之外 Expeditor Client Management 也提供了其他功能,更多的信息请参考 Expeditor infocenter。
本文介绍了手机银行的重要性、特点和现状,以及介绍了 C/S 客户端架构下的手机银行交易开发。并由于篇幅限制,手机银行相关的很多很关键的话题都没有展开讨论,比如:手机银行特色业务及开发,手机银行与多渠道整合,B/S 架构下的手机银行交易开发等。这些话题在以后的文章中进一步和大家进行探讨。
- 查看 IBM WMBTT 官方网站了解更多关于 BTT 产品的信息和资料。
- 查看 IBM WMBTT Information Center了解更多关于 BTT 产品的信息。
- 查看 IBM WMBTT Education Assistant了解更多关于 BTT 使用方面的介绍。
- 查看 Lotus Expeditor Information Center了解更多关于 Lotus Expeditor 产品的信息。
- 参考 BTT 的基于 Web2.0 的下一代网上银行:基于 Web 2.0 的下一代网络银行。
- 参考 BTT 的页面流控制框架:通用页面流程框架及实例介绍。
- 参考 BTT 的基于控制反转创建 SWT 界面:基于控制反转创建 SWT 界面。
menghe@cn.ibm.com
随着 3G 无线网络的发展、手持设备上网速度的提高、手持设备的性能提高、移动技术和规范的发展、以及越来越庞大的手持设备上网用户群,手机等无线手持设备渠道已经成为银行多渠道平台的一个非常重要的组成部分。所以,近年来国内外很多银行也都纷纷加大了手机渠道的投入。
从手机银行的架构来说,主要有两种方式:B/S(Browser/Server)和 C/S(Client/Server);从手机银行业务来讲,则包括 手机银行交易开发,以及 手机特色业务(如基于位置的服务)二者。由于篇幅所限,这一篇文章主要介绍手机银行的一些特点,以及基于 Lotus Expeditor,也就是 C/S 架构的富客户端的手机银行交易开发。
文章的几位作者具有丰富的手机银行开发经验,将就自身经验和大家一起讨论手机银行的现状、特点、架构,以及交易开发等内容。
正所谓哪里有用户,哪里就有业务,近年来手机银行的逐渐“走红”离不开广大的用户基础。在国内,手机用户群已经是个非常庞大的用户群体。根据 CNNIC(中国互联网络信息中心)发布的《中国手机上网行为研究报告》和《中国手机媒体研究报告》报告显示,2008 年中国手机用户达到 6.4 亿,手机上网用户达到 1.176 亿,每天多次使用手机上网的用户接近 4000 万。在欧洲等发达国家,手机使用率和手机上网率要比中国等发展中国家更高。
图 1. 手机上网用户比例
通过报告,我们知道手机上网用户群体正在每年不断增长,而这些用户都是潜在的银行手机渠道的潜在用户,可观的用户群体可以看出手机渠道对银行电子渠道的重要性。根据 Berg Insight 机构的研究报告,全世界的手机银行用户将从 2008 年的 2000 万,以每年 89% 的年增长率增长,预计到 2014 年,全世界手机银行的用户量将达到 9.13 亿。Berg insight 分析师说:“在新兴市场中,移动银行正逐渐成为主要的电子服务渠道。”
图 2. 2008 年和 2014 年全世界手机银行用户
手机银行作为继网上银行、电话银行、POS 机之后的又一大银行服务创新。在传统的银行前端渠道(Front Office)系统中,网点由于地域时间限制只能服务于有限客户,传统网上银行由于软硬件特性也有一定的局限性,手机渠道的产生使企业的服务平台突破了以往所有的银行前端渠道的局限,实现了实时的 3A 式服务,即任何时间 (Anytime)、任何地方 (Anywhere) 和任何方式 (Anyhow)。手机银行具有以下特点:
- 贴身特性 – 方便,实时:
作为网上银行的派生产品之一,手机银行和网上银行相比,具有“贴身特性”,它比网上银行更方便、实时。客户利用手机银行在任何地方和任何时间都可以方便、及时的交易,延伸了银行的服务群体和广度,也能一定程度缓解 ATM 机和银行网点的排队等候时间。手机的贴身、实时的特性,延伸了手机炒股、炒汇、证券、手机电子商务热潮。
- 成本低
对银行来说,手机银行是银行渠道前端转型的重要渠道之一。手机银行的交易成本仅为传统方式的五分之一。据统计,国外传统柜台每笔交易成本为 1.07 美元,而使用手机银行每笔交易成本则只为 0.16;国内柜台每笔交易成本约为 4 元,手机银行每笔交易成本则只有 0.6 元。一方面在方便用户的同时,能减少了银行的成本;另一方面银行也能释放出员工进行中间业务等更高附加值的服务,从劳动密集型渠道转型向知识密集型渠道。
- 设备特性 – 屏幕小,显示差异性大
手机银行顾名思意是依赖于手机上运行,手机相比于 PC 的一个特性就是显示屏幕小。另外,当前的手机厂商数目繁多,手机型号更是不断更新换代,造成了当前的手机型号多,各型号显示屏幕存在较大的差异性的特点,比如各种手机型号的屏幕尺寸,分辨率,色素等差异。这种设备的差异对手机银行的应用会造成一定的影响。因为很难开发一种手机银行应用去符合所有的设备需求,根据屏幕的大小来决定显示的内容长短,根据屏幕的分辨率来显示图片等。所以当前很多银行的做法是开发符合最低配置手机配置的需求。这一定程度上影响了大部分手机银行用户的用户体验。
手机银行对商业银行电子渠道至关重要,而当前手机银行技术和业务的特点和现状大大限制了它能产生的作用。在国内商业银行中,当前的手机银行基本是作为网上银行的交易的延伸,没有给客户带来新的增值的服务,由于屏幕硬件的限制易用性也很差,不能和银行的网点或其它渠道形成有效的集成和交叉销售。所以当前虽然手机上网用户群体很多,但手机银行的用户群体还相对较少。目前国内外银行的手机银行的现状和局限如下:
- 较少的手机特色业务和新的商业模式,单纯作为网上银行的交易延伸:
从目前国内手机银行应用来看,大多是传统网上银行的延伸。包括缴费业务,如账户查询、余额查询、账户的明细、转账、银行代收的水电费等;信用卡业务,如账单查询、还款通知、自动还款、额度设置等;理财业务,如炒股和炒汇等。这些业务是传统的柜台和网上银行的业务,通过手机银行这个新平台服务客户。
手机银行更多更重要的价值是新的业务和商业模式的诞生,如基于位置的服务、近距离支付、虚拟货币、二维码支付等等。这些新的商业模式会带为银行用户带来增值服务,同时也是银行的新的利润增长点。
- 没有体现营销的理念:
现在的商业银行同质化竞争日趋激烈,金融市场犹如电器市场一般,陷入红海战争,陷入价格战的博弈中。如信用卡市场,各大商业银行为了抢夺市场,免年费,送礼品,积分换好礼,各种促销活动层出不穷,而且各种信用卡的产品定位和功能类似,同质化竞争抢夺非常激烈。
银行要在激烈的竞争市场中占据一席之地,就需要充分了解客户、挖掘客户需求、把合适的产品在用户合适的价值生命周期内通过合适的渠道推给合适的客户。此外,银行的各个渠道应无缝的结合,为客户提供统一的、良好的客户服务。
当前的手机银行更多的是信息平台和交易平台,而不是一个营销的渠道平台。
- 较差的用户体验:
当前国内外的手机银行用户用户体验不太令人满意。
- 当前的手机银行是银行为主,提供的内容、信息、服务是从银行的角度进行设计和发布,而每个客户由于需求层次不一样,个性喜好都不一样,导致对银行服务的需求也是不一致。但当前的手机银行上用户很难在手机银行上找到自己需要的服务、感兴趣的信息。
- 当前的手机银行在不同的手机型号上不能展示很好的效果。不能根据用户手机的屏幕宽度、分辨率、色彩,区分用户的手机型号。
基于 Lotus Expeditor On Device 的手机银行的架构
对于传统的应用程序而言,有两种程序架构,一种是 C/S 架构,一种是 B/S 架构,对于手机设备的应用程序,也有这两种架构。接下来,我们比较一下这两种架构 C/S 和 B/S 优缺点:
- C/S 架构的优缺点
C/S 的优点:具有客户端硬件设备、存储文件的访问能力,例如地理位置服务需要客户端硬件的支持,这时候应用程序必须采用 C/S 架构才能访问客户端的硬件。第二个优点,就是 C/S 架构,一般客户端提供 UI 的展示,所以响应速度更快,展示能力更强。此外,还可以支持离线处理,即手机银行没有连接在互联网上时,也可以进行操作,并在连线时和远程服务同步。
C/S 的缺点:需要在客户端安装单独的软件,造成一定使用上的不变,此外维护和升级的成本较高。
- B/S 架构的优缺点
B/S 的优点:可以在任何地方、任何时候访问手机银行,只需要手机内嵌浏览器即可,而无需安装任何专门的软件。所有的维护成本都是在服务器端,客户端无需版本控制、升级等维护成本。
B/S 的缺点:因为所有的展示逻辑和业务逻辑都放在服务器端,所以不能充分发挥客户端的运算能力,所有的压力都在服务器端;此外浏览器的展示能力和响应速度也很难和单独的客户端相比;最后就是无法访问客户端的硬件设备和存储,无法离线运行。
基于 Lotus Expeditor On Device 的手机银行,兼容了以上两种架构的优点同时又克服了两种架构的缺点:
第一,它提供工具来开发丰富的客户端的 UI 展现,从而充分利用客户端的计算能力来提高响应速度和展现能力,提供给客户丰富的客户体验。
第二,它提供了本地端的编程方式,可以访问客户端的硬件设备和存储文件,如本地文件存储,GPS 设备,计算器,短信电话等功能。
第三,提供客户端软件的自动更新和升级方法,从而降低了维护和升级成本。
基于 Lotus Expeditor on Device 的手机银行架构如下图所示:
图 3. 基于 Lotus Expeditor On Device 的手机银行架构图(查看大图)
架构中包括手机银行客户端,客户端与服务器端通讯连接,渠道整合服务器,业务逻辑层,与银行主机通信连接等几个部分。手机银行交易的序图图如下所示:
图 4. 手机银行交易时序图(查看大图)
基于 Lotus Expeditor On Device 的手机银行交易开发
如上面架构所示,手机银行的交易包括几个部分:界面及界面逻辑开发,与渠道服务器通讯,交易逻辑,与后台主机核心银行通讯。下面以转账交易为例,依次介绍手机银行交易开发的各个部分逻辑:
Lotus Expeditor 的客户端界面基于 Eclipse 的嵌入式富客户端平台(eRCP)。eRCP 把 Eclipse 的富客户端平台(RCP)带到嵌入式领域。它是基于 SWT 的 widget(称作 eSWT)和基于 JFace 的高级 widget(称作 eJFace)的子集。eRCP 由以下组件构成:
- 标准部件工具包(eSWT):桌面 SWT 的一个子集,它又分为两部分,核心 eSWT,包含基本的功能和简单的 widget。扩展的 eSWT, 包含了更多复杂的 widget 和布局。
- eJFace:提供了一系列的扩展于 eSWT 的类,使 eRCP 的应用程序可以和 eWorkbench 集成。
- eWorkbench:支持多个 eRCP 程序协作的 UI 框架。
- eUpdate:提供了一系列的 API 和接口来动态更新设备上的软件。
下图是基于 Lotus Expeditor eRCP 的手机银行转账交易交易界面展现:
图 5. 手机银行转账交易界面展现
下面是转账交易界面的示意代码。
清单 1. 转账交易手机客户端页面代码
Composite container = new Composite(parent, SWT.NONE); accountFromCombo = new Combo(container, SWT.NONE); accountFromCombo.setBounds(25, 64, 170, 20); accountFromCombo.setItems(new String[] { CurrentUser.accounrNumber }); accountToCombo = new Combo(container, SWT.NONE); accountToCombo.setBounds(25, 126, 170, 20); moneyText = new Text(container, SWT.BORDER); moneyText.setBounds(25, 188, 170, 20); Button btnSubmit = new Button(container, SWT.NONE); btnSubmit.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { } public void widgetSelected(SelectionEvent arg0) { } }); btnSubmit.setBounds(49, 214, 60, 20); btnSubmit.setText(Messages.getInstance().getString("Button.Submit")); Button btnBack = new Button(container, SWT.NONE); btnBack.addSelectionListener(new SelectionListener() { public void widgetDefaultSelected(SelectionEvent arg0) { } public void widgetSelected(SelectionEvent arg0) { Util.getInstance().gotoView(TransferView.this, Menu.ID); } }); btnBack.setBounds(115, 214, 60, 20); btnBack.setText(Messages.getInstance().getString("Button.Back")); Label label = new Label(container, SWT.WRAP); label.setAlignment(SWT.LEFT); label.setBounds(25, 28, 170, 30); label.setText(Messages.getInstance().getString("TransferView.AccoutFrom")); Label label = new Label(container, SWT.WRAP); label.setBounds(25, 90, 170, 30); label.setText(Messages.getInstance().getString("TransferView.AccoutTo")); label.setAlignment(SWT.LEFT); Label label = new Label(container, SWT.WRAP); label.setBounds(25, 152, 170, 30); label.setText(Messages.getInstance().getString("TransferView.money")); label.setAlignment(SWT.LEFT); |
开发完相应界面后,接下来是客户端和银行的渠道服务器通讯。通讯时,会把界面端收集的业务数据封装,并调用服务器端相应的业务逻辑,等待服务器端执行完业务逻辑后,把返回结果显示在客户端。与银行渠道服务器的交互模块是通过 MobileChannelAdaptor 适配器组件来实现,该模块和渠道服务器交互,发送交易请求以及交易数据,并返回处理结果给手机客户端。MobileChannelAdaptor 适配器可以通过多种协议方式与后台渠道服务器交互,有 HTTP、Web Service、MQ 消息等方式。对于手机的客户端,由于安装了 Lotus Expeditor 和 IBM J9 Java 虚拟机,它提供了对 HTTP、Web Service、JMS 等协议的封装。
下面是转账交易中通过 HTTP 协议和后台渠道服务器交互的实例,交易的请求和交易参数通过序列化将 Java 对象通过 HTTP 协议发送到服务器端进行通信,运行的结果也可以通过序列化从服务器端发送到客户端。
清单 2. MobileChannelAdaptor 模块的 HTTP 协议实现
HttpConnection connection = ConnectionFactory.getConnection(query); if (cookie != null) { connection.setRequestProperty("cookie", cookie); } ObjectOutputStream stream = null; OutputStream os = null; try { connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("User-Agent", "mobile"); if (param != null) { os = connection.openOutputStream(); stream = new ObjectOutputStream(os); stream.writeObject(param); os.flush(); } return processResponse(connection); } finally { try { if (stream != null) { stream.close(); } if (os != null) { os.close(); } if (connection != null) { // close the connection connection.close(); connection = null; } } catch (Exception e) { // do nothing; } } |
银行渠道服务器处理各个不同渠道发送过来的业务请求,手机银行只是其中的一个渠道。通过 MobileHandler 组件接受 MobileChannelAdaptor 适配器发送过来的业务请求,并执行交易逻辑。
一般来说一个交易逻辑包括渠道逻辑和业务逻辑两个方面,渠道逻辑主要包括渠道控制、渠道管理,以及多渠道交互。业务逻辑是银行业务流程执行。由于篇幅关系,这里不介绍渠道逻辑。下图是转账交易的业务逻辑:
图 6. 转账交易业务逻辑图
简单来说,转账交易由业务操作,以及业务操作之间的逻辑跳转组成。上图的转账业务逻辑由转账限额判断、连接主机、转账、记日志、发送通知短信等几个转账交易操作组成。其中中间部分的“转账”业务操作,是将转账交易数据封装并调用下面主机通讯模块在主机上执行转账交易,示意代码如下所示:
清单 3. 转账交易其中的转账业务逻辑步骤代码
public class TransferOperation extends BTTServerOperation { public void execute() throws Exception { Account fromAccount = (Account) this.getValueAt("fromAccount"); Account toAccount = (Account) this.getValueAt("toAccount"); Double transferAmount = (Double) this.getValueAt("transferAmount"); // 通过主机连接调用主机逻辑 boolean result = transfer(fromAccount,toAccount,transferAmount); this.setValueAt("resultBean.result", result); } } |
良好的业务逻辑是与渠道特性无关的,即可以被多渠道复用。基于统一的多渠道平台,手机银行开发的业务逻辑可以被 ATM,网上银行等渠道复用。达到多渠道复用的目的。
银行的核心交易发生在银行主机系统中,所以业务逻辑需要和主机通讯,按照主机的通讯协议、数据格式来调用主机逻辑。在手机银行交易中,我们利用 SNA Adaptor 适配器模块与银行主流的 SNA 协议的 Lu0,Lu62 主机通讯。和 OSI 模型相对,系统网络架构(SNA)由 IBM 提出,也是最为流行的网络架构模型之一。
- LU0 (用于 LUA):LU0 是早期的 LU,支持最初的程序间通信。有些主机数据库系统,例如信息管理系统 / 虚拟存储(IMS/VS)以及一些零售商店和银行使用的收款机(如 IBM 4680 存储系统操作系统)采用的都是 LU0。当前的各种版本也支持 LU62 通信,而 LU 62 是开发新应用程序的首选协议。
- LU62(用于 APPC、5250、APPC 应用程序组和 CPI-C):LU 62 支持分布式数据处理(distributed data processing)环境下的程序间通信。LU62 数据流既可以是通用数据流(是一种结构化字段数据流),也可以是用户定义数据流。可以用于两个 5 类节点间、一个 5 类节点和另一个 2.0 类或 2.1 类节点间、或者两个都是 2.1 类节点间的通信(2.1 类节点可以当作 APPN 节点使用)
转账交易中,和主机通讯的示意代码如下:
清单 4. 转账交易和主机通讯的代码
// 采用 Lu0 协议和主机通讯的代码: public class SendHostStep extends OperationStep { public void execute() throws Exception { Lu0SnaSessionService lu0Instance = (Lu0SnaSessionService) getService("host"); // 1 - Format the data. messageToSend is a formatted string String messageToSend =getHostSendFmt().format(getContext()); // 2 - Instantiate semaphore and response handler lu0Instance.addHandler(this, "allEvents"); setHostSemaphore(new Semaphore()); // 3 - Send the formatted Message and wait for the semaphore lu0Instance.send(messageToSend); getHostSemaphore().waitOn(10000); // 7 - If semaphore has been signaled, data already in context if (getHostSemaphore().hasTimedOut()) { /* Timeout */ throw new DSEException(DSEException.harmless, "000000000000", "TimeOut"); } // 8 - Remove the operation as handler lu0Instance.removeHandler(this, "allEvents"); } } // 采用 Lu62 协议和主机通讯的代码: public class SendHostStep extends OperationStep { public void execute() throws Exception { Lu62Conversation aConversation = (Lu62Conversation)getService("myConversation1"); // 1) Format the data, messageToSend is a formatted string: String messageToSend = ((FormatElement)getHostSendFormat()).format(getContext()); // 2) Instantiate semaphore and response handler: handleEvent("allEvents", "myConversation1", getContext()); setHostSemaphore(new Semaphore()); // 3) Send the formatted message and wait for the semaphore: aConversation.sendAndPrepareToReceive(messageToSend); getHostSemaphore().waitOn(10000); // 7) If semaphore has been signaled, data already in context // 7a) If timeout expired, raise an exception if (getHostSemaphore().hasTimedOut()) { throw new DSEException(DSEException.critical, "000000000000", "TimeOut"); } // 7b) Remove the operation as handler else { stopHandlingEvent("allEvents", "myConversation1", getContext()); } } } |
在手机银行交易开发中,还需要考虑会话管理问题。因为手机银行是有状态的,所以与渠道服务器存在会话管理。不同的连接协议需要应用不同的会话管理方案,如对于 Web Service 协议来说,它是无状态的,所以需要在系统中自动的生成会话 ID,并在手机银行的客户端和服务器端管理会话生命周期。
对于上面介绍的采用 HTTP 协议和服务器进行通讯的情况下,对于会话的管理,可以依赖于 HTTP 的 session 会话管理机制,就是当客户端和服务器进行通讯时,生成 session ID,然后保留在客户端的 cookie 对象中,然后在后来的每次和渠道服务器的通讯过程中,都利用该会话 Session ID 来管理会话。下面客户端和渠道服务器的会话管理示意代码:
清单 5. 手机客户端和渠道服务器的会话管理
public boolean establishSession() throws Exception { Map query = new HashMap(); query.put("createSession", "true"); HttpConnection connection = ConnectionFactory.getConnection(query); try { connection.setRequestMethod(HttpConnection.POST); connection.setRequestProperty("User-Agent", "mobile"); int responseCode = connection.getResponseCode(); if (responseCode == HttpConnection.HTTP_OK) { String setCookie = connection.getHeaderField("Set-cookie"); System.out.println(setCookie); int i = setCookie.indexOf(";"); if (i == -1) { return false; } cookie = setCookie.substring(0, i); return true; } return false; } finally { try{ if (connection != null) { connection.close(); connection = null; } } catch (Exception e) { } } } |
当客户端建立连接时,服务器端将会话 session 的信息自动传递回来,客户端会保留会话 Session 信息在客户端 Cookie 对象中,以后每次发送请求时,都会将 Cookie 的信息一起传递到服务端。
Lotus Expeditor Client for Device 提供了一个可延伸的平台,让采用此结构的开发者可以快速的开发出适合在手机上运行的应用程序。这些应用可以独立的直接运行程序逻辑(如一连串交易表单的输入),只在所有在终端输入完成之后(如提交表单后)才与服务器连线完成交易,而不需要让手机保持随时连线的状态。这对于目前手持设备运算效能越来越好,行动上网连线品质却还未能达到普及和稳定来说,此结构不但减少了开发的成本,更提供了符合手机特性的应用执行环境。但是将此结构与目前一般网络银行普遍采用的 web-based 结构相比,其部署成本却可能因此增加不少。适用于桌上型电脑的 web-based 应用程序的部署与更新只需要将开发测试完成的应用部署在应用服务器上,即完成了部署,使用者只要把浏览器连上服务器,就可以使用最新版的应用程序。而 Lotus Expeditor 的应用如果没有一个完整的管理方式,将新的版本的应用程序自动的安装到每一支手持设备上的执行环境,势必将造成部署成本的增加。
因此 Lotus Expeditor Server 所提供的 Expeditor Client Management 管理服务,正是为了加速部署并且提供可靠以及充分的终端设备管理情报为主。Expeditor Client Management 可以将每个开发测试完成,并放置在 eclipse update site 的应用 application ( 或特性 feature),一次性的下达安装应用的工作指令给指定的用户端群组。系统管理员不仅可以通过管理介面看到此部署工作的完成进度和完成比率,更可以利用此服务查询特定用户端执行环境上的所有应用 / 特性。并针对其应用 / 特性下达更新或移除的工作指令。
在手机银行的环境中,由银行主动提供不同的服务来满足不同客户的需求是必要而且吸引人的,这可以藉由在 Expeditor for device 中所提供的 eclipse preference 技术来达成。由客户设置自己的喜好设置,经由应用程序把这些喜好设置存贮在 eclipse preference 中,最后由 Expeditor Client Management 根据这些喜好设置再配合 server 上的 client filter 功能从远端把不同的服务提供给需要的客户来达成主动服务以及客制化的效果。
相较于 web-based 的应用程序,Lotus Expeditor 的应用程序在程序有新的版本或需要修改时,都必须再做一次更新的动作,这包含了下载新的程序,安装,甚至重新启动 Lotus expeditor 平台的时间,并不像 web-based 的应用程序,所显示的内容都是更新过的。不需要再花更新的时间。在 Lotus Expeditor 中,除了提供 web container 和 web application model 的 framework,更可以用 eclipse property 技术来达成部份更新,举个例来说:当客户有一个 Expeditor 应用程序里面含有某个银行首页的 url,程序设计师可以把 url 用 eclipse property 记录下来,当这个 url 改变时,远端的系统管理者可以用 Expeditor Client Management 所提供的 property control task 来达成 url 的部份更新,而不需要整个程序做完整的更新。
除了提供安装部署应用 / 特性的服务,Expeditor Client Management 也可查询终端设备执行环境上的设置,增加管理者客制化或效能优化执行环境提供便利性。也就是手持设备的使用者不需要管理在自己手机上 Lotus Expeditor Device 的设置和应用,这些工作将由 Expeditor Client Management 的系统管理者来完成。
图 7. Expeditor 客户端管理架构图
图 6 是 Expeditor Client Management 的设备管理结构图。Expeditor Server 包含了 Expeditor Client Management service,在 Lotus Expeditor on Device 中有 Device Agent 元件通过 Http or SSL 网络跟 Expeditor Client Management 做注册的动作,一旦注册完成,在 Expeditor server 中就会有一个 entry 来记录刚注册上的装置,系统管理者就可以用 web 介面的 Administrator console 通过 Expeditor Client Management service 远端管理已注册的装置。而应用程序 (eclipse update site) 可以放置在的 http server 上,当系统管理者执行一个远端应用程序安装或更新的任务,可以通知在装置上的 device Agent 元件来执行这个任务,而 update installer 元件就会被驱动去 http server 下载 update site 安装。除了应用程序的管理之外 Expeditor Client Management 也提供了其他功能,更多的信息请参考 Expeditor infocenter。
本文介绍了手机银行的重要性、特点和现状,以及介绍了 C/S 客户端架构下的手机银行交易开发。并由于篇幅限制,手机银行相关的很多很关键的话题都没有展开讨论,比如:手机银行特色业务及开发,手机银行与多渠道整合,B/S 架构下的手机银行交易开发等。这些话题在以后的文章中进一步和大家进行探讨。
- 查看 IBM WMBTT 官方网站了解更多关于 BTT 产品的信息和资料。
- 查看 IBM WMBTT Information Center了解更多关于 BTT 产品的信息。
- 查看 IBM WMBTT Education Assistant了解更多关于 BTT 使用方面的介绍。
- 查看 Lotus Expeditor Information Center了解更多关于 Lotus Expeditor 产品的信息。
- 参考 BTT 的基于 Web2.0 的下一代网上银行:基于 Web 2.0 的下一代网络银行。
- 参考 BTT 的页面流控制框架:通用页面流程框架及实例介绍。
- 参考 BTT 的基于控制反转创建 SWT 界面:基于控制反转创建 SWT 界面。