人人开放平台API开发经验总结

最近做人人开放平台的开发,人人API中有的地方没说清,开发者很容易测试不成功。现在把自己测试成功的经验分享给大家,希望可以帮助需要的人。

第一:在授权的时候有个可选参数scope,这个参数大家可能会忘记添加,最后导致后面需要时没有权限。如果需要发表状态,上传,读日志什么的时候,一定别忘了在授权的url里加上scope参数。


第二:怎么计算sig的值?

给大家个例子,是上传图片的参数求sig值的例子,注意计算sig值时需要把参数utf-8编码一下,编码的方法写在工具类Md5Utils里了,这是进行md5加密的方法,官方sdk里的,可以直接用。


/**
 * 计算sig的值
 * @param access_token
 * @return
 */
public static String getSig(String access_token) {
		TreeMap<String, String> map = new TreeMap<String, String>();
		map.put("method","photos.upload");
		map.put("v", "1.0");
		map.put("caption", "测试结果");
		map.put("access_token", access_token);
		map.put("format", "JSON");
		String md5 = "";
		StringBuffer sb = new StringBuffer();
		for (Iterator<Map.Entry<String, String>> iterator = map.entrySet()
				.iterator(); iterator.hasNext();) {
			Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator
					.next();
			sb.append(entry.getKey());
			sb.append("=");
			sb.append(entry.getValue());
		}
		sb.append(getValue("Secret_Key"));
		md5 = Md5Utils.md5(sb.toString());
		return md5;
	}

下面是工具类Md5Utils


package renren.utils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;

public class Md5Utils {

	public static String md5(String string) {
		if (string == null || string.trim().length() < 1) {
			return null;
		}
		try {
			return getMD5(string.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	public static String md52(String string) {
		if (string == null || string.trim().length() < 1) {
			return null;
		}
		try {
			return getMD52(string.getBytes("UTF-8"));
		} catch (UnsupportedEncodingException e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}

	private static String getMD5(byte[] source) {
		String s = null;
		char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
		'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
				'e', 'f' };
		try {
			MessageDigest md = MessageDigest.getInstance("MD5");
			md.update(source);
			byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数,
			// 用字节表示就是 16 个字节
			char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话,使用两个字符,
			// 所以表示成 16 进制需要 32 个字符
			int k = 0; // 表示转换结果中对应的字符位置
			for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节
				// 转换成 16 进制字符的转换
				byte byte0 = tmp[i]; // 取第 i 个字节
				str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
				// >>> 为逻辑右移,将符号位一起右移
				str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
			}
			s = new String(str); // 换后的结果转换为字符串

		} catch (Exception e) {
			e.printStackTrace();
		}
		return s;
	}

	private static String getMD52(byte[] source) {
		try {
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			StringBuffer result = new StringBuffer();
			for (byte b : md5.digest(source)) {
				result.append(Integer.toHexString((b & 0xf0) >>> 4));
				result.append(Integer.toHexString(b & 0x0f));
			}
			return result.toString();
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

}
计算好了sig值,问题就不大了



第三,调用API,在调用时,map里的参数需要进行URLEncode编码,但是accessToken和比如图片名字caption
绝对不要进行URLEncode编码!下面以上传图片为例说明:


/**
 * 上传图片到用户相册
 * @param token
 * @param file
 * @return
 */
	public static String upPicture(AccessToken token, File file) {
		String access_token = token.getAccessToken();
		String url = "http://api.renren.com/restserver.do";
		Map<String, String> httpParams = new HashMap<String, String>();
		Map<String, File> files = new HashMap<String, File>();
		try {
			httpParams.put("method",
					URLEncoder.encode("photos.upload", "UTF-8"));
			httpParams.put("v", URLEncoder.encode("1.0", "UTF-8"));
			httpParams.put("caption", "测试结果");
			httpParams.put("format", URLEncoder.encode("JSON", "UTF-8"));
			httpParams.put("access_token", access_token);
			httpParams.put("sig",
					URLEncoder.encode(getSig(access_token), "UTF-8"));
		} catch (Exception e) {
			// TODO: handle exception
		}
		files.put("upload", file);
		HttpResponse response;
		String responseText = null;
		try {
			response = HttpClients.postMutipart(url, httpParams, "UTF-8", null,
					null, files);
			responseText = EntityUtils.toString(response.getEntity(), "utf-8");
			System.out.println(responseText);
		} catch (ClientProtocolException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {

		}
		return "";
	}



,就这些了,希望可以帮助到需要的人,自己走了不少弯路,网上资

你可能感兴趣的:(人人网,开放平台)