Bosanska lokalizacija "Odoo" open-source platforme: eCommerce modul za kartično plaćanje "Monri": modul payment_monri_pay_by_link


Video


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:

Pregled korpe u Odoo eCommerce

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

Odabir Monri kao načina plaćanja

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:

Monri hostovana stranica za unos kartice

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

Čekanje potvrde plaćanja

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:

Uspješno potvrđena narudžba

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

  1. Checkout u Odoo-u: Kupac završi narudžbu i odabere Monri kao način plaćanja
  2. Create payment: Odoo server šalje potpisani REST zahtjev na ipg.monri.com/v2/terminal-entry/create-or-update sa iznosom, valutom, order brojem i podacima kupca
  3. Payment URL: Monri vraća hostovani payment_url
  4. Redirekcija: Kupčev browser se preusmjerava na Monri platnu stranicu gdje unosi podatke o kartici
  5. Webhook: Monri šalje asinkroni POST na /payment/monri/callback sa rezultatom
  6. Return URL: Istovremeno, kupac se vraća na /payment/monri/return gdje 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:

  1. Provjera akreditiva (authenticity_token, merchant_key)
  2. Generisanje WP3-v2.1 potpisa
  3. Poziv create-payment endpoint-a
  4. Parsiranje payment_url iz 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