You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中如何从API返回的JSON提取items字段的Token值

问题描述

我从API拿到的JSON响应如下:

{"error":null,"response":{"items":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6MCwiSWRVdGVudGUiOjEzLCJJZFByb2ZpbG8iOjEsIklkQ29sbGFib3JhdG9yZSI6LTEsIklkRmlsaWFsZSI6LTEsIkNsb3VkSWQiOiI4MTI0MSIsIlVzZXJJZCI6bnVsbCwiV2ViVG9rZW4iOm51bGwsIkFzc29jaWF0ZXNDdXN0b21lck1hbnVhbGx5IjpmYWxzZSwiVG9rZW5DcmVhdGlvbkRhdGUiOiIyMDIyLTExLTA4VDEyOjI3OjE5LjQ5NDA5NDUrMDE6MDAifQ.prRo4mTA3a7M65UG_aSRQYCxsqwbwDYmUbv3Tbz4cYY","message":null}}

我需要提取其中items字段的Token值。现有PHP代码通过Curl调用API并将响应转为数组,但还没正确提取Token:

add_filter( 'gform_field_value_token', 'scrivi_token' );
function scrivi_token ( $value ) {
    $url = 'https://leads-cert.creditopratico.it/api/login';

#Assumption: The params below have already been verified.
$topup_data = array("username"      =>      "**********",
                    "password"      =>      "**********",
                    "cloudId"       =>      "**********");
                    

#JSON encode the params
$topup_str   = json_encode($topup_data);

#Curl init
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: '.strlen($topup_str)
    )
);  

curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $topup_str);
$result = curl_exec($ch);
$array = json_decode($result, true);
print_r($array); // ARRAY

return $token; //pass the value to the field that interests me

代码输出的数组结构如下:

Array ( [error] => [response] => Array ( [items] => eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJJZCI6MCwiSWRVdGVudGUiOjEzLCJJZFByb2ZpbG8iOjEsIklkQ29sbGFib3JhdG9yZSI6LTEsIklkRmlsaWFsZSI6LTEsIkNsb3VkSWQiOiI4MTI0MSIsIlVzZXJJZCI6bnVsbCwiV2ViVG9rZW4iOm51bGwsIkFzc29jaWF0ZXNDdXN0b21lck1hbnVhbGx5IjpmYWxzZSwiVG9rZW5DcmVhdGlvbkRhdGUiOiIyMDIyLTExLTA4VDE2OjUwOjQyLjA2Mjc1MTcrMDE6MDAifQ.ErluSsrhMCBml3M2P5Pto14zF0zl4sZscFielmaF2Lc [message] => ) )

我尝试用$token = $array['response']['items'];提取Token,但不确定是否正确,需要完善代码实现需求。

解决方案

你的思路是正确的,$array['response']['items']确实能提取到目标Token值。需要在代码中补充赋值逻辑,同时建议增加错误处理,避免API响应异常导致的报错。完善后的代码如下:

add_filter( 'gform_field_value_token', 'scrivi_token' );
function scrivi_token ( $value ) {
    $url = 'https://leads-cert.creditopratico.it/api/login';

    // 已验证的请求参数
    $topup_data = array(
        "username" => "**********",
        "password" => "**********",
        "cloudId"  => "**********"
    );
                    
    // JSON编码参数
    $topup_str = json_encode($topup_data);

    // 初始化Curl
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json',
        'Content-Length: '.strlen($topup_str)
    ));  

    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $topup_str);
    $result = curl_exec($ch);
    
    // 检查Curl请求是否成功
    if(curl_errno($ch)){
        curl_close($ch);
        return $value; // 请求失败时返回原字段值
    }
    curl_close($ch);

    $array = json_decode($result, true);
    
    // 检查JSON解析结果及目标字段是否存在
    if(is_array($array) && isset($array['response']['items'])){
        $token = $array['response']['items'];
        return $token;
    }
    
    // 字段不存在时返回原字段值
    return $value;
}

关键说明:

  • 增加Curl错误检查:通过curl_errno($ch)判断请求是否失败,避免后续逻辑报错。
  • 增加字段存在性验证:用isset($array['response']['items'])确保目标字段存在,防止未定义索引错误。
  • 规范代码格式:调整缩进和注释,提升可读性。

内容的提问来源于stack exchange,提问作者Giandomenico Viglione

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 21:50:37