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
相关产品推荐
相关产品推荐

