Tilda与Bitrix CRM(本地版)表单Webhook集成故障排查
我用Tilda搭建网站,搭配Bitrix CRM本地版,尝试通过Webhook实现Tilda表单与CRM的集成。目前有8个仅隐藏字段内容不同的相似表单,以及1个独立表单,对应的PHP文件部署在服务器(示例地址:https://b24.thesite.ru/myphp_1.php),但集成功能无法正常运行。
我的PHP代码如下:
<?php $name = $_POST['name']; $phone = $_POST['phone']; $wood_type = $_POST['wood_type']; $is_designer = isset($_POST['is_designer']) ? 'true' : 'false'; $queryUrl = 'https://b24.thesite.ru/rest/93/qqqqqq1q1q1q1qqqqq/crm.lead.add.json'; $queryData = array( 'fields' => array( 'title' => 'Новая заявка с mysite.ru', 'name' => $name, 'phone' => array(array('VALUE' => $phone, 'VALUE_TYPE' => 'WORK')), 'select' => $select, 'is_designer' => $is_designer, ), ); $curl = curl_init($queryUrl); curl_setopt_array($curl, array( CURLOPT_SSL_VERIFYPEER => 0, CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $queryUrl, CURLOPT_POSTFIELDS => $queryData, )); $result = curl_exec($curl); curl_close($curl); echo "<pre>"; print_r($result); print_r(json_decode($result, true)); echo "</pre>"; ?>
Tilda返回错误信息:
[CODE: 500] webhook URL not avaliable. HTTP/2 500 server: nginx date: Tue, 26 Sep 2023 06:44:07 GMT content-type: text/html; charset = UTF-8 content length:0 vary HTTPS
代码存在的问题及修复方案
未定义变量
$select:代码中$queryData['fields']['select']使用了未初始化的$select变量,会触发PHP警告,甚至导致脚本中断执行。如果不需要该字段直接删除;如果需要,先初始化变量,比如$select = $_POST['select'] ?? '';。POST数据格式错误:Bitrix REST API要求请求体为JSON或URL编码格式,但你直接传递PHP数组,curl会自动转为
multipart/form-data格式,而Bitrix不支持该格式。需要将数组转为JSON字符串,并设置Content-Type请求头为application/json。未处理curl执行错误:没有检查curl是否成功执行,无法排查连接超时、DNS解析失败等底层问题,建议添加错误判断逻辑。
潜在的未初始化变量风险:
$wood_type被获取但未使用,且未做isset判断,如果表单中没有这个字段会触发PHP警告,建议改为$wood_type = $_POST['wood_type'] ?? '';。SSL验证关闭的安全问题:
CURLOPT_SSL_VERIFYPEER => 0会跳过SSL证书验证,生产环境存在安全风险,建议配置正确的SSL证书后开启验证(设为1)。
修正后的代码示例
<?php // 初始化变量,避免未定义警告 $name = $_POST['name'] ?? ''; $phone = $_POST['phone'] ?? ''; $wood_type = $_POST['wood_type'] ?? ''; $is_designer = isset($_POST['is_designer']) ? 'true' : 'false'; // 初始化select变量(不需要则删除此行) $select = $_POST['select'] ?? ''; $queryUrl = 'https://b24.thesite.ru/rest/93/qqqqqq1q1q1q1qqqqq/crm.lead.add.json'; $queryData = array( 'fields' => array( 'title' => 'Новая заявка с mysite.ru', 'name' => $name, 'phone' => array(array('VALUE' => $phone, 'VALUE_TYPE' => 'WORK')), 'select' => $select, // 不需要则删除 'is_designer' => $is_designer, ), ); $curl = curl_init($queryUrl); // 将数组转为JSON字符串 $postData = json_encode($queryData); curl_setopt_array($curl, array( CURLOPT_SSL_VERIFYPEER => 1, // 生产环境建议开启SSL验证 CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_URL => $queryUrl, CURLOPT_POSTFIELDS => $postData, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', // 设置正确的请求头 'Content-Length: ' . strlen($postData) ), CURLOPT_RETURNTRANSFER => 1, // 让curl返回结果字符串而非直接输出 )); $result = curl_exec($curl); // 检查curl执行错误 if(curl_errno($curl)) { echo 'Curl错误: ' . curl_error($curl); exit; } curl_close($curl); echo "<pre>"; print_r($result); print_r(json_decode($result, true)); echo "</pre>"; ?>
内容的提问来源于stack exchange,提问作者Anna Andreevna

