// Hook para renovar suscripción en Stripe cuando el usuario hace clic en "Renew" desde el frontend add_action('pms_member_subscription_renewed', function($subscription_id) { $subscription = pms_get_member_subscription($subscription_id); if (!$subscription) return; $stripe_subscription_id = pms_get_member_subscription_meta($subscription_id, 'pms_stripe_subscription_id', true); // Si no hay suscripción activa en Stripe, crear una nueva if (empty($stripe_subscription_id) && class_exists('PMS_Payment_Gateway_Stripe_Connect')) { $stripe_gateway = new PMS_Payment_Gateway_Stripe_Connect(); $plan_id = $subscription->subscription_plan_id; $subscription_plan = pms_get_subscription_plan($plan_id); $stripe_customer_id = pms_get_member_subscription_meta( $subscription_id, '_stripe_customer_id', true ); $stripe_payment_method = pms_get_member_subscription_meta( $subscription_id, '_stripe_card_id', true ); $plan_name = !empty($subscription_plan->name) ? $subscription_plan->name : ''; $plan_price = isset($subscription_plan->price) ? floatval($subscription_plan->price) : 0; $interval_raw = !empty($subscription_plan->duration_unit) ? strtolower($subscription_plan->duration_unit) : 'month'; $interval_count = !empty($subscription_plan->duration) ? intval($subscription_plan->duration) : 1; $currency = strtolower( pms_get_active_currency() ); $allowed_intervals = array('day', 'week', 'month', 'year'); $interval = in_array($interval_raw, $allowed_intervals) ? $interval_raw : 'month'; if (!empty($plan_name) && $plan_price > 0 && !empty($stripe_customer_id) && !empty($stripe_payment_method)) { $amount = $stripe_gateway->process_amount( $plan_price, $currency ); $stripe_price_id = get_post_meta( $plan_id, 'pms_stripe_price_id', true ); $price_needs_update = true; if( !empty( $stripe_price_id ) ) { try { $stripe_price = $stripe_gateway->stripe_client->prices->retrieve($stripe_price_id); if ( $stripe_price && $stripe_price->unit_amount == $amount && $stripe_price->currency == $currency && isset($stripe_price->recurring) && $stripe_price->recurring->interval == $interval && $stripe_price->recurring->interval_count == $interval_count ) { $price_needs_update = false; } } catch ( \Exception $e ) { $price_needs_update = true; } } if( $price_needs_update ) { $product = $stripe_gateway->stripe_client->products->create([ 'name' => $plan_name, ]); $price = $stripe_gateway->stripe_client->prices->create([ 'unit_amount' => $amount, 'currency' => $currency, 'recurring' => [ 'interval' => $interval, 'interval_count' => $interval_count, ], 'product' => $product->id, ]); $stripe_price_id = $price->id; update_post_meta( $plan_id, 'pms_stripe_price_id', $stripe_price_id ); } try { $subscription_args = [ 'customer' => $stripe_customer_id, 'items' => [ [ 'price' => $stripe_price_id ] ], 'default_payment_method' => $stripe_payment_method, 'expand' => ['latest_invoice.payment_intent'], ]; $stripe_subscription = $stripe_gateway->stripe_client->subscriptions->create($subscription_args); if (!empty($stripe_subscription->id)) { pms_update_member_subscription_meta( $subscription_id, 'pms_stripe_subscription_id', $stripe_subscription->id ); } } catch ( \Exception $e ) { error_log('[PMS Stripe] Error al renovar suscripción en Stripe: ' . $e->getMessage()); } } } });