| |
联通彩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);
|
|