最近做人人开放平台的开发,人人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 ""; }
,就这些了,希望可以帮助到需要的人,自己走了不少弯路,网上资