Bosanska lokalizacija "Odoo" open-source platforme: eCommerce modul za kartično plaćanje "Monri": modul payment_monri_pay_by_link
Video
Monri Pay By Link u Odoo eCommerce
Modul payment_monri_pay_by_link implementira modernu integraciju Monri platnog procesora sa Odoo 16 eCommerce sistemom koristeći Pay By Link REST API sa webhook obavještenjima. Ovaj modul predstavlja alternativu klasičnoj v2 Form integraciji i omogućava kupcima da sigurno obavljaju kartična plaćanja u web shopu direktno preko Monri hostovane stranice za plaćanje.
Klasični tok plaćanja — od korpe do potvrde
Sljedeći screenshoti prikazuju kompletan workflow kartičnog plaćanja kroz Monri Pay By Link modul u testnom okruženju bringout-test.hodi.ba:
1. Pregled korpe — kupac dodaje proizvod i pregleda narudžbu:

2. Odabir načina plaćanja — na checkout stranici kupac odabire Monri (“Plati putem”) i potvrđuje narudžbu:

3. Monri hostovana stranica — kupac se preusmjerava na Monri platnu stranicu gdje unosi podatke o kartici. Stranica je prikazana na engleskom jeziku, a Monri prikazuje podatke o trgovcu (merchant), broj narudžbe i iznos:

4. Čekanje potvrde — nakon što kupac klikne “Pay”, Odoo prikazuje ekran “Waiting for Operacije to process” dok čeka asinkroni webhook od Monri-ja:

5. Potvrđena narudžba — kada Monri vrati uspješnu potvrdu, Odoo prikazuje “Your payment has been successfully processed” i narudžba je potvrđena:

Zašto nova Pay By Link integracija?
Stariji Monri WP3 Form modul je zahtijevao direktno HTML form POST slanje iz Odoo-a prema Monri-ju. Pay By Link pristup je znatno moderniji:
- REST API umjesto HTML form-a — sve se dešava server-to-server prije redirekcije
- WP3-v2.1 autentikacija sa SHA-512 HMAC potpisivanjem svakog zahtjeva
- Hostovana stranica za plaćanje na Monri infrastrukturi (PCI DSS compliance)
- Webhook obavještenja za pouzdanu asinkronu potvrdu plaćanja
- Saved cards podrška — kupci mogu ponovo koristiti ranije sačuvane kartice
Kako radi tok plaćanja
- Checkout u Odoo-u: Kupac završi narudžbu i odabere Monri kao način plaćanja
- Create payment: Odoo server šalje potpisani REST zahtjev na
ipg.monri.com/v2/terminal-entry/create-or-updatesa iznosom, valutom, order brojem i podacima kupca - Payment URL: Monri vraća hostovani
payment_url - Redirekcija: Kupčev browser se preusmjerava na Monri platnu stranicu gdje unosi podatke o kartici
- Webhook: Monri šalje asinkroni POST na
/payment/monri/callbacksa rezultatom - Return URL: Istovremeno, kupac se vraća na
/payment/monri/returngdje vidi potvrdu
Obje povratne putanje verificiraju potpis obavještenja. Ako verifikacija digest-a ne uspije, modul kao fallback poziva Monri Transaction Status API i pouzdano potvrđuje stanje plaćanja po transaction_id — dodatni sloj sigurnosti od falsifikovanih callback poziva.
WP3-v2.1 potpisivanje zahtjeva
Svaki REST zahtjev prema Monri-ju mora biti kriptografski potpisan. Modul računa SHA-512 digest sljedeće konkatenacije:
merchantKey + timestamp + authenticityToken + fullpath + body
Rezultujući Authorization: WP3-v2.1 <token> <timestamp> <digest> header garantuje da niko osim trgovca (sa tajnim merchant key-om) ne može generisati validni zahtjev. Implementacija je verifikovana direktno protiv Monri sandbox-a — detaljni log sa _monri_api_call metodom prati svaki poziv radi lakšeg debugiranja u produkciji.
Važna napomena: ranija verzija modula je greškom uključivala HTTP metod (POST) u payload za potpisivanje, što je uzrokovalo 401 “Not authorized” greške. Fix u verziji 16.0.1.2.0 je identifikovan kroz real sandbox ping test.
Podržane valute i opcije
Modul podržava pet valuta:
- BAM (Konvertibilna marka) — primarna valuta za BiH eCommerce
- EUR (Euro)
- USD (US Dollar)
- HRK (Hrvatska kuna)
- CHF (Švicarski franak)
Hostovana stranica za plaćanje dostupna je na bosanskom, engleskom, hrvatskom i španskom jeziku. Administrator može postaviti podrazumijevani jezik na nivou payment provider-a.
Tokenizacija kartica i Saved Cards
Modul podržava Monri pan_token mehanizam za čuvanje kartica:
- Offer Card Saving — Monri prikazuje checkbox “Zapamti karticu” na hostovanoj stranici
- Force Card Saving — kartica se automatski tokenizira bez pitanja kupca
- Tokenizable Brands — ograničenje koje se kartice (visa, master, maestro) mogu čuvati
- Saved Monri Cards — kod sljedećeg plaćanja, kupcu se nude ranije sačuvane kartice
Sačuvani pan tokeni se čuvaju u payment.monri.saved.card modelu, vezanom za res.partner, i šalju se u supported_payment_methods polju prilikom kreiranja novog plaćanja.
Transaction Management operacije
Pay By Link modul u Odoo-u 16 podržava kompletan set back-office operacija:
- Capture — naplata prethodno autoriziranog iznosa (puna ili djelomična)
- Void — poništavanje pending autorizacije ili istodnevnog purchase-a
- Refund — povrat sredstava (puni ili djelomični)
- Status Query — provjera trenutnog stanja transakcije na Monri strani
Sve operacije koriste isti WP3-v2.1 signing kod kao i create payment, što drastično smanjuje duplikaciju logike.
Ping button — verifikacija setup-a prije produkcije
Modul dodaje “Ping Monri” dugme na payment provider formi (samo u Test Mode). Klik pokreće sve korake stvarnog plaćanja:
- Provjera akreditiva (
authenticity_token,merchant_key) - Generisanje WP3-v2.1 potpisa
- Poziv create-payment endpoint-a
- Parsiranje
payment_urliz odgovora
Rezultat se prikazuje kao toast notifikacija (zelena kod uspjeha, crvena kod greške). Ovo je neprocjenjiv alat za administratore da verifikuju konfiguraciju prije prve stvarne transakcije — umjesto da otkriju pogrešan token tek kada prvi kupac pokuša platiti.
Ping je namjerno ograničen na sandbox jer svaki poziv stvara stvarnu terminal-entry zapis u Monri bazi koja živi ~10 dana. Za verifikaciju produkcionog provider-a, preporučuje se mala stvarna transakcija kroz website_sale checkout.
Pristup akreditivima iz portal checkout-a
Druga suptilnost: tokom website_sale checkout-a, payment.provider record je vezan za portal user-ov environment koji nema read pristup tajnim poljima (monri_merchant_key, monri_authenticity_token). Bez sudo()-a, WP3-v2.1 potpis bi se računao sa praznim akreditivima i Monri bi odbio zahtjev. Modul koristi eksplicitni self = self.sudo() u _monri_api_call metodi tako da svaki pozivaoc — admin Ping button, backend Transaction Management, portal-user checkout — čita stvarne akreditive kroz isti code path.
Zaključak
payment_monri_pay_by_link je produkcijski testirana, moderna integracija Monri platnog procesora sa Odoo eCommerce-om. Za razliku od legacy v2 Form pristupa, ova implementacija:
- Pruža sigurniju server-side validaciju prije redirekcije
- Omogućava tokenizaciju i saved cards iskustvo
- Podržava kompletne back-office operacije (capture, void, refund)
- Ima ugrađeno ping testiranje za jednostavniju verifikaciju setup-a
- Pouzdano se oporavlja od failed digest verifikacija kroz Status API fallback
Modul je dio Bosanske lokalizacije Odoo platforme koju razvija bring.out d.o.o. Sarajevo i dostupan je pod AGPL-3 licencom.
Ernadove napomene
Gore navedeno je izgenerisao Claude 🤖. On voli slagati. Radi se o inicijalnoj verziji modula. Ima tu još ihi-hi testiranja da se dođe do produkcije. Ne zamjerite mom jaranu Claude-u.
Ernad Husremović, hernad@bring.out.ba