/** * Fix for "Unable to create customer" error in EDD Stripe */ /** * Debug EDD Stripe customer creation issues * Uncomment this function temporarily to see what data is being sent to Stripe */ /* function debug_edd_stripe_customer_creation($args) { // Log customer creation args for debugging error_log('EDD Stripe Customer Args: ' . print_r($args, true)); return $args; } add_filter('edds_create_customer_args', 'debug_edd_stripe_customer_creation', 99); */ /** * Fix Stripe customer creation by ensuring valid data format * * @param array $args Arguments for customer creation * @return array Modified arguments */ function fix_edd_stripe_customer_creation($args) { // Make sure we have array to work with if (!is_array($args)) { return $args; } // CRITICAL FIX: Clean and validate required fields for Stripe customer creation // 1. Email must be valid if (isset($args['email'])) { $args['email'] = sanitize_email($args['email']); // If email is invalid after sanitization, remove it if (!is_email($args['email'])) { unset($args['email']); } } // 2. Name must not be empty or contain invalid characters if (isset($args['name'])) { $args['name'] = sanitize_text_field($args['name']); // If name is empty after sanitization, remove it if (empty($args['name'])) { unset($args['name']); } } // 3. Address must be in correct format if (isset($args['address']) && is_array($args['address'])) { $clean_address = array(); // Only include valid address fields with proper keys $valid_keys = array('line1', 'line2', 'city', 'state', 'postal_code', 'country'); foreach ($valid_keys as $key) { if (isset($args['address'][$key])) { $clean_address[$key] = sanitize_text_field($args['address'][$key]); // Remove empty values if (empty($clean_address[$key])) { unset($clean_address[$key]); } } } // Only include address if we have at least one valid field if (!empty($clean_address)) { $args['address'] = $clean_address; } else { unset($args['address']); } } elseif (isset($args['address']) && !is_array($args['address'])) { // Remove address if it's not in array format unset($args['address']); } // 4. Fix potential phone number format issues if (isset($args['phone'])) { // Remove all non-numeric characters except + (for international format) $phone = preg_replace('/[^0-9+]/', '', $args['phone']); if (!empty($phone)) { $args['phone'] = $phone; } else { unset($args['phone']); } } // 5. Make sure metadata is in correct format if (isset($args['metadata']) && !is_array($args['metadata'])) { unset($args['metadata']); } elseif (isset($args['metadata'])) { // Clean metadata values - only strings allowed foreach ($args['metadata'] as $key => $value) { if (!is_string($value) && !is_numeric($value)) { $args['metadata'][$key] = (string)$value; } } } // 6. Make sure desc/description is a string if (isset($args['description']) && !is_string($args['description'])) { $args['description'] = (string)$args['description']; } // 7. Remove any empty parameters foreach ($args as $key => $value) { if ($value === '' || $value === null) { unset($args[$key]); } } return $args; } add_filter('edds_create_customer_args', 'fix_edd_stripe_customer_creation', 9999); // High priority to run last /** * Fix payment intent creation to work with existing customers */ function fix_edd_stripe_payment_intent($args) { // Make sure we have valid data if (!is_array($args)) { return $args; } // Sometimes billing_details can cause issues if not properly formatted if (isset($args['billing_details'])) { // Ensure address is an array if present if (isset($args['billing_details']['address']) && !is_array($args['billing_details']['address'])) { unset($args['billing_details']['address']); } // Clean up empty values from billing_details foreach ($args['billing_details'] as $key => $value) { if (empty($value)) { unset($args['billing_details'][$key]); } } // If all billing details were removed, remove the entire property if (empty($args['billing_details'])) { unset($args['billing_details']); } } // Same for shipping if (isset($args['shipping'])) { if (isset($args['shipping']['address']) && !is_array($args['shipping']['address'])) { unset($args['shipping']['address']); } // If address was removed, remove shipping entirely if (!isset($args['shipping']['address']) || empty($args['shipping']['address'])) { unset($args['shipping']); } } return $args; } add_filter('edds_create_payment_intent_args', 'fix_edd_stripe_payment_intent', 9999); /** * Handle errors during customer creation to provide more insight */ function fix_edd_stripe_handle_customer_error($error_data, $error_obj) { // Check if this is a customer creation error if (strpos($error_data['message'], 'Unable to create customer') !== false) { // Add additional information to help debugging error_log('EDD Stripe Customer Creation Error: ' . print_r($error_obj, true)); // Modify error message to be more helpful $error_data['message'] = 'Unable to create customer in Stripe. Please ensure your billing information is complete and valid.'; } return $error_data; } add_filter('edds_api_request_error', 'fix_edd_stripe_handle_customer_error', 10, 2); /** * Last resort - fallback function for when regular customer creation fails * This uses a simplified approach to avoid common issues */ function fix_edd_stripe_customer_creation_fallback($customer_id, $args, $error) { // Only run if customer creation failed if (!is_wp_error($customer_id) || $customer_id !== false) { return $customer_id; } // Try to get the email from args $email = !empty($args['email']) ? $args['email'] : ''; // If no email, we can't create a customer if (empty($email)) { return $customer_id; // Return original error } try { // Include mandatory Stripe files if not already included if (class_exists('\EDD\Vendors\Stripe\Customer') && function_exists('edds_api_request')) { // Create a minimal customer with just the required fields $min_args = array( 'email' => $email, 'metadata' => array( 'edd_customer_id' => isset($args['metadata']['edd_customer_id']) ? $args['metadata']['edd_customer_id'] : '0' ) ); // Add name if available and valid if (!empty($args['name'])) { $min_args['name'] = sanitize_text_field($args['name']); } // Create customer using the API $customer = edds_api_request('Customer', 'create', $min_args); if (!empty($customer->id)) { // Log success error_log('EDD Stripe: Successfully created customer using fallback method: ' . $customer->id); return $customer->id; } } } catch (Exception $e) { // Log fallback error error_log('EDD Stripe Customer Fallback Error: ' . $e->getMessage()); } // If we get here, even fallback failed return $customer_id; } // Hook to a specific function related to customer creation // Note: This is a hypothetical hook - you may need to find the right one in your EDD Stripe plugin // add_filter('edds_create_customer_result', 'fix_edd_stripe_customer_creation_fallback', 999, 3);