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

PHP cURL对接Tuya温控器添加定时任务温度参数异常

PHP cURL对接Tuya开放平台新增定时任务温度不生效问题

问题背景

开发温控器控制网站时,使用PHP cURL对接Tuya开放平台,展示定时任务功能正常,但新增定时任务时设置的目标温度始终不生效。相同逻辑在Postman中执行完全正常,对比请求结果发现:Postman发送的temp_set字段内的键是大写"Value",而网站发送的请求中该键被转为小写"value",不符合Tuya平台的要求。

相关代码与请求对比

Script.php关键代码

public function add_scheduled($device_id,$temp_add, $time, $loops, $access_token) {
    // 省略其他代码
    $payload = array(
        // 省略其他字段
        "functions" => array(
            // 省略其他功能
            array(
                "code" => "temp_set",
                "value" => array("Value" => strval($temp_add))
            ),
            // 省略其他功能
        )
    );
    // 省略cURL发送逻辑
}

请求结果对比

  • Postman正常请求(生效):
{
    "code": "temp_set",
    "value": {
        "Value": "160.0"
    }
}
  • 网站异常请求(不生效):
{
    "code": "temp_set",
    "value": {
        "value": "160.0"
    }
}

问题原因分析

代码中明确将键名写为大写"Value",但实际发送时被转为小写,大概率是以下场景导致:

  1. 数组构造后被篡改:在构造$payload数组之后、转为JSON之前,代码中调用了array_change_key_case等修改键名大小写的函数,或是框架/第三方库的自动格式化逻辑强制将键名转为小写。
  2. JSON序列化或cURL发送环节异常:如果直接将数组传给CURLOPT_POSTFIELDS而非JSON字符串,cURL可能会将数组编码为form-data格式,导致键名被意外转换;或是某些JSON序列化工具存在自动转换键名的配置。

解决方案

步骤1:检查数组是否被篡改

在构造完$payload后立即打印数组,确认"Value"键是否保持大写:

// 构造payload后添加此代码
var_dump($payload['functions'][0]['value']);
exit;

如果输出中键名已经是小写,排查后续代码中是否有修改数组键名的逻辑,移除相关处理即可。

步骤2:确保发送JSON格式请求体

如果数组本身是正确的,问题出在发送环节,需确保将数组转为标准JSON字符串后再发送:

// 构造payload后,转为JSON字符串
$json_payload = json_encode($payload);
// 初始化cURL
$ch = curl_init("TUYA_API_ENDPOINT");
// 设置cURL选项
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $json_payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Content-Type: application/json',
    'Authorization: Bearer ' . $access_token
));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// 执行请求
$result = curl_exec($ch);
curl_close($ch);

步骤3:手动构造JSON片段(极端情况)

如果框架或第三方库强制修改键名,可手动构造temp_set的JSON片段,避免数组被篡改:

// 手动构造value部分的JSON字符串
$temp_value_json = '{"Value": "' . strval($temp_add) . '"}';
// 将JSON字符串转为数组,避免后续被修改
$temp_value = json_decode($temp_value_json, true);

$payload = array(
    // 省略其他字段
    "functions" => array(
        array(
            "code" => "temp_set",
            "value" => $temp_value
        ),
        // 省略其他功能
    )
);

验证

修改后,打印$json_payload确认"Value"键为大写,再调用接口测试,新增定时任务的温度设置即可正常生效。

内容的提问来源于stack exchange,提问作者Louis B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 21:23:16