|
|
| JBuilder在中文环境中光标问题的解决方案 |
作者:
文章来源:
访问次数:180次
加入时间:2006年07月18日
|
|
联通彩e接口开发
版本0.1
版权 © 2005 m5
前段时间开发联通彩e接口,期间遇到很多问题,在朋友的帮助和自己的摸索中总算完成了接口的开发。 在sp联盟论坛上也见到许多同行各种各样的问题,因此将开发细节整理成文,希望能给与我当初一样 困扰的人以帮助。 第一次接触彩e,感觉有点无从下手,接口指南几百页之多,我在开发的时候不知道联通提供测试的接入 平台以供调试,而是对着接口规范编写代码,然后模拟接口规则生成数据,这些都是在单元测试中完成 的,到接入uni-wise测试环境时,问题多多。
--------------------------------------------------------------------------------
目录
概述 1. SSO接口 1.1. 传输安全 1.2. 生成请求票根 1.3. 解析响应票根 2. 预定接口 2.1. 发起预定请求 2.2. 解析uni-wise预定请求 2.3. 验证请求 2.4. 响应预定请求 3. 预定取消接口 3.1. 发起取消请求 3.2. 解析uni-wise取消请求 3.3. 验证请求 3.4. 响应请求 4. web push接口 4.1. 提交push 概述 本文以java语言为例,讲述彩e接口开发的点滴。参考的接口指南为《中国联通增值业务综合管理及接入平台SP接口规范v1.2》, 文中代码均经过测试,且与uni-wise平台能正常运行。彩e与sp接口包括:sso接口、预定接口、取消接口、彩e push接口,取 消push接口,查询push接口、wap push接口。文中除了wap push接口,其余的将会一一介绍。 彩e接口的开发其实就是sp与联通uni-wise平台之间的通信,uni-wise平台是以web方式工作,因此与sp的交互大部分通 过http+xml协议传输。 笔者在开发的过程中也曾用C#写过彩e的部分接口代码,如有此需求,我也将整理成文。
第 1 章 SSO接口 SSO 是 Single sign on的缩写,即单点登录,彩e接口中实现的功能是,用户在uni-wise平台或sp平台只需登录一次,即可 访问相关资源。通过cookies机制实现。
1.1. 传输安全 出于安全考虑,网络的传输中经常对传输数据做加密和编码处理,彩e接口开发中的一个关键点也是对加密解密的代码编写。 其中涉及以下几种:
1、md5加密,该加密算法是单向加密,即加密的数据不能再通过解密还原。相关类包含在java.security.MessageDigest包中。
2、3-DES加密,该加密算法是可逆的,解密方可以通过与加密方约定的密钥匙进行解密。相关类包含在javax.crypto.*包中。
3、base64编码,是用于传输8bit字节代码最常用的编码方式。相关类在sun.misc.BASE64Decoder 和sun.misc.BASE64Encoder 中。
4、URLEncoder编码,是一种字符编码,保证被传送的参数由遵循规范的文本组成。相关类在java.net.URLEncoder包中。
1.2. 生成请求票根 当用户从SP平台向uni-wise发起登录请求时,SP平台需要生成一个合法的票根,以http协议传输给uni-wise平台。 生成请求票根的规则是:SPTicketRequestValue = URLEncoding{UNICODE(SPCode +“$”)+ Base64 [Encrypt (UNICODE(Seed + “$”)+ Digest)]}
1、生成Seed: returnUrl + "$" + timeStamp;returnUrl为登录成功后接收uni-wise的响应票根链接。timeStamp为生成的 时间戳。
例 1.1. TimeStamp实现代码
public String getTimeStamp() { Calendar cal=Calendar.getInstance(); SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss.SSS"); String timeStamp=formatter.format(cal.getTime()); return timeStamp; } 2、生成Digest :Base64{Hash[UNICODE(SPCode +"$"+ Seed + "$" + SPKey)]},其中Hash算法采用md5
例 1.2. Digest的实现代码
public String getDigest(String strSrc) { //String strSrc = spCode + "$" + getSeed() + "$" + spKey; BASE64Encoder base64en = new BASE64Encoder(); String digest=""; try { byte[] srcMD5 = md5Encrypt(strSrc); digest = base64en.encode(srcMD5); (1) } catch(Exception e){ e.printStackTrace(); } return digest; }
private byte[] md5Encrypt(String strSrc) { byte[] returnByte = null; try { MessageDigest md5 = MessageDigest.getInstance("MD5"); (2) returnByte = md5.digest(strSrc.getBytes("GBK")); } catch(Exception e) { e.printStackTrace(); } return returnByte; } (1) 用base64编码 (2) 指定加密方式为md5
3、生成密钥匙,用联通提供的key,进行md5加密。
例 1.3. 得到3-DES的密钥匙
private byte[] getEnKey(String spKey) { byte[] desKey=null; try { byte[] desKey1 = md5Encrypt(spKey); desKey = new byte[24]; int i = 0; while (i < desKey1.length && i < 24) { desKey[i] = desKey1[i]; i++; } if (i < 24) { (1) desKey[i] = 0; i++; } } catch(Exception e){ e.printStackTrace(); } return desKey; } (1) 根据接口规范,密钥匙为24个字节,md5加密出来的是16个字节,因此后面补8个字节的0
4、生成SPTicketRequestValue,URLEncoding{UNICODE(SPCode +“$”)+ Base64 [Encrypt (UNICODE(Seed + “$”)+ Digest)]}, Encrypt算法采用3-DES加密,用md5加密的key作为密钥匙。
例 1.4. 3-DES加密的实现代码
public String getSPTicketRequestValue() { String SPTicketRequestValue=""; try{ byte[] src = (getSeed() + "$" + getDigest() ).getBytes("UTF-16LE"); byte[] enKey = getEnKey(spKey);
|
|
|