|
基于Android平台的人人网应用程序的开发
第三篇: 人人网签名算法
官方文档:http://dev.xiaonei.com/wiki/Calculate_signature
我们以这个接口为例:friends.getFriends
先完成签名,required的参数是必选的,除了sig以外,因为签名值还没算,alternative的参数,要么选access_token,要么选api_key和session_key。Optional的参数是可选的,一般我们都要选上format这个参数,使返回的数据格式为JSON,这样解析的时候会方便很多,其它参数都是可选的,大家根据自己的实际情况选择。
根据上面的这些原则,我们用如下这些参数:
直接使用access_token请求的参数:
String method = "friends.getFriends";
String v = "1.0";
String access_token = Util.access_token;
String format = "JSON";
使用api_key和session_key请求的参数:
String method = "friends.getFriends";
String v = "1.0";
String api_key = apiKey;
String session_key = sessionkey;
String format = "JSON";
//使用access_token请求的示例代码,另一个就把参数都加上就行了。
//将请求参数格式化为“key=value”格式
//获取签名的java代码
public String getParams(){
List params = new ArrayList();
String method = "friends.getFriends";
String v = "1.0";
String access_token = Util.access_token;
String format = "JSON";
params.add("method="+method);
params.add("v="+v);
params.add("access_token="+access_token);
params.add("format="+format);
// 拼装参数完毕后,params的值为:
// [method=friends.getFriends, v=1.0, access_token=147396|6.cd69dd5a0549c925631969b8d2af1b3f.2592000.1315641600-244248724, format=JSON]
return getSignature(params, Util.RENREN_SECRET);
}
/ **
* 将上诉格式化好的参数键值对,以字典序升序排列后,拼接在一起,即“k1=v1k2=v2k3=v3”;
* 在上拼接好的字符串末尾追加上应用的Secret Key;
* 上述字符串的MD5值即为签名的值
* 获取签名值
* @param paramList
* @param secret
* @return
*/
public String getSignature(List<String> paramList,String secret){
Collections.sort(paramList);
StringBuffer buffer = new StringBuffer();
for (String param : paramList) {
buffer.append(param); //将参数键值对,以字典序升序排列后,拼接在一起
}
buffer.append(secret); //符串末尾追加上应用的Secret Key
try { //下面是将拼好的字符串转成MD5值,然后返回
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
StringBuffer result = new StringBuffer();
try {
for (byte b : md.digest(buffer.toString().getBytes("UTF-8"))) {
result.append(Integer.toHexString((b & 0xf0) >>> 4));
result.append(Integer.toHexString(b & 0x0f));
}
} catch (UnsupportedEncodingException e) {
for (byte b : md.digest(buffer.toString().getBytes())) {
result.append(Integer.toHexString((b & 0xf0) >>> 4));
result.append(Integer.toHexString(b & 0x0f));
}
}
return result.toString();
} catch (java.security.NoSuchAlgorithmException ex) {
}
return null;
}
这样就计算出了sig的值,签名值已经计算出来了。下面就该用这个接口的参数去请求人人网服务器,获取数据了。
|
|