Sistemul de facturare utilizează un sistem modular pentru integrarea cu sistemele de plată. Pentru a conecta un nou sistem, trebuie să scrieți un modul pentru el.
Selectați un nume de sistem
Fiecare sistem de plată în facturare are un nume de sistem, care poate fi format dintr-un cuvânt latin și cifre. Numele sistemului este utilizat în numele fișierelor și al claselor.
De exemplu, vom presupune că noul nostru sistem de plăți se numește "Sistem de plăți nou", iar numele sistemului este plăți noi. Aici și în continuare, noul echipament va trebui înlocuit cu numele sistemului sistemului dvs. de plată.
Fișiere și dosare
Modulele de sisteme de plată sunt stocate în folderul sistem / controlor / facturare / sistem. În interiorul acestui dosar, trebuie să creați un dosar pentru noul sistem de plată. Numele dosarului este același cu numele sistemului.
În dosarul de sistem trebuie să creați două fișiere PHP:
Un fișier care conține o descriere a setărilor sistemului de plăți.
Obținerea listei de câmpuri pentru formularul de plată
De obicei, plata în orice sistem începe cu trimiterea unui formular de plată către o adresă URL specială. furnizate de sistem. Această adresă URL este specificată în setările de sistem din panoul de administrare a facturării. Formularul este generat dinamic.
Când utilizatorul completează soldul, selectează mai întâi suma de valută pentru cumpărare și apasă "Continuă". După aceasta, se află pe pagina "Verificați corectitudinea comenzii." De fapt, această pagină este necesară deoarece afișează forma de plată pe ea. Apăsând butonul "Mergeți la plată" trimite formularul de plată către adresa URL dorită.
Metoda getPaymentFormFields () returnează un set de câmpuri care vor fi adăugate la formularul de plată. Acest set este unic pentru fiecare sistem. Setul este returnat ca o matrice, în care cheile sunt numele câmpurilor, iar elementele sunt valorile.
De exemplu, dacă sistemul nostru de plată necesită existența câmpurilor shop_id și summ. atunci metoda ar putea arăta astfel:
În plus, puteți adăuga câmpuri interactive în formularul de plată, valorile cărora utilizatorul va trebui să îl completeze. În acest caz, valoarea câmpului din matricea returnată este o instanță a clasei de câmp. De exemplu:
Prelucrarea suplimentară a datelor după formularul de plată
Unele sisteme de plăți utilizează mecanisme mai sofisticate pentru a începe o plată decât o trimitere simplă a formularului. Prin urmare, este posibil ca modulul sistemului de plăți să dețină un control complet asupra trimiterii unei cereri de plată.
Schema este implementată în trei etape:
Ca adresă de plată în setările de sistem, specificați: facturarea / pregătirea / noua plată;
Formularul de plată este încă generat, dar nu este trimis la sistem, ci la adresa URL internă. menționate mai sus;
preparePayment () metoda funcționează pe adresa URL din clasa noastră, iar această metodă singur face comunicarea cu sistemul de plăți reale (de exemplu, folosind FLEXIE) și redirecționează acolo unde este necesar.
Acest sistem este utilizat în cazurile în care:
Exemple de implementare a abordării descrise se pot vedea în modulele de cod pentru sistemele Test și Qiwi din livrarea standard de facturare.
Redefinirea unei adrese URL de plată
Unele sisteme de plată utilizează o adresă URL dinamică pentru a trimite o plată. Apoi, nu puteți specifica doar în setări, deoarece cu fiecare plată va fi diferită.
Specific pentru acest caz, metoda getPaymentURL () poate fi descrisă în clasă. care returnează adresa URL pentru trimiterea formularului de plată. Dacă această metodă nu este disponibilă, utilizați adresa URL din setările sistemului de plăți.
Exemplu de metodă din modulul sistemului OnPay:
Primiți o notificare de plată
Majoritatea sistemelor de plată pot raporta plata unei comenzi apelând o adresă URL specifică pe site-ul web al magazinului. Cel mai adesea în setările comercianților se numește URL de rezultat sau URL de stare. Apelul la această adresă URL are loc în fundal, invizibil pentru utilizator și fără a utiliza browserul său.
Când această adresă URL este apelată în clasa modulului sistem, metoda processPayment () este pornită.
În interiorul metodei, în mod obișnuit este implementat următorul algoritm:
Primim datele transferate de sistemul de plăți (numărul comenzii, suma, statutul plății etc.);
Prin numărul de ordine primim informații despre comandă din baza de date;
Verificăm corectitudinea datelor (valoarea comenzii nu este modificată, semnătura digitală este aceeași, etc.);
Dacă totul este corect - marcați comanda ca fiind plătită (moneda internă a utilizatorului este creditată la moneda internă achiziționată de acesta);
Rambursăm răspunsul în formatul cerut de sistemul de plăți.
Datele trimise adresei URL a rezultatelor fiecărui sistem de plată sunt unice. Descrierea acestora ar trebui găsită în documentația privind API a sistemului de plăți. Primirea datelor din cerere (GET / POST) are loc folosind obiectul $ request. de exemplu:
Obținerea unei comenzi pentru un ID cunoscut se face folosind modelul:
Schimbarea stadiului comenzii la "plătit" se face, de asemenea, folosind modelul:
Un exemplu de implementare a metodei pentru sistemul Robokassa:
Primiți o notificare de plată cu succes
Prin urmare, pentru a evita problemele, pe adresa URL de succes trebuie să vă asigurați că comanda este plătită și că soldul utilizatorului este completat. Și dacă nu este, atunci obligați utilizatorul să aștepte până când site-ul primește o notificare despre plată.
Deoarece numărul comenzii ajunge la adresa URL de succes împreună cu utilizatorul, metoda trebuie definită în modulul sistemului de plăți:
Această metodă ar trebui să primească de la obiectul solicitare $ valoarea codului de comandă transmis de sistemul de plăți la adresa URL de succes. și returnează-l. Utilizând facturarea facturilor primite, aceasta va găsi comanda și va verifica starea acesteia. În cazul în care comanda nu este încă plătită, facturarea va verifica starea sa la fiecare câteva secunde până la primirea notificării de plată. Utilizatorul va vedea solicitarea de a aștepta.
Primiți o notificare de neplată a plății
Nu sunt necesare acțiuni suplimentare pentru modulele sistemului de plăți pentru procesarea plăților eșuate.
Exemple de conectare
Pentru exemple de implementări ale modulelor pentru mai multe sisteme de plată, consultați dosarul sistem / controlor / facturare / sistem din pachetul de facturare.