PHP调用LinkedIn API获取分享统计时timeIntervals参数报错
问题
我需要从LinkedIn主页获取分享统计指标,参考官方文档实现。在Postman中测试请求正常,但用PHP代码实现时出现400错误,提示timeIntervals参数格式或类型无效。
我的PHP代码如下:
$date_start = strtotime(date('Y-01-01 00:01:01')); $date_end = strtotime(date('Y-m-d H:i:s')); $response = Http::withHeaders([ 'Authorization' => 'Bearer ' . $accessToken, 'Linkedin-Version' => '202406', 'X-Restli-Protocol-Version' => '2.0.0', ])->get('https://api.linkedin.com/rest/organizationalEntityShareStatistics', [ 'q' => 'organizationalEntity', 'organizationalEntity' => 'urn:li:organization:XXXXXXXX', 'timeIntervals' => '(timeGranularityType:DAY,timeRange:(start:'.$date_start.',end:'.$date_end.'))', ]); return $response->json();
即使把$date_start和$date_end硬编码为1704067200000、1717113600000,仍会出现相同错误;但移除timeIntervals参数后请求可正常执行。请问代码存在什么问题?
解决方法
问题出在timeIntervals参数的传递格式和时间戳单位上:
- Laravel的
Http::get()会自动处理数组参数为URL查询字符串,手动拼接Restli风格的结构化字符串会被URL编码,导致API无法识别。 - LinkedIn Rest API要求
timeIntervals是数组格式的结构化参数,而非直接拼接的字符串;同时时间戳必须是毫秒级,原代码中strtotime返回的是秒级,不符合要求。
修正后的代码:
// 转换为毫秒级时间戳 $date_start = strtotime(date('Y-01-01 00:01:01')) * 1000; $date_end = strtotime(date('Y-m-d H:i:s')) * 1000; $response = Http::withHeaders([ 'Authorization' => 'Bearer ' . $accessToken, 'Linkedin-Version' => '202406', 'X-Restli-Protocol-Version' => '2.0.0', ])->get('https://api.linkedin.com/rest/organizationalEntityShareStatistics', [ 'q' => 'organizationalEntity', 'organizationalEntity' => 'urn:li:organization:XXXXXXXX', // 用嵌套数组传递结构化参数,Laravel会自动转换为API要求的格式 'timeIntervals' => [ [ 'timeGranularityType' => 'DAY', 'timeRange' => [ 'start' => $date_start, 'end' => $date_end ] ] ] ]); return $response->json();
关键要点:
- 时间戳转换:将
strtotime返回的秒级时间戳乘以1000,转为API要求的毫秒级。 - 参数结构:用嵌套数组定义
timeIntervals,Laravel HTTP客户端会自动将其序列化为LinkedIn Restli协议所需的字符串格式,无需手动拼接。
内容的提问来源于stack exchange,提问作者Ontagen Onta
相关产品推荐
相关产品推荐

