Z předchozích dílů seriálu o Stripe je už jasné, proč jsem si nakonec vybral řešení Stipe Invoicing. Takže se mrkneme konkrétně, jak na to.
Stripe a Drupal
Pro Drupal existuje určitě integrace s celým řešení pro provoz e-shopu, tedy s Drupal Commerce, a to konkrétně díky modulu Commerce Stripe https://www.drupal.org/project/commerce_stripe. Ale pro napojení na Stripe není vůbec nutné provozovat Drupal Commerce, stačí si nainstalovat modul Stripe https://www.drupal.org/project/stripe nebo Stripe API https://www.drupal.org/project/stripe_api, které integrují Stripe PHP knihovnu do Drupalu. Existuje i modul Stripe's webform integration https://www.drupal.org/project/stripe_webform pro snadnou integraci s Webformem.
Návrh řešení
Nejdřív si popíšeme, co vlastně budeme vytvářet, jak budeme postupovat. Dejme tomu, že chceme prodávat “vstupenky“ na virtuální event, a to buď na dopolední konferenci, nebo na odpolední workshop, nebo na obojí.
- Vytvoření Product/Prices ve Stripe
- Registrační stránka s formulářem - custom form se seznamem Products ze Stripe a vlastními políčky typu jméno, email …
- Summary stránka, pro finální přehled - tlačítka zpět a zaplatit
- Přesměrování na Stripe Hosted Invoice page, automatické zaslání Invoice zákazníkovi
- Po úspěšné platbě poslat zákazníkovi Receipt a sobě si poslat notifikaci na mail
- BONUS: SalesForce a Hopin
1. Vytvoření Product/Prices ve Stripe
Podle návrhu řešení si vytvoříme 3x Product, s patřičnou Price
- Product Vstupenka na konferenci a workshop, Price 300EUR
- Vstupenka na konferenci, 200EUR
- Vstupenka na workshop, 150EUR
Product může mít jméno stylem "Vstupenka na konferenci a workshop", nebo "Jméno konference: Vstupenka na konferenci a workshop". Obojí je možné, ale v případě první varianty je třeba ještě jméno konference někde zobrazit na Invoice - k tomu může sloužit oblast header, v druhém případě pak na registrační formuláři budeme mít 3x Product začínají stejně, tedy "Jméno konference: …". Druhá možnost je asi lepší, protože při sestavování formuláře můžeme jméno snadno přepsat. A ve Stripu to bude přehlednější, v případě více konferencí tam nebude mít několikrát nic neříkající popisek "Vstupenka na konferenci".
Dále v sekci Settings » Invoice template https://dashboard.stripe.com/settings/billing/invoice si nastavíme výchozí hodnoty pro Invoice.
2. Registrační stránka s formulářem
Nejdříve si nainstalujeme modul Stripe https://www.drupal.org/project/stripe. V nastavení vyplníme Stripe API keys.
Pozor na to, že v aktuální verzi modulu 8.x-1.0 jsou klíče pak vyexportovány v konfiguraci. Stripe Live Secret key by se neměl nikde takto vyskytovat. Místo toho si vše můžete definovat v settings.php souboru:
$config['stripe.settings']['environment'] = 'test';
I ten se ale nejspíš vyskytuje ve verzovacích systémech, zálohách. Takže Live secret key si můžete třeba ze settings.php includovat z nějakého souboru úplně mimo:
$config['stripe.settings']['apikey']['test']['public'] = 'pk_test_...';
$config['stripe.settings']['apikey']['test']['secret'] = 'sk_test_...';
if (file_exists('/etc/stripe.conf'))
Module Stripe API https://www.drupal.org/project/stripe_api (netestoval jsem) ukládá API klíče pomocí modulu Key https://www.drupal.org/project/key, takže bezpečněji.
{ include_once ('/etc/stripe.conf');
}
Následuje registrační formulář. Aby byl univerzální, vytvořil jsem si to následovně. V Drupalu mám node typu Event, stránka se pak skládá z Paragraphs. Jeden je definovaný jako Stripe, má políčka jméno tlačítka a pak neomezený počet políček Stripe_Product_Ids. Níže je ukázka částí kódu.
Načtení knihovny:
use Stripe\StripeClient;
Získání klíčů dle konfigurace, vytvoření Test nebo Live spojení na Stripe:
$config = \Drupal::config('stripe.settings');
A např. ukázka získání objektu Price dle daného Price ID (získáme např. zadanou cenu a měnu), a pak získání objektu Product, kde získáme např. jméno produktu:
$stripe = new StripeClient($config->get('apikey.' . $config->get('environment') . '.secret'));
$price = $stripe->prices->retrieve($price_id)->toArray();
Vše dobře zdokumentováno https://stripe.com/docs/api?lang=php.
$product = $stripe->products->retrieve($price['product'])->toArray();
Formulář se pak skládá z generované sekce Stripe Products, podle toho, z jakého nodu přicházím. Podle zadaných Price IDs si najdu související Product, jehož jméno zobrazím jako jméno vstupenky. Druhá část formuláře je pak univerzální - jméno, příjmení, email. Tento formulář je vygenerovaný vlastní custom modulem, který je takto možný použít pro registraci i na další eventy. Možná by se dal použít i webform, ale já jsem šel cestou vlastního formuláře.
3. Summary stránka
Takhle stránka je jen přehled pro zákazníka, aby viděl, co si zvolil za vstupenku a jaké zadal údaje. Také je zde celková cena, která může být např. navýšena o daň (DPH), nebo naopak snížená při použití nějakého slevového kupónu - tedy pokud to implementujeme. Data mezi stránkami si přenáším pomocí Drupal sessions.
$session = \Drupal::request()->getSession();
Nejdůležitější je zde tlačítko pro potvrzení a dokončení registrace. Po jeho stisknutí se na pozadí odehraje komunikace se Stripe, jejíž výsledkem je vytvoření Invoice objektu. Ten obsahuje i URL, kde se odehrává samotné placení (Hosted invoice page), a na tu můžeme zákazníka rovnou přesměrovat. Já ale radši zákazníkovi nejdříve ukážu "Thank you" stránku s nějakým potvrzovacím/děkovným textem a informací, že Invoice (doklad předcházející placení) byla právě odeslána na zadaný email. A dále je na "Thank you" stránce také odkaz na Hosted invoice page.
$details = ($session->get('stripe_payment.details')) ? $session->get('stripe_payment.details') : [];
...
$session->set('stripe_payment.details', $details);
Automatické zasílání Invoice je volitelné, ale rozhodně myslím očekávané. Součástí emailu je opět odkaz na Hosted invoice page, a ten může být i součástí PDF Invoice přílohy.
4. Stripe Hosted Invoice page
Po potvrzení registrace - viz. předchozí stránka - dojde tedy na pozadí k následujícím akcím:
- vezmeme zadaný email, a otestujeme, jestli už existuje zákazník s takovým emailem (List all customers s parametrem email https://stripe.com/docs/api/customers/list)
- zákazníka buď vytvoříme, nebo aktualizujeme (jméno, příjmení …)
- nyní vytvoříme Invoice $invoice = $stripe->invoices->create($invoice_template); (Create an invoice https://stripe.com/docs/api/invoices/create), ke které přidáme patřičné Invoice Items $stripe->invoiceItems->create($item); (Create an invoice item https://stripe.com/docs/api/invoiceitems/create). Invoice item přitom vlastně odpovídá vybrané vstupence, tedy Price Id.
- nakonec se Invoice musí finalizovat $invoice->finalizeInvoice(); a případně označit k zaslání zákazníkovi $invoice->sendInvoice();
Jak bylo řečeno dříve, součástí finalizované Invoice je také URL na Hosted invoice page.
Takhle nějak to může vypadat kód pro tvorbu Invoice:
Hosted invoice page:
5. Úspěšná platba
Pokud platba úspěšně proběhla, tak se daná Hosted invoice page změní, nyní už ukazuje, že je platba provedená, a spolu s Invoice je zde nyní ke stažení i Receip = účtenka. Ta se opět dá poslat automaticky emailem.
Pokud jsme si nastavili patřičný Webhook, např. pro event invoice.paid nebo payment_intent.succeeded, měla by se nám na zadanou Endpoint URL zaslat odpověď, tedy nějaký JSON objekt. Ten můžeme využít například pro vlastní notifikaci, že proběhla platba od zákazníka jménem … a emailem …, nebo zaslat nějaké dodatečné informace (přístupové heslo …) zákazníkovi. Bohužel webhook neumožňuje definovat nějaké podmínky, např. že je to platba pro Product XYZ.
6. BONUS: SalesForce a Hopin
A je čas na slibovaný bonus. SalesForce CRM asi není třeba představovat, Hopin je oblíbená konferenční platforma pro online eventy.
Projdeme si to jen v krátkosti. V Hopin si můžeme vytvořit Event, a jemu definovat Tickets. Každý Ticket má tzv. Integration code. Možnosti přímé integrace Stripe jsou ale bohužel velmi omezené. Hopin tikety odpovídají Stripe Prices/Products.
Zároveň je třeba si vytvořit SalesForce Campaigns, opět každá kampaň odpovídá jednomu Hopin Ticketu. V definici kampaně je možné definovat políčko Hopin integration code, kam zadáme patřičný kód. Tuto funkcionalitu je třeba povolit a nastavit, viz. návody https://hopin.com/integrations/salesforce a https://hopin.zendesk.com/hc/en-us/articles/360059577592-Integrating-Sa….
Takže pokud si někdo koupí Stripe Product#1, pomocí webhooks můžeme přidat v SalesForce nového Campaign Member do příslušné kampaně, která je provázaná s Hopin, takže automaticky na straně Hopin vytvoří tzv. Magic Link Invites, který se přenese zpět i do SalesForce Campaign Member objektu.
A nyní můžeme poslat ručně přes Hopin - Send Invite poslat pozvánku zákazníkovi, nebo to můžeme třeba zautomatizovat přes SalesForce.
Vcelku geniální zřetězení, ne?
Závěr
V tomto posledním a předpokládám i nejzajímavějším díle jsme si ukázali, jak si vytvořit celý proces pro registraci na náš nějaký virtuální event. Použili jsme k tomu samotný Stripe a také Stripe modul pro Drupal, spolu s naším vlastním modulem pro registraci.
Stripe zvolené řešení se jmenuje Invoicing https://stripe.com/en-cz/invoicing, resp. Hosted invoice page https://stripe.com/docs/invoicing/hosted.
A jako bonus jsme si ukázali, že propojit to s Hopin platformou pro online eventy, popř. dokonce i se SalesForce pomocí tzv. Magic links, je velmi jednoduché, a můžeme si celý registrační proces zautomatizovat.
Možností, jak používat Stripe, je velmi mnoho. Tohle byla jen malá ukázka cesty, která se mi momentálně zdá pro moje potřeby jako nejlepší. Stripe je velmi otevřený systém - účet si můžete sami lehce založit a pustit se do testování bez nějakých limitů a omezení. Můžete začít hned teď!