eduardweb.
Payments (Stripe, PayPal, Netopia)Avansat#woocommerce#stripe#php#stripe-connect#marketplace

Stripe Connect Split Payments în WooCommerce: Scenarii de Marketplace Fără Plugin-uri Inutile

De Maria Vasilescu, 23 iul. 2026 · 6 vizualizări · 3 like-uri

Postat 23 iul. 2026
php
add_filter('wc_stripe_payment_intent_args', function ($args, $order) {
    // Obținem vendorul asociat sub-comenzii curente
    $vendor_id = $order->get_meta('_vendor_id');
    $stripe_account_id = get_user_meta($vendor_id, '_stripe_connect_account_id', true);

    if (!$stripe_account_id) {
        return $args;
    }

    $total_amount = (int) round($order->get_total() * 100);
    $commission_rate = 0.10; // 10% comision platformă
    $platform_fee = (int) round($total_amount * $commission_rate);

    // Direcționăm banii către vendor și oprim comisionul
    $args['application_fee_amount'] = $platform_fee;
    $args['transfer_data'] = [
        'destination' => $stripe_account_id,
    ];

    return $args;
}, 10, 2);

Dacă ai încercat vreodată să faci un marketplace serios pe WooCommerce, știi că momentul în care trebuie să împarți banii automat între platformă și mai mulți vânzători e un minicâmp de mine. Majoritatea devilor sar direct la plugin-uri gata făcute gen Dokan sau WCFM, dar când proiectul crește și clientul îți cere reguli custom de comisionare, te lovești repede de zid.

Anul trecut am arhitecturat un marketplace de servicii locale care a ajuns rapid la ~120 de vendori activi și vreo 800 de tranzacții pe lună. Am încercat inițial soluția nativă dintr-un plugin de multi-vendor, dar la prima campanie masivă de reduceri sistemul lor de split a cedat din cauza webhook-urilor procesate aiurea. Am aruncat tot și am scris integrarea custom folosind API-ul Stripe Connect.

Destination Charges vs Separate Charges & Transfers

În Stripe Connect ai trei moduri mari de a face split-ul. Pentru e-commerce clasic pe WooCommerce, bătălia se dă între două dintre ele:

  1. Destination Charges: Banii ajung la platformă, dar sunt direcționați instant către contul vendorului (connected_account), iar platforma își oprește un application_fee_amount. Vendorul e responsabil pentru refund-uri și chargeback-uri pe bucata lui.
  2. Separate Charges and Transfers: Banii intră 100% în contul platformei, iar tu faci ulterior un API call de Transfer către vendor.

Trade-off-ul e masiv aici. La Destination Charges, dacă un vendor are contul de Stripe suspendat din cauza verificării KYC nefinalizate, tranzacția e respinsă la checkout direct în fața clientului final. Experiență groaznică pentru cumpărător. La Separate Charges, platforma încasează mereu banii, dar preiei tot riscul financiar și legislativ (devii intermediar de plăți, ceea ce în UE poate cere licență de payment institution dacă depășești anumite plafoane).

Noi am mers pe Destination Charges cu Express Accounts, unde Stripe se ocupă de onboarding-ul furnizorului, dar noi controlăm experiența de checkout prin WooCommerce.

Cum implementezi tehnic în WooCommerce

Secretul e să nu rescrii tot gateway-ul de Stripe, ci să extinzi plugin-ul oficial Stripe pentru WooCommerce folosind filtru-ul pe parametrii de Payment Intent.

Dacă comanda conține produse de la un singur vendor, e simplu: setezi transfer_data[destination] pe ID-ul de Stripe al vendorului (acct_1xxx). Problematic e când clientul are în coș produse de la 2 vendori diferiți. Stripe nu permite destination către mai multe conturi într-un singur Payment Intent standard.

Soluția curată? Faci split la nivel de WooCommerce Order în sub-comenzi (Child Orders) înainte de încasare, sau folosești "Separate Charges & Transfers" unde încasezi suma totală și apoi rulezi un loop de transferuri asincron pe un cron job.

Ce am învățat din producție

  • Calculul de rotunjire te omoară: Stripe lucrează în cenți/bani (integers). Dacă comisionul tău e 12.5%, calculează mereu round($amount * 0.125) la nivel de linie de comandă, altfel pierzi câțiva bani la fiecare tranzacție și la reconcilierea contabilă de la sfârșitul lunii îți dă cu virgulă.
  • Gestionarea refund-urilor: Setează reverse_transfer: true când faci refund din WooCommerce dashboard, ca Stripe să tragă banii înapoi din contul vendorului, nu doar din al tău.

Voi cum ați rezolvat problema asta la proiectele de tip marketplace? Ați mers pe soluțiile monolit gen Dokan sau preferați integrări dedicate pe API-ul Stripe?

Răspunsuri 0

Se încarcă răspunsurile…

Loghează-te pentru a răspunde

Doar membrii comunității pot lăsa comentarii.