新手求助:PHP Curl获取Bearer Token并调用SIM状态API
解决PHP获取Bearer Token并调用SIM卡状态API的问题
核心问题分析
你的第一个脚本仅发送了获取Token的请求,但未解析响应提取Token;第二个脚本的Bearer Token是硬编码占位符,因此需要将两个流程整合,先成功获取Token再传入查询接口。
完整修改后的代码
<?php // 第一步:获取Bearer Token $authCh = curl_init(); curl_setopt($authCh, CURLOPT_URL, 'https://console.monogoto.io/Auth'); curl_setopt($authCh, CURLOPT_RETURNTRANSFER, true); curl_setopt($authCh, CURLOPT_POST, true); curl_setopt($authCh, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', ]); // 替换成你的真实用户名和密码 $postData = json_encode([ "UserName" => "你的用户名", "Password" => "你的密码" ]); curl_setopt($authCh, CURLOPT_POSTFIELDS, $postData); $authResponse = curl_exec($authCh); $authError = curl_error($authCh); curl_close($authCh); // 处理Token获取的错误情况 if ($authError) { die("获取Token时请求错误: " . $authError); } // 解析JSON响应,提取Token(注意:请根据实际返回结构调整键名,比如可能是'Token'或'access_token') $authData = json_decode($authResponse, true); if (!$authData || empty($authData['access_token'])) { die("Token获取失败或响应格式错误: " . $authResponse); } $bearerToken = $authData['access_token']; // 第二步:调用SIM卡状态查询API $sim = $_POST['sim'] ?? ''; if (empty($sim)) { die("请提供有效的SIM ID"); } echo "<br>Sim ID - " . $sim . "<br><br>"; $statusCh = curl_init(); curl_setopt($statusCh, CURLOPT_URL, 'https://console.monogoto.io/thing/' . urlencode($sim) . '/state/'); curl_setopt($statusCh, CURLOPT_RETURNTRANSFER, true); curl_setopt($statusCh, CURLOPT_HTTPHEADER, [ 'accept: application/json', 'authorization: Bearer ' . $bearerToken, ]); $statusResponse = curl_exec($statusCh); $statusError = curl_error($statusCh); curl_close($statusCh); // 处理状态查询的错误情况 if ($statusError) { die("查询SIM状态时请求错误: " . $statusError); } print "Status of Sim?: " . $statusResponse; ?>
关键修改说明
- 将两个独立脚本整合为一个流程,确保Token获取后直接用于后续请求
- 用
json_encode构造POST数据,避免手动拼接JSON的语法错误 - 添加多层错误处理:捕获curl请求错误、检查Token是否有效提取、验证SIM ID是否存在
- 对SIM ID使用
urlencode处理,防止特殊字符导致URL无效 - 提示你根据Auth接口的真实返回结构调整Token提取的键名(比如如果接口返回
"Token": "xxx",就把$authData['access_token']改成$authData['Token'])
额外建议
- 可以将Token缓存到会话(
$_SESSION)或文件中,避免每次请求重复调用Auth接口,减少API请求次数、提升效率 - 测试时可先单独打印
$authResponse,确认返回的JSON结构,确保Token提取的键名正确
内容的提问来源于stack exchange,提问作者David Rowland
相关产品推荐
相关产品推荐

