刷新Instagram的长期访问令牌可在浏览器http中工作,但不能在PHPcurl中工作

问题描述

希望可以为您提供帮助。

我正在尝试实现Instagram的Basic display API,但不幸的是,在使用PHP / cURL生成长期访问令牌或刷新现有的长期令牌时遇到了问题。看来我不是唯一一个有这个或类似问题的人。

我遵循了Facebook入门指南(located here),并能够生成一个短暂的访问令牌,但这与我使用PHP差不多。奇怪的是,如果我直接在HTTP上(例如在浏览器中)通过HTTP调用任何端点,该调用就可以正常工作,或者我可以从一个短的令牌中获取一个长寿命的访问令牌,或者可以刷新一个现有的长寿命的令牌。 。但是它只能在浏览器中或在终端中使用cURL起作用。

似乎graph.instagram.com正在阻止我的Web服务器IP,或者它不喜欢许多可能的cURL选项之一。我尝试了许多不同的组合,但无济于事。我什至尝试从不同的Web服务器(不同的主机,不同的位置和IP,因此IP被阻止的情况下)运行PHP脚本,但仍然没有运气。

我从graph.instagram.com收到的错误消息是:
IGApiException:无效的OAuth 2.0访问令牌(错误代码190)

我花了很多时间在这上面而不是可行的,而我对此感到完全受够了。关于为什么一种方法有效而另一种无效的原因,必须有一个简单的解释。让我发疯。

我想念什么?请帮助...重申一下,在浏览器/终端中调用以下URL(带有适当的短期/长期访问令牌)可以正常工作,但在PHP cURL中则不能。为什么?以及我该如何解决

生成长期访问令牌:
https://graph.instagram.com/access_token?grant_type=ig_exchange_token&client_secret={app-secret}&access_token={short-lived-access-token}

刷新:
https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token={long-lived token}

注意:
据我所知,我已经正确设置了应用程序等。我假设如果不是这样的话,我首先将无法生成访问代码,也无法生成短期访问令牌,不用担心刷新现有的长期存在的令牌。

Rant:
我讨厌Facebook。认真地说,没有什么比没有权利

更直接,更复杂的了

解决方法

哇,在花了几天时间解决这个问题之后,终于发布了这个问题,我只花了40分钟就终于找到了解决方案。

对于遇到类似问题的任何人,我的问题是http_build_query(我用来设置cURL GET参数),同时两个Web服务器都设置了以下php.ini设置:
arg_separator.output = "&"

默认设置通常为:
arg_separator.output = "&"

要解决此问题,可以将http_build_query更改为使用&而不是&,如下所示:
http_build_query($yourParams,null,'&');
或将更改后的php.ini设置恢复为原始设置(后果自负)