笔者在测试过程中发现,旧的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.注意网络请求类型和数据返回的类型.

版权声明:本文为zoomkobe1941原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zoomkobe1941/p/3705346.html