新浪微博开发获取access_token过程
笔者在测试过程中发现,旧的appKey可以直接用response_type=token的方式授权,但是授权后会出现可以访问新浪微博的用户接口和关系接口,但是没办法访问微博接口,拿不到微博的数据.新申请的应用,则只能用response_type=code这种方式授权,采用code授权后可以访问普通接口.
笔者测试时网络部分用的AFN框架,开发环境Xcode5,ARC.在用code方式时,第一步获取code依然没什么大的问题,只要你的回调地址跟URL里一致,开发者身份认证通过,测试账号OK,这一步问题不大.然后卡在了第二步,怎么通过code获取access_token?后来发现是请求的类型问题,这一步需要把网络请求设置为POST,新浪文档里有说,大意了.
步骤:
1.获取登录界面
NSURL *url = [NSURLURLWithString:[NSStringstringWithFormat:@”https://open.weibo.cn/oauth2/authorize?client_id=%@&redirect_uri=%@&display=mobile”,kAppKey,kRedirectURL]];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL:url];
[_webView loadRequest:request];
注:https://api.weibo.com这个网址也可以授权.
2.获取code
抓取code的原理是,你第一步登录后,登录成功,webView会转到你之前创建应用时写的回调页面,拦截该请求,并抓取请求里的code就好.
3.用code获取access_token
NSString *str = [NSStringstringWithFormat:@”https://api.weibo.com/oauth2/access_token?client_id=%@&client_secret=%@&grant_type=authorization_code&redirect_uri=%@&code=%@”,kAppKey,kAppSecret,kRedirectURL,code];
NSMutableURLRequest *request = [NSMutableURLRequestrequestWithURL:[NSURLURLWithString:str]];
#warning 设置请求为post请求!!!
[request setHTTPMethod:@”POST”];
AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) {
NSLog(@”成功%@”,JSON);
if (_account == nil) {
_account = [[Account alloc] init];
}
// 打印账号信息并设置账号
_account.accessToken = JSON[kAccessToken];
_account.uid = JSON[KUid];
NSLog(@”access_token=%@,uid=%@”,_account.accessToken,_account.uid);
[self nickName]; // 后续方法
} failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) {
NSLog(@”失败–%@–%@–%@”,request,response,error);
}];
[operation start];
至此结束,拿到access_token,然后可以方便的读取微博数据.
调试过程中,发现打印错误信息和Google错误提示符号非常有用.
AFJSONRequestOperation默认不接收text/plain类型的数据,当服务器返回text/plain类型的数据时(code授权时用code换取access_token返回的就是text/plain型的数据),会认为出错了。可以通过修改源代码解决问题
+ (NSSet *)acceptableContentTypes {
return [NSSet setWithObjects:@”text/plain”, @”application/json”, @”text/json”, @”text/javascript”, nil];
}
通常里边有三个了,只需要加一个@”text/plain”进去就好,具体该方法所在的文件,搜索一下就出来了,注意只需要添加到一个文件 里,该方法好几个文件里都有,不要乱加.
总结:
1.不用官方SDK,自己动手写网络部分代码时,回调页有没有无所谓如果有要一致.
2.拿不到code说明回调页不一致或者url拼写错误,如果都不是检查当前登录账号是否已设置为测试账号.
3.注意网络请求类型和数据返回的类型.