PHP调用TPR FMCSA API遇401错误,Postman请求正常
向TPR FMCSA注册表提交数据时PHP代码返回401未授权的问题排查
核心错误:JWT过期时间设置错误
你的代码里JWT payload的exp字段错误地赋值为$nbf(当前时间),导致生成的JWT刚创建就过期,接口直接返回401。
修正这行代码:
$payload = [ "nbf" => $nbf, "exp" => $exp, // 改为之前定义的$current_time + 1200,而不是$nbf "iss" => $issuer, // "sub" => $subject ];
其他可能的排查方向
- 私钥格式兼容性
从PFX文件提取的私钥可能需要转换为PEM格式才能被JWT库正确识别,尝试添加私钥导出步骤:
openssl_pkcs12_read($pfxContents, $cert_info, $pfxPassword); // 导出私钥为PEM格式 openssl_pkey_export($cert_info['pkey'], $pem_private_key, $pfxPassword); // 使用PEM格式的私钥生成JWT $jwt = JWT::encode($payload, $pem_private_key, 'RS256');
- CURL请求配置检查
- 确保请求头格式正确,
Authorization字段没有多余空格 - 测试环境中可暂时关闭SSL验证(生产环境请勿使用):
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
时区与时间同步
确认你的服务器时间与TPR FMCSA接口服务器时间同步,time()返回的是UTC时间戳,若服务器时区非UTC,可改用gmdate('U')获取标准UTC时间戳,避免nbf/exp时间校验失败。代码返回逻辑错误
最后一行return $this->withJson($response, $res);中的$response未定义,应改为return $this->withJson($res);,否则会导致自身应用的响应错误。
内容的提问来源于stack exchange,提问作者Sheryar Khan
相关产品推荐
相关产品推荐

