服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbuilder在中文环境中光标问题的解决方案


  联通彩e接口开发


前段时间开发联通彩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);

扫描关注微信公众号