WPForms API проверкаPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 WPForms API проверка

Сообщение Anonymous »

Мы получаем ошибку аутентификации [Ошибка экрана] (введите описание изображения здесь) при подаче формы. Я новичок в кодировании и использую Chatgpt к следующему. Утвердить любую помощь и гидад. Вот код, который я написал до сих пор. Ключ API, который я использую, действителен и работает, но я все еще получаю ошибку по электронной почте и телефону при отправке формы. < /P>

Код: Выделить всё

// Constants
define('API_ENDPOINT', 'https://beta.xxx-api');
define('AUTH_TOKEN', 'Bearer xxx');
define('CUSTOMER_FORM_ID', 2271);
define('DRIVER_FORM_ID', 2301);
// EMAIL DEBUGGING
function send_debug_email($subject, $body) {
wp_mail('@gmail.com',$subject,$body);
}
// PHONE NORMALIZATION (US + PK) → E.164 format
function normalize_phone($phone) {
// Remove everything except digits
$digits = preg_replace('/\D+/', '', $phone);
if (!$digits) return false;
if (preg_match('/^1?(\d{10})$/', $digits, $m)) {
return '+1' . $m[1]; // US E.164
}
if (preg_match('/^(92)?0?(3\d{9})$/', $digits, $m)) {
return '+92' . $m[2]; // Pakistan E.164
}
return false;
}
//Password extraction
function extract_password($fieldValue) {
return (is_array($fieldValue) && isset($fieldValue['primary']))
? $fieldValue['primary']
: (is_string($fieldValue) ? $fieldValue : '');
}
// HANDLE API ERROR FUNCTION
function handle_api_error($response, $context = '') {
if (is_wp_error($response)) {
$error_message = $response->get_error_message();
send_debug_email($context . ' - API Connection Error', "Error: " . $error_message);
return ['Service temporarily unavailable. Please try again later.'];
}
$status_code = wp_remote_retrieve_response_code($response);
$response_headers = wp_remote_retrieve_headers($response);
$body = json_decode(wp_remote_retrieve_body($response), true);
// Debug authentication issues
if ($status_code === 401) {
send_debug_email($context . ' - Authentication Debug',
"Status: $status_code\n" .
"Response Body: " . wp_remote_retrieve_body($response) . "\n" .
"Auth Token Used: " . substr(AUTH_TOKEN, 0, 20) . "..."
);
}
if ($status_code >= 400) {
$error_message = $body['message'] ?? 'API request failed';
// For authentication errors, return a specific message
if ($status_code === 401 || (isset($body['message']) && $body['message'] === 'Invalid token')) {
send_debug_email($context . ' - Authentication Error', "Invalid token used for API request");
return ['Service authentication error. Please try again later.'];
}
// For other errors, return the actual error message from the API
send_debug_email($context . ' - API Error', "Status: $status_code, Message: $error_message");
return [$error_message];
}
return false;
}

// Duplicate Check Function (SENT TO EMAILS)
function check_duplicate($type, $value) {
try {
$response = wp_remote_post(API_ENDPOINT . '/auth/', [
'headers' => [
'Authorization' => AUTH_TOKEN,
'Content-Type'  => 'application/json',
],
'body'    => json_encode([$type => $value]),
'timeout' => 15,
]);
// Add debugging for API response
send_debug_email($type . ' Duplicate Check - API Response',
"Request: " . json_encode([$type => $value]) . "\n" .
"Response Code: " . wp_remote_retrieve_response_code($response) . "\n" .
"Response Body: " . wp_remote_retrieve_body($response)
);
$error = handle_api_error($response, $type .  ' Duplicate Check');
if ($error) return $error;

$body = json_decode(wp_remote_retrieve_body($response), true);
$errors = [];
// Check if the API explicitly indicates a duplicate
if (isset($body['success']) && !$body['success']) {
if (isset($body['message']) && (
strpos(strtolower($body['message']), 'duplicate') !== false ||
strpos(strtolower($body['message']), 'already') !== false ||
strpos(strtolower($body['message']), 'exists') !== false
)) {
$errors[] = $body['message'];
}
}
if (!empty($body[$type . 'Exists']) || !empty($body[$type . '_exists'])) {
$errors[] = 'This ' . $type . ' is already registered.';
}
if (isset($body['data']) && is_array($body['data'])) {
if (!empty($body['data'][$type . 'Exists']) || !empty($body['data'][$type . '_exists'])) {
$errors[] = 'This ' . $type . ' is already registered.';
}
}
// Special handling for email duplicates
if ($type === 'email' && empty($errors) && isset($body['message'])) {
$message = strtolower($body['message']);
$email_keywords = ['email', 'duplicate', 'already', 'exists', 'taken'];
foreach ($email_keywords as $keyword) {
if (strpos($message, $keyword) !== false) {
$errors[] = $body['message'];
break;
}
}
}
// Special handling for phone duplicates
if ($type === 'phone' && empty($errors) && isset($body['message'])) {
$message = strtolower($body['message']);
$phone_keywords = ['phone', 'duplicate', 'already', 'exists', 'taken'];
foreach ($phone_keywords as $keyword) {
if (strpos($message, $keyword) !== false) {
$errors[] = $body['message'];
break;
}
}
}
return $errors;
} catch (Exception $e) {
send_debug_email($type . ' Duplicate Check - Exception',
"Error: " . $e->getMessage() . "\n" .
"Trace: " . $e->getTraceAsString()
);
return ['An error occurred while checking duplicates. Please try again later.'];
}
}
function check_duplicate_email_phone($email, $phone) {
$errors = [];
if ($email) {
$email_errors = check_duplicate('email', $email);
$errors = array_merge($errors, $email_errors);
}
if ($phone) {
$phone_errors = check_duplicate('phone', $phone);
$errors = array_merge($errors, $phone_errors);
}
return $errors;
}
function set_form_error($form_id, $field_id, $message) {
wpforms()->process->errors[$form_id][$field_id] = $message;
}
// Validate phone before API call (IN WORDPRESS LOGS)
add_action('wpforms_process', 'validate_phone_before_submit', 10, 3);
function validate_phone_before_submit($fields, $entry, $form_data) {
$phone_field_id = 46;
error_log("📞 Running phone validation for form ID: " . $form_data['id']);

if (isset($fields[$phone_field_id])) {
$raw_phone = $fields[$phone_field_id]['value'];
error_log("📞 Raw phone input: " . $raw_phone);
$normalized = normalize_phone($raw_phone);
error_log("📞 Normalized phone: " . var_export($normalized, true));
if ($normalized === false) {
wpforms()->process->errors[$form_data['id']][$phone_field_id] =
'❌ Please enter a valid US or Pakistan phone number.';
error_log("❌ Invalid phone submitted: " . $raw_phone);
} else {
error_log("✅ Phone looks valid: " .  $normalized);
}
} else {
error_log("⚠️ Phone field (ID $phone_field_id) not found in submission.");
}
}
// Check for duplicates before form submission
add_action('wpforms_process', 'check_duplicates_before_submit', 15, 3);
function check_duplicates_before_submit($fields, $entry, $form_data) {
$form_id = $form_data['id'];
$email = $fields[4]['value'] ?? '';
$phoneRaw = $fields[46]['value'] ?? '';
$phone = normalize_phone($phoneRaw);
// Skip if phone validation already failed
if (isset(wpforms()->process->errors[$form_id][46])) {
return;
}
// Duplicate check
$dup_errors = check_duplicate_email_phone($email, $phone);
if (!empty($dup_errors)) {
foreach ($dup_errors as $error) {
if (strpos(strtolower($error), 'email') !== false) {
wpforms()->process->errors[$form_id][4] = $error;
}
if (strpos(strtolower($error), 'phone') !== false) {
wpforms()->process->errors[$form_id][46] = $error;
}
}
/**     send_debug_email('❌ Duplicate Check Failed', implode("\n", $dup_errors));
**/ }
}
//MAIN FORM SUBMISSION
add_action('wpforms_process_complete', 'handle_custom_wpforms_submission', 10, 4);
function handle_custom_wpforms_submission($fields, $entry, $form_data, $entry_id) {
$form_id = $form_data['id'];
// Skip processing if there are already errors
if (!empty(wpforms()->process->errors[$form_id])) {
return;
}
$email = $fields[4]['value'] ?? '';
$phoneRaw = $fields[46]['value'] ?? '';
$phone = normalize_phone($phoneRaw);
// Invalid phone
if (!$phone) {
wpforms()->process->errors[$form_data['id']][46] = 'Phone number must be valid and from US or Pakistan.';
send_debug_email('❌ Invalid Phone', "Phone entered: $phoneRaw");
return;
}
$postData = [];
$endpoint = '';

if ($form_id == 2271) {
// 🟡 Customer Signup (Form ID: 227
$dob = $fields[52]['value'] ?? '';
$postData = [
"firstname"   => $fields[1]['value'] ?? '',
"lastname"    => $fields[49]['value'] ?? '',
"email"       => $email,
"password"    => extract_password($fields[42]['value'] ?? ''),
"phone"       => $phone,
"gender"      => strtolower(trim($fields[51]['value'] ?? '')),
"dateOfBirth" => $dob ? date('Y-m-d', strtotime($dob)) : '',
"address"     => $fields[54]['value'] ?? '',
"zipCode"     => $fields[55]['value'] ?? '',
];
$endpoint = API_ENDPOINT .  '/auth/web-customer-signup';

} elseif ($form_id == 2301) {
// 🔵 Driver Signup (Form ID: 2301)
$dob = $fields[66]['value'] ?? '';
$vehicleData = [
"make"                => $fields[57]['value'] ?? '',
"model"               => $fields[58]['value'] ?? '',
"year"                => (int)($fields[59]['value'] ?? 0),
"color"               => $fields[70]['value'] ?? '',
"plateNumber"         => $fields[60]['value'] ?? '',
"vin"                 => $fields[71]['value'] ?? '',
"registrationExpiry"  => !empty($fields[72]['value']) ? date('Y-m-d\TH:i:s.000\Z', strtotime($fields[72]['value'])) : '',
"insuranceProvider"   => $fields[74]['value'] ?? '',
"insuranceExpiry"     => !empty($fields[76]['value']) ? date('Y-m-d\TH:i:s.000\Z', strtotime($fields[76]['value'])) : ''
];

$postData = [
"user" => [
"email"        => $email,
"password"     => extract_password($fields[42]['value'] ?? ''),
"firstname"    => $fields[1]['value'] ?? '',
"lastname"     => $fields[64]['value'] ?? '',
"phone"        => $phone,
"gender"       => strtolower(trim($fields[50]['value'] ?? '')),
"deliveryMethod" => $fields[52]['value'] ?? '',
"dateOfBirth"  => $dob ? date('Y-m-d', strtotime($dob)) : '',
"address"      => $fields[67]['value'] ?? '',
"zipCode"      => (int)($fields[68]['value'] ?? 0),
],
"vehicle" => $vehicleData
];
$endpoint = API_ENDPOINT . '/auth/web-driver-signup';
} else {
return;
}
// Send API request
$response = wp_remote_post($endpoint, [
'headers' => [
'Authorization' => AUTH_TOKEN,
'Content-Type'  => 'application/json',
],
'body'    => json_encode($postData),
'timeout' => 20,
]);
// Check for API errors and handle them (SHOW USER ERRORS AFTER SUBMITTING FORM)
if (is_wp_error($response)) {
$error_message = $response->get_error_message();
wpforms()->process->errors[$form_id][4] = 'Registration failed. Please try again later.';
wpforms()->process->errors[$form_id][46] = 'Registration failed. Please try again later.';
send_debug_email('❌ API ERROR', $error_message);
return;
}
$response_code = wp_remote_retrieve_response_code($response);
$response_body = json_decode(wp_remote_retrieve_body($response), true);
// Handle specific error responses
if ($response_code >= 400) {
$error_message = isset($response_body['message']) ? $response_body['message'] : 'Registration failed.  Please try again.';
$error_message_lower = strtolower($error_message);
// Check for phone error
if (strpos($error_message_lower, 'phone') !== false) {
wpforms()->process->errors[$form_id][46] = $error_message;
}
// Check for email error
elseif (strpos($error_message_lower, 'email') !== false) {
wpforms()->process->errors[$form_id][4] = $error_message;
}
else {
wpforms()->process->errors[$form_id][4] = $error_message;
wpforms()->process->errors[$form_id][46] = $error_message;
}
return;
}
}
// AJAX handler for checking duplicates on form submit
add_action('wp_ajax_check_duplicates_on_submit', 'ajax_check_duplicates_on_submit');
add_action('wp_ajax_nopriv_check_duplicates_on_submit', 'ajax_check_duplicates_on_submit');
function ajax_check_duplicates_on_submit() {
try {
if (!isset($_POST['action']) || $_POST['action'] !== 'check_duplicates_on_submit') {
wp_send_json(['success' => false, 'message' => 'Invalid request']);
}

$errors = [];
$debug_info = [];

if (!empty($_POST['email'])) {
$email = sanitize_email($_POST['email']);
if ($email) {
$email_errors = check_duplicate('email', $email);
$debug_info['email'] = [
'value' => $email,
'errors' => $email_errors
];
if (!empty($email_errors)) {
$errors['email'] = $email_errors[0];
}
}
}

if (!empty($_POST['phone'])) {
$phone = sanitize_text_field($_POST['phone']);
$normalized = normalize_phone($phone);
if ($normalized) {
$phone_errors = check_duplicate('phone', $normalized);
$debug_info['phone'] = [
'value' => $normalized,
'errors' => $phone_errors
];
if (!empty($phone_errors)) {
$errors['phone'] = $phone_errors[0];
}
}
}
$response = [
'success' => empty($errors),
'errors' => $errors,
'debug' => $debug_info
];
wp_send_json($response);
} catch (Exception $e) {
send_debug_email('AJAX Error',
"Error: " . $e->getMessage() . "\n" .
"Trace: " .  $e->getTraceAsString()
);
wp_send_json(['success' => false, 'message' => 'An error occurred while checking duplicates.']);
}
}
// FOOTER JS
add_action('wp_footer', function () {
if (!is_page(['customer-registration', 'driver-registration'])) return;
?>

document.addEventListener('DOMContentLoaded', function() {
console.log("Footer JS loaded ✅");
// FIX FOR INPUTMASK ERROR
var fixInputMask = function() {
if (typeof jQuery !== 'undefined' && typeof jQuery.fn.inputmask !== 'undefined') {
jQuery('input[name="wpforms[fields][46]"]').each(function() {
try {
if (jQuery(this).inputmask) {
jQuery(this).inputmask('remove');
}
jQuery(this).off('.inputmask');
jQuery(this).removeAttr('data-inputmask');
jQuery(this).addClass('no-inputmask');
} catch (e) {
console.error('Error removing inputmask:', e);
}
});
var originalInputmask = jQuery.fn.inputmask;
jQuery.fn.inputmask = function() {
if (jQuery(this).hasClass('no-inputmask')) {
return this;
}
return originalInputmask.apply(this, arguments);
};
}
};
fixInputMask();
setTimeout(fixInputMask, 500);
// Track form changes
var formModified = false;
var formIDs = ['wpforms-form-2301', 'wpforms-form-2271'];
formIDs.forEach(function(formId) {
var form = document.getElementById(formId);
if (form) {
// Track input changes
var inputs = form.querySelectorAll('input, select, textarea');
inputs.forEach(function(input) {
input.addEventListener('change', function() {
formModified = true;
});
// Also track keyup for text inputs to catch typing
if (input.type === 'text' || input.type === 'email' || input.type === 'tel' || input.tagName === 'TEXTAREA') {
input.addEventListener('keyup', function() {
formModified = true;
});
}
});
// Reset formModified when form is submitted
form.addEventListener('submit', function() {
formModified = false;
});
}
});
window.addEventListener('beforeunload', function(e) {
if (formModified) {
var message = '⚠️ You have unsaved changes. Are you sure you want to leave? Your form progress will be lost.';
e.preventDefault();
e.returnValue = message;
return message;
}
});
document.addEventListener('keydown', function(e) {
if (formModified && (e.key === 'F5' ||
(e.ctrlKey && e.key.toLowerCase() === 'r') ||
(e.metaKey && e.key.toLowerCase() === 'r'))) {
e.preventDefault();
alert('⚠️ You have unsaved changes.  Refreshing will clear your form progress!');
}
});
// --- PASSWORD TOGGLE ---
document.querySelectorAll('input[type="password"]').forEach(function(field) {
if (!field.dataset.hintInitialized) {
var toggle = document.createElement('span');
toggle.textContent = 'Show';
toggle.style.cssText = 'cursor:pointer;margin-left:8px;font-size:0.9em;color:#0073aa;';
field.insertAdjacentElement('afterend', toggle);
toggle.addEventListener('click', function() {
field.type = field.type === 'password' ? 'text' : 'password';
toggle.textContent = field.type === 'password' ? 'Show' : 'Hide';
});
field.dataset.hintInitialized = 'true';
}
});
// Helper functions
function addFieldError(field, message) {
var errorDiv = document.createElement('div');
errorDiv.className = 'duplicate-error';
errorDiv.style.cssText = 'color: red; margin-top: 5px;';
errorDiv.textContent = message;
field.parentNode.appendChild(errorDiv);
}

function addFormError(form, message) {
var errorDiv = document.createElement('div');
errorDiv.className = 'duplicate-error';
errorDiv.style.cssText = 'color: red; margin-top: 5px;';
errorDiv.textContent = message;
form.prepend(errorDiv);
}

// --- FORM SUBMIT HANDLER ---
formIDs.forEach(function(formId) {
var form = document.getElementById(formId);
if (form) {
form.addEventListener('submit', function(event) {
var emailField = form.querySelector('input[name="wpforms[fields][4]"]');
var phoneField = form.querySelector('input[name="wpforms[fields][46]"]');
var existingErrors = form.querySelectorAll('.duplicate-error');
existingErrors.forEach(function(error) { error.remove(); });
// Validate email format
if (emailField && emailField.value) {
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
if (!emailRegex.test(emailField.value)) {
addFieldError(emailField, 'Please enter a valid email address');
event.preventDefault();
return;
}
}
// Validate phone format
if (phoneField && phoneField.value) {
var digitsOnly = phoneField.value.replace(/\D/g, '');
if (digitsOnly.length < 10 || digitsOnly.length > 15) {
addFieldError(phoneField, 'Please enter a valid phone number');
event.preventDefault();
return;
}
}
// Check for duplicates if email or phone is provided
if ((emailField && emailField.value) || (phoneField && phoneField.value)) {
event.preventDefault();
var submitButton = form.querySelector('button[type="submit"]');
var originalButtonText = submitButton.textContent;
submitButton.textContent = 'Checking...';
submitButton.disabled = true;

var formData = new FormData();
if (emailField && emailField.value) formData.append('email', emailField.value);
if (phoneField && phoneField.value) formData.append('phone', phoneField.value);
formData.append('action', 'check_duplicates_on_submit');
fetch('', {
method: 'POST',
body: formData
})
.then(function(response) {
if (!response.ok) {
if (response.status === 500) {
throw new Error('Server error occurred while checking duplicates.  Please try again later.');
} else {
throw new Error('Network response was not ok: ' + response.statusText);
}
}
return response.json();
})
.then(function(data) {
console.log('Duplicate check response:', data);
submitButton.textContent = originalButtonText;
submitButton.disabled = false;
if (!data) {
throw new Error('Invalid response from server');
}
var responseSuccess = data.success;
var responseErrors = data.errors;

if (data.data && typeof data.data === 'object') {
responseSuccess = data.data.success;
responseErrors = data.data.errors;
}
if (typeof responseSuccess === 'undefined') {
throw new Error('Invalid response format');
}
if (responseSuccess) {
formModified = false;
form.submit();
} else {
var errorMessage = '';
var hasErrors = false;
if (responseErrors && typeof responseErrors === 'object') {
if (responseErrors.email && emailField) {
addFieldError(emailField, responseErrors.email);
errorMessage += responseErrors.email + '\n';
hasErrors = true;
}
if (responseErrors.phone && phoneField) {
addFieldError(phoneField, responseErrors.phone);
errorMessage += responseErrors.phone + '\n';
hasErrors = true;
}
} else {
errorMessage = data.message || 'There was an error validating your information. Please try again.';
hasErrors = true;
}
if (hasErrors) {
alert('Please correct the following errors:\n\n' + errorMessage);
}

if (data.debug) {
console.log('Debug info:', data.debug);
}
}
})
.catch(function(error) {
console.error('Error checking duplicates:', error);
submitButton.textContent = originalButtonText;
submitButton.disabled = false;
addFormError(form, 'Error validating your information. Please try again later.');
alert('Error validating your information. Please try again later.');
});
}
});
}
});
});



Подробнее здесь: [url]https://stackoverflow.com/questions/79755863/wpforms-api-validation[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»