add_action('woocommerce_order_status_processing', 'execute_marketplace_split_payments', 10, 1);
function execute_marketplace_split_payments($order_id) {
$order = wc_get_order($order_id);
$items = $order->get_items();
// Grupăm produsele pe vendori și calculăm sumele
$vendor_amounts = [];
foreach ($items as $item) {
$vendor_id = get_post_field('post_author', $item->get_product_id());
$stripe_account_id = get_user_meta($vendor_id, 'stripe_connect_id', true);
if ($stripe_account_id) {
$vendor_amounts[$stripe_account_id] += $item->get_total();
}
}
// Inițializăm Stripe SDK
\Stripe\Stripe::setApiKey(STRIPE_SECRET_KEY);
foreach ($vendor_amounts as $stripe_account_id => $amount) {
// Oprim un comision de platformă de 10%
$commission = $amount * 0.10;
$transfer_amount = ($amount - $commission) * 100; // Stripe lucrează în bani/cenți
try {
\Stripe\Transfer::create([
'amount' => $transfer_amount,
'currency' => 'ron',
'destination' => $stripe_account_id,
'transfer_group' => 'order_' . $order_id,
'description' => 'Split pentru comanda #' . $order_id
]);
} catch (\Exception $e) {
$order->add_order_note('Eroare transfer Stripe Connect: ' . $e->getMessage());
}
}
}Salutare. Dacă aveți de făcut un marketplace pe WooCommerce și clientul vă cere split payments (banii de la cumpărător să plece direct X% la vendor și Y% comision la platformă), Stripe Connect e cam singura variantă stabilă în România. Am implementat asta anul trecut pentru un marketplace de produse locale cu vreo 150 de vendori activi și am redus timpul de reconciliere financiară al clientului de la 3 zile pe lună la zero.
Dar drumul până acolo e plin de capcane tehnice și de business. Hai să vedem cum se face asta corect.
Custom vs Express vs Standard. Ce alegem?
Când începi cu Stripe Connect, ai trei opțiuni. Fiecare vine cu trade-off-uri majore:
- Standard: Vendorii își fac singuri cont de Stripe și îl conectează la platforma ta. E cel mai simplu de implementat, dar UX-ul e horror. Vendorul vede tot dashboard-ul Stripe, iar tu nu poți controla fluxul de onboarding.
- Custom: Tu controlezi totul, inclusiv UI-ul de onboarding. Sună bine, dar te rupe la mentenanță. Trebuie să scrii tu formularele pentru KYC (Know Your Customer), upload de buletine, validări de firme. E muncă de chinez și te blochezi în legislația GDPR și AML.
- Express: Compromisul ideal. Stripe se ocupă de onboarding, KYC și dashboard-ul vendorului (care e branded cu logo-ul tău), iar tu controlezi fluxul de bani.
Trade-off-ul sincer: Stripe Express costă 2$ pe lună pentru fiecare cont activ de vendor, plus 0.25% + 0.25$ per payout. Clientul meu a preferat să plătească acești bani decât să-mi plătească mie 80 de ore de dev pentru un flux Custom.
Problema critică: Coșul de cumpărături mixt
Majoritatea plugin-urilor de pe piață crapă când ai în coș produse de la Vendorul A și Vendorul B în același timp. Dacă folosești Direct Charges (unde plata se duce direct la vendor și tu tragi comisionul), nu poți împărți o singură tranzacție de card la doi vendori diferiți.
Soluția? Separate Charges and Transfers.
Banii intră mai întâi în contul tău de platformă (ca un singur Payment Intent), iar apoi, în fundal, declanșezi transferuri separate către vendori folosind API-ul Stripe. Pentru asta, trebuie să folosești un transfer_group comun.
Cum arată codul de transfer
Nu te baza pe webhook-urile default din WooCommerce pentru asta. Cel mai sigur este să interceptezi momentul în care comanda trece în starea processing (adică plata a fost încasată cu succes pe platformă) și să rulezi transferurile asincron.