Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /**
- * 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);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement