Phase S4 – Abos über Stripe (E2E komplett im Testmodus): - Abo-/Recovery-Checkout: customer_creation=always + setup_future_usage=off_session - StripePaymentService::chargeAbo (off-session PaymentIntent, Idempotency-Key), StripeGateway, Provider-Dispatch im Abbuchungs-Cron (PAYONE-Pfad unverändert) - Webhook: Zahlungsmittel-Capture vor Paid-Pfad, 503 payment_not_yet_visible bei Cron-Transaktions-Race; Command stripe:process-pending-events (Cron-Ende + 10-min Scheduler) verarbeitet liegengebliebene Events nach - createNewAbo/advanceAboAfterRecoveryPayment Stripe-aware inkl. Race-Absicherung; Recovery-Orders nutzen advanceAboAfterRecoveryPayment (latenter PAYONE-Duplikat-Bug) - Migrationen: Stripe-Abo-Spalten auf shopping_payments; clearingtype varchar(3)→(20) inkl. Reparatur der zu 'str' gekürzten Live-Zeilen Phase S5 – Zahlungsart ändern (Scope: jede Zahlart, nicht nur Kreditkarte): - Stripe Checkout mode=setup ohne Abbuchung; PAYONE-Abos ziehen beim Wechsel auf Stripe um (Auslaufmodell §7.2) - AboPaymentMethodService: beginStripeChange/finalize/applyStripePaymentMethod (idempotent, detacht alte PM, card_changes-Log); Webhook setup_intent.succeeded als Sicherheitsnetz; Einstiege Portal/CRM/Berater-Kunden-Link flow-abhängig - Views/Mails flow-abhängig („Zahlungsweise" statt „Kreditkarte") Phase S7.6 – Zahlarten-Kommunikation: - Einheitliche Zahlarten-Logos (SVG) + wiederverwendbares Partial payment_logos; Checkout/Footer zeigen Kern-Zahlarten + „···"-Icon, /zahlungsarten komplett neu mit allen aktiven Stripe-Zahlarten (gegen Account-Konfiguration verifiziert) und Vorkasse (PAYONE); Sofort/SEPA entfernt Tests: StripeAboTest (15), StripePaymentMethodChangeTest (10), PaymentMethodsCommunicationTest (28), PaymentProviderManagerTest angepasst. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
21 lines
1.3 KiB
PHP
21 lines
1.3 KiB
PHP
@extends('portal.layouts.public')
|
|
|
|
@section('content')
|
|
@php($stripeChange = app(\App\Services\AboPaymentMethodService::class)->usesStripeChange())
|
|
<div class="text-center" style="max-width: 640px; margin: 0 auto;">
|
|
@if ($success)
|
|
<i class="ion ion-md-checkmark-circle text-success" style="font-size: 3rem;"></i>
|
|
<h4 class="font-weight-bold mt-3">{{ $stripeChange ? __('abo.payment_method_change_done_title') : __('abo.card_update_done_success_title') }}</h4>
|
|
<p class="text-muted">{{ $stripeChange ? __('abo.payment_method_change_success') : __('abo.card_update_done_success_copy') }}</p>
|
|
@else
|
|
<i class="ion ion-md-close-circle text-danger" style="font-size: 3rem;"></i>
|
|
<h4 class="font-weight-bold mt-3">{{ __('abo.card_update_done_failed_title') }}</h4>
|
|
<p class="text-muted">{{ $stripeChange ? __('abo.payment_method_change_done_failed_copy') : __('abo.card_update_done_failed_copy') }}</p>
|
|
@endif
|
|
|
|
<p class="text-muted mt-3">{{ __('abo.card_update_portal_hint') }}</p>
|
|
<a href="{{ \App\Services\Util::getMyMivitaPortalUrl() }}" class="btn btn-outline-secondary btn-sm">
|
|
<i class="ion ion-md-home mr-1"></i>{{ __('abo.card_update_to_portal') }}
|
|
</a>
|
|
</div>
|
|
@endsection
|