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

排查Contact Form 7对接外部CRM API的提交失败问题

Contact Form 7 数据同步CRM问题排查与修复

一、核心问题定位

你的代码存在几个关键问题,导致数据同步失败且无有效反馈:

  • 日志输出变量错误:使用var_dump($posted_data)但实际变量是$data,导致日志无内容
  • 请求头缺失Content-Type:API无法识别JSON格式的请求体
  • wp_safe_remote_post域名限制:若CRM域名不在WP安全列表中,请求会被拦截
  • 前端响应未生效:未在API失败时设置$abort = true,CF7会强制显示默认成功消息
  • 条件判断逻辑重叠:第二个if未与第一个错误判断互斥,可能覆盖错误消息

二、优化日志输出(获取完整调试信息)

1. 开启WP调试日志

在wp-config.php中添加配置,确保日志写入wp-content/debug.log:

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

2. 完善日志记录代码

替换原有日志代码,记录提交数据、API请求/响应的完整信息:

// 记录CF7提交的原始数据
error_log('CF7提交数据: ' . print_r($data, true));

// 记录API请求详情
error_log('API请求URL: ' . $apiurl);
error_log('API请求头: ' . print_r($apiheaders, true));
error_log('API请求体: ' . json_encode($apibody));

// 记录API响应详情
error_log('API响应结果: ' . print_r($response, true));
error_log('响应状态码: ' . $response_code);

三、前端显示自定义提交状态

要让自定义错误/成功消息生效,必须在API失败时设置$abort = true,阻止CF7执行默认流程:

// API请求错误处理
if (is_wp_error($response)) {
    $abort = true;
    $error_msg = $response->get_error_message();
    $submission->set_response('提交失败:' . $error_msg);
    $submission->set_status('api_failed');
} 
// API响应非200处理
elseif ($response_code != 200) {
    $abort = true;
    $response_body = wp_remote_retrieve_body($response);
    $submission->set_response('数据同步失败,状态码: ' . $response_code . ',详情: ' . $response_body);
    $submission->set_status('api_failed_' . $response_code);
} 
// 同步成功处理
else {
    // 可选:设置$abort=true替换默认成功消息,否则保留CF7默认提示
    $abort = true;
    $submission->set_response('感谢您的留言!我们会尽快回复您。');
    $submission->set_status('api_success');
}

四、修复数据同步问题(完整修正代码)

以下是修复后的完整代码,解决了所有核心问题:

function sync_cf7_to_crm($form, &$abort, $submission) {
    if ($abort === true) {
        return;
    }

    // 获取并记录提交数据
    $data = $submission->get_posted_data();
    error_log('CF7提交数据: ' . print_r($data, true));

    // 验证必填字段
    if (empty($data['your-email']) || empty($data['your-name'])) {
        $abort = true;
        $submission->set_response('请填写姓名和邮箱!');
        $submission->set_status('invalid_data');
        return;
    }

    // 过滤表单数据
    $email = sanitize_text_field($data['your-email']);
    $name = sanitize_text_field($data['your-name']);
    $phone = isset($data['your-phone']) ? sanitize_text_field($data['your-phone']) : '';
    $message = isset($data['your-message']) ? sanitize_textarea_field($data['your-message']) : '';

    // API配置
    $apiurl = 'https://coolapi.com';
    $apiheaders = array(
        'Authorization' => 'Token token=NotMyRealToken',
        'Content-Type' => 'application/json' // 必须添加,告知API请求格式
    );

    $apibody = array(
        'marketing_form' => array(
            'email' => $email,
            'first_name' => $name,
            'phone_number' => $phone,
            'notes' => $message,
            'relationship' => 'self',
            'community_id' => 19019,
            'lead_source_id' => 60725
        )
    );

    $args_for_push = array(
        'headers' => $apiheaders,
        'body' => json_encode($apibody),
        'timeout' => 15, // 设置超时时间,避免请求挂起
        'sslverify' => true // 自签证书可设为false,生产环境不建议
    );

    // 若wp_safe_remote_post被拦截,改用wp_remote_post(或添加域名到安全列表)
    $response = wp_remote_post($apiurl, $args_for_push);
    error_log('API请求参数: ' . print_r($args_for_push, true));
    error_log('API响应结果: ' . print_r($response, true));

    $response_code = wp_remote_retrieve_response_code($response);

    // 响应处理逻辑
    if (is_wp_error($response)) {
        $abort = true;
        $error_msg = $response->get_error_message();
        $submission->set_response('表单提交失败:' . $error_msg);
        $submission->set_status('api_failed');
        error_log('API请求失败: ' . $error_msg);
    } elseif ($response_code != 200) {
        $abort = true;
        $response_body = wp_remote_retrieve_body($response);
        $submission->set_response('数据同步失败,状态码: ' . $response_code . ',详情: ' . $response_body);
        $submission->set_status('api_failed_' . $response_code);
        error_log('API响应错误,状态码: ' . $response_code . ',响应体: ' . $response_body);
    } else {
        $abort = true;
        $submission->set_response('感谢您的留言!我们已收到您的信息,会尽快与您联系。');
        $submission->set_status('api_success');
        error_log('CRM同步成功,状态码: ' . $response_code);
    }
}

add_action('wpcf7_before_send_mail', 'sync_cf7_to_crm', 10, 3);

额外配置(若使用wp_safe_remote_post)

如果要保留安全请求,将CRM域名添加到WP允许列表:

add_filter('allowed_http_hosts', 'add_crm_host_to_allowed');
function add_crm_host_to_allowed($hosts) {
    $hosts[] = 'coolapi.com';
    return $hosts;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 19:45:56