提交表单调用Jira API POST请求时出现500内部服务器错误
问题:WordPress中WPForms提交数据到Jira API触发500错误
问题背景
在WordPress中基于WPForms搭建表单,需求是提交表单后调用Jira API创建任务,但提交时出现500服务器错误,控制台提示WPForms AJAX提交失败。尝试过付费第三方插件(被要求禁止使用)、切换到Contact Form 7集成均未解决,目标是实现表单提交后成功向Jira发送POST请求并创建任务。
关联代码
function sendingDataToJira( $fields, $entry, $form_data, $entry_id) { $user = 'MY_USERNAME'; $token = 'MY_TOKEN'; $entry = wpforms()->entry->get( $entry_id ); $entry_fields = json_decode( $entry->fields, true); if ($form_data['id'] == 3809) { $api_url = 'https://MY_URL/rest/api/2/issue/'; $body = array ( 'fields' => array ( 'project'=> array ( 'key'=> 'ATS', ), 'summary' => 'New Applicant', 'description' => 'null', 'customfield_10034' => $form_data[4]['value'], 'customfield_10035' => $form_data[5]['value'], 'issuetype' => array( 'name' => 'Task', ), ), ); $request = wp_remote_post( $api_url, array( 'method' => 'POST', 'headers' => array( 'Authorization' => 'Basic' . base64_encode( $user . ':' . $token), 'Content-Type' => 'application/json'), 'body' => json_encode( $body ), 'data_format' => 'body' ) ); }; } add_action( 'wpforms_process_complete', 'sendingDataToJira', 10, 4 );
错误详情
控制台错误
POST /wp-admin/admin-ajax.php 500
WPForms AJAX submit error
debug.log错误日志
[08-Dec-2022 07:37:38 UTC] PHP Fatal error: Uncaught Error: Call to a member function get() on null in /home/u435205697/domains/olinno.com/public_html/wp-content/themes/landio/functions.php:127 Stack trace: #0 /home/u435205697/domains/olinno.com/public_html/wp-includes/class-wp-hook.php(307): sendingDataToJira(Array, Array, Array, 0) #1 /home/u435205697/domains/olinno.com/public_html/wp-includes/class-wp-hook.php(331): WP_Hook->apply_filters(NULL, Array) #2 /home/u435205697/domains/olinno.com/public_html/wp-includes/plugin.php(476): WP_Hook->do_action(Array) #3 /home/u435205697/domains/olinno.com/public_html/wp-content/plugins/wpforms-lite/includes/class-process.php(450): do_action('wpforms_process...', Array, Array, Array, 0) #4 /home/u435205697/domains/olinno.com/public_html/wp-content/plugins/wpforms-lite/includes/class-process.php(109): WPForms_Process->process(Array) #5 /home/u435205697/domains/olinno.com/public_html/wp-content/plugins/wpforms-lite/includes/class-process.php(875): WPForms_Process->listen() #6 /home/u435205697/domains/olinno.com/pu in /home/u435205697/domains/olinno.com/public_html/wp-content/themes/landio/functions.php on line 127
修复方案
1. 解决致命错误:Call to a member function get() on null
wpforms()->entry->get($entry_id) 报错是因为wpforms()返回null,或钩子触发时WPForms的entry组件未初始化。实际上wpforms_process_complete钩子已将$entry作为参数传入,无需重复调用get(),直接使用即可,同时移除冗余的字段解码代码:
// 移除以下两行冗余代码 // $entry = wpforms()->entry->get( $entry_id ); // $entry_fields = json_decode( $entry->fields, true);
2. 修复Jira API授权头格式
Authorization头中Basic与base64编码字符串之间必须加空格,否则Jira无法识别授权信息:
'Authorization' => 'Basic ' . base64_encode( $user . ':' . $token),
3. 修正表单字段值获取方式
$form_data是表单配置数据,不是用户提交的输入值,用户输入应从钩子传入的$fields参数获取:
'customfield_10034' => $fields[4]['value'], 'customfield_10035' => $fields[5]['value'],
4. 添加错误日志排查(可选)
增加请求后的错误检查,便于排查Jira API请求状态:
// 发送请求后添加日志记录 if ( is_wp_error( $request ) ) { error_log( 'Jira API请求失败: ' . $request->get_error_message() ); } else { $response_code = wp_remote_retrieve_response_code( $request ); error_log( 'Jira API响应状态码: ' . $response_code ); if ($response_code !== 201) { error_log( 'Jira API响应内容: ' . wp_remote_retrieve_body( $request ) ); } }
修复后的完整代码
function sendingDataToJira( $fields, $entry, $form_data, $entry_id) { $user = 'MY_USERNAME'; $token = 'MY_TOKEN'; if ($form_data['id'] == 3809) { $api_url = 'https://MY_URL/rest/api/2/issue/'; $body = array( 'fields' => array( 'project' => array( 'key' => 'ATS', ), 'summary' => 'New Applicant', 'description' => 'null', 'customfield_10034' => $fields[4]['value'], 'customfield_10035' => $fields[5]['value'], 'issuetype' => array( 'name' => 'Task', ), ), ); $request = wp_remote_post( $api_url, array( 'method' => 'POST', 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $user . ':' . $token), 'Content-Type' => 'application/json' ), 'body' => json_encode( $body ), 'data_format' => 'body' ) ); // 错误日志记录 if ( is_wp_error( $request ) ) { error_log( 'Jira API请求失败: ' . $request->get_error_message() ); } else { $response_code = wp_remote_retrieve_response_code( $request ); error_log( 'Jira API响应状态码: ' . $response_code ); if ($response_code !== 201) { error_log( 'Jira API响应内容: ' . wp_remote_retrieve_body( $request ) ); } } }; } add_action( 'wpforms_process_complete', 'sendingDataToJira', 10, 4 );
内容的提问来源于stack exchange,提问作者Ngọc Khánh Hồ
相关产品推荐
相关产品推荐

