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

WordPress Contact Form 7集成4m医疗软件时出现JSON解析错误

解决Contact Form 7与4m医疗软件集成时的JSON解析错误

嘿,这个JSON解析错误我之前帮同行排查过类似情况,大概率是请求格式不对或者数据里藏着“捣乱”的特殊字符。咱们一步步来搞定它:

1. 先确保请求的JSON格式和请求头正确

很多人会忽略设置Content-Type: application/json,这是API能识别JSON数据的核心前提。另外,CF7的$_POST里会自带一堆它自己的字段(比如_wpcf7、_wpcf7_version这些),这些字段4m的API肯定不需要,得先过滤掉。

给你补全代码里的关键部分:

add_action('wpcf7_before_send_mail', 'fms_cf7_post_form'); // 确认用对CF7官方钩子
function fms_cf7_post_form($cf7_form) {
    $cf7_id = (int)$cf7_form->id();
    $post_data = $_POST;
    $url = 'http://app.4mmedicalsoft.com/api/leads/register';

    // 过滤掉CF7自带的无用字段
    $clean_data = array_filter($post_data, function($key) {
        return !str_starts_with($key, '_wpcf7');
    }, ARRAY_FILTER_USE_KEY);

    // 把数据转成JSON,同时检查编码是否成功
    $json_data = json_encode($clean_data);
    if (json_last_error() !== JSON_ERROR_NONE) {
        // 把错误日志写到WP调试日志,方便排查
        error_log('CF7数据转JSON失败: ' . json_last_error_msg());
        return $cf7_form;
    }

    // 发送请求,必须添加Content-Type头
    $response = wp_remote_post($url, array(
        'headers' => array(
            'Content-Type' => 'application/json',
            // 如果4m API需要认证,这里要加对应的Authorization头,比如Bearer token
        ),
        'body' => $json_data,
        'timeout' => 15, // 超时时间设长一点,避免请求超时中断
    ));

    // 调试用:把API返回内容写入日志,看具体错误提示
    if (!is_wp_error($response)) {
        error_log('4m API返回内容: ' . wp_remote_retrieve_body($response));
    } else {
        error_log('请求4m API失败: ' . $response->get_error_message());
    }

    return $cf7_form;
}

2. 清理表单里的特殊字符

如果JSON编码成功了,但API还是报错,那可能是用户输入的内容里有换行、未转义的引号这类特殊字符。可以加个小函数统一清理:

// 放在fms_cf7_post_form函数内外都可以
function clean_cf7_form_data($data) {
    foreach ($data as $key => $value) {
        if (is_string($value)) {
            // 把多余的换行、制表符换成空格
            $value = preg_replace('/[\r\n\t]+/', ' ', trim($value));
            // 处理可能的HTML转义字符
            $data[$key] = htmlspecialchars_decode($value);
        }
    }
    return $data;
}

// 在转JSON前调用这个清理函数
$clean_data = clean_cf7_form_data($clean_data);

3. 核对4m API的字段要求

别忽略这个细节!4m的API大概率有必填字段、字段名规范(比如要叫email而不是your-email),或者数据类型要求(比如手机号要传数字而非字符串)。你可以把生成的JSON数据打印到日志里,对比他们的API文档:

error_log('发送给4m的JSON数据: ' . $json_data);

看看有没有字段缺失、名字写错,或者数据类型不匹配的情况。

4. 确认用对了CF7的钩子

你原来的函数用的自定义钩子?不对,应该用CF7官方提供的钩子,比如wpcf7_before_send_mail(表单提交后、邮件发送前)或者wpcf7_submit(表单提交完成后)。用错钩子的话,可能拿到的$post_data不完整,直接导致后续JSON解析出问题。

按照上面的步骤排查,应该能定位到问题所在。如果还是搞不定,看看WP调试日志里的错误信息,或者4m API返回的具体提示,这些都是关键线索。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:29:32