Sisteme de plăți

PayPal - unul dintre cele mai renumite sisteme de plată din lume, utilizat pentru plățile prin Internet
Plățile prin PayPal sunt sigure dacă utilizați corect funcțiile furnizate

Tipuri de plăți

Ultimele două metode vor fi luate în considerare în articol. De asemenea, nu mă gândesc la metoda în care se formează coșul pe site-ul nostru, iar apoi tot conținutul coșului este transferat în PayPal.

Procesul de plată

Cumpărați "cu un singur clic"

Cea mai simplă formă este:

Descrierea parametrilor principali

Codul monetar. Valorile posibile sunt: ​​"USD", "EUR", "GBP", "YEN", "CAD". Valoarea implicită este "USD"

Acum trebuie să verificați suma și moneda plății. Această verificare este necesară, deoarece un potențial atacator nu este dificil de a schimba cantitatea în forma, în cazul unui abonament, ar trebui să verificați toți parametrii de abonament (disponibilitatea, durata și costul perioadei de probă, durata și costul ciclului abonamentului de bază, etc.).

IPN pentru aceeași tranzacție pot fi trimise de mai multe ori. De exemplu, dacă o plată din orice motiv a fost întârziată, primul IPN va fi transferat imediat după plată. După finalizarea sau anularea plății, va fi trimis un al doilea IPN. Dacă scriptul dvs. IPN nu returnează starea HTTP 200, PayPal va reîncerca să trimită IPN după un timp. Prima repetare va fi după 10 secunde, apoi dacă este necesar după 20, apoi după 40, 80, etc. (până la 24 de ore). Dacă în termen de 4 zile răspunsul așteptat din scriptul dvs. nu este primit, încercările vor fi încheiate. Acest lucru poate fi folosit pentru a nu pierde date despre o tranzacție în cazul unei erori în scriptul dvs. IPN. De exemplu, dacă un script nu se poate conecta la o bază de date în care stochează datele tranzacției, acesta poate returna starea HTTP 500, iar IPN va fi retrimis mai târziu. Un IPN duplicat va fi, de asemenea, trimis dacă scriptul IPN nu contactează serverul PayPal pentru a verifica tranzacția.

După cum puteți vedea din descrierea returnării parametrilor, rm și notify_url. Un IPN poate fi precedat de două scripturi specificate în parametrii return și notify_url. Există două diferențe între ele:
  1. IPN pentru retur vor fi trimise o singură dată, imediat după plată. notify_url poate fi apelat de mai multe ori (a se vedea paragraful anterior).
  2. Rezultatul scriptului de returnare va fi afișat utilizatorului. Rețineți că, dacă rezultatul conține referințe, acestea trebuie să fie absolute. Ieșirea scriptului notify_url nu este afișată în browser-ul utilizatorului.

Variabilele POST primite conțin informații despre tranzacție. Cele mai frecvent utilizate variabile sunt:

Tipul tranzacției. Valorile posibile sunt:
"web_accept" - plata a fost efectuată utilizând butonul "Cumpărați acum"
"cart" - plata a fost efectuată cu ajutorul coșului de cumpărături PayPal încorporat
"send_money" - plata a fost efectuată folosind funcția "Trimiteți bani"
"inversare" - banii au fost returnați cumpărătorului la inițiativa acestuia

Starea plății. Valorile posibile sunt:
"Finalizat" - tranzacția a fost încheiată cu succes, banii au fost transferați în contul vânzătorului. În cazul txn_type = "inversarea" înseamnă că banii au fost returnați în contul cumpărătorului
"În așteptare" - plata este întârziată. Motivul întârzierii este în variabila pending_reason. După ce plata a fost încheiată sau anulată, PayPal va trimite o altă notificare.
"Failed" - plata a eșuat. Această condiție este posibilă numai dacă plata a fost efectuată dintr-un cont bancar
"Denied" - plata a fost anulată de către vânzător. Această condiție apare atunci când vânzătorul a anulat o plată, a cărei stare era Pending
"Refunded" - banii au fost returnați cumpărătorului. Această condiție survine atunci când vânzătorul a anulat o plată, a cărei stare a fost finalizată

Scripturi scrise

Plata pentru bunurile din "coș"

Nu voi descrie implementarea actuală a "coșului" aici. Comentariul meu este că, în cazul nostru sesiune pentru a stoca conținutul coșului nu sunt adecvate, deoarece nu putem recupera sesiunea de date în nostru IPN-script. Din motive de definire, cred că $ _COOKIE ['cart_id'] conține identificatorul coșului, prin care distingem coșul unui utilizator de celălalt. Permiteți conținutul coșului din baza noastră de date să fie stocat în baza de date MySQL, în tabelul cu următoarea structură: După efectuarea plății, coșul cumpărătorului trebuie să fie șters și să fie introduse intrările în tabelul de comandă. Informațiile generale despre comenzi vor fi stocate în ordinele de masă. Detaliile comenzii vor fi stocate în ordinea_detalii de tabel

Codul scriptului care emite formularul de comandă (checkout)

/ *
aici este codul care se conectează la baza de date
și afișarea conținutului coșului
* /

Cod Script payment_success.php

/ *
aici este codul care se conectează la baza de date
* /

/ ********
Vom asigura că această tranzacție nu este
a fost procesată mai devreme
******** /
$ r = mysql_query ("SELECT ordine_id DE LA ORDINARE WHERE txn_id = '". $ _POST ["txn_id"].
listă ($ duplicate) = mysql_fetch_row ($ r);
mysql_free_result ($ r);
dacă (duplicat $) mor ("Mă simt ca și când te-am întâlnit înainte");
/ ********
verificați suma de plată
******** /
$ cart_id = intval ($ _POST ['item_number']);
$ r = mysql_query ("SELECT suma (preț * cantitate), COUNT (cart_id) FROM cărucior
Unde cart_id = ". $ Cart_id);
listă ($ total. $ nitems) = mysql_fetch_row ($ r);
mysql_free_result ($ r);
dacă (! $ nitems) // nu a putut restabili conținutul coșului de reciclare
<
msgstr "Nu se poate restabili conținutul coșului de gunoi \ r \ nCart ID:".
$ cart_id. "\ r \ nTransaction ID:". $ _POST ["txn_id"]);
die ("Nu-mi amintesc pentru ce ați plătit. Vă rugăm să contactați" $ adminemail);
>
dacă {$ total! = $ _POST ["mc_gross"] || $ _POST ["mc_currency"]! = $ valută)
<
mail ($ adminemail. "Eroare IPN". "Neconcordanța sumelor de plată \ r \ nCart ID:"
. $ cart_id. "\ r \ nTransaction ID:". $ _POST ["txn_id"]);
mor ("Out of money? Vă rugăm să contactați". $ adminemail);
>
/ ********
verificările sunt finalizate. formarea unei ordine
******** /
$ order_date = data ("Y-m-d H: i: s". strtotime ($ _POST ["payment_date"]));
mysql_query ("INSERT INTO commands SET
txn_id = ''. $ _POST ["txn_id"]. ',
order_date = '$ order_date',
order_total = total $.
e-mail = ''. $ _POST ["payer_email"].
first_name = '' mysql_escape_string ($ _POST ["first_name"]).
last_name = '. mysql_escape_string ($ _POST ["last_name"]).
stradă = 'mysql_escape_string ($ _POST ["address_street"]) "",
oraș = 'mysql_escape_string ($ _POST ["address_city"]).
state = 'mysql_escape_string ($ _POST ["adresa_state"]).
zip = '' mysql_escape_string ($ _POST ["adresa_zip"]) "",
țară = ' "([address_country "]. mysql_escape_string $ _POST)"."' „);
$ ord_id = mysql_insert_id ();
$ r = mysql_query ("SELECT * FROM CARTE WHERE cart_id =". $ cart_id);
în timp ce ($ row = mysql_fetch_assoc ($ r))
<
mysql_query ("INSERT IN order_details SET
order_id = $ ordine_id.
item_id = ". $ row ['item_id'].",
pret = ". $ row ['price'].",
cantitate = ". $ row ['quantity']);
>
mysql_free_result ($ r);
mysql_query ("DELETE FROM CARTE WHERE cart_id =". $ cart_id);
mail "($ adminemail" Ordine nouă "." Ordine nouă \ r \ nOrder ID: ". $ order_id." \ r \ nTransaction ID: "
. $ _POST ["txn_id"]);
/ *
Vă informăm că ordinul este acceptat, vă mulțumim pentru achiziționarea și
oferta de a cumpara altceva * /
?>

Utilizarea parametrului de returnare este convenabilă prin faptul că vă permite să trimiteți rezultatul verificării către utilizator imediat după efectuarea plății. Cu toate acestea, un astfel de cec nu dă 100% certitudine că banii au fost facturați în contul nostru. De exemplu, dacă cumpărătorul plătește un cec electronic (e-cec), banii vor fi creditați numai după procesarea cecului de către bancă, iar înscrierea nu este garantată. notify-url este lipsit de acest neajuns, deoarece permite urmărirea momentului primirii efective a banilor. În exemplul următor, vă vom arăta cum puteți gestiona IPN-urile repetate prin exemplul unui abonament la conținut.

Să existe o anumită resursă la care vrem să oferim acces plătit. Plata este de 10 USD pe lună, este oferită o săptămână de acces liber limitat.

Datele abonaților sunt stocate în tabelul abonaților. Un script care verifică numele de utilizator și parola va trebui să utilizeze câmpul limitat pentru a determina dacă utilizatorul ar trebui să primească acces complet sau restricționat.

Codul scriptului care afișează formularul de abonament

Vom oferi PayPal (usr_manage = 1) pentru numele de utilizator și parola. După abonament, scriptul ipn.php va primi IPN (txn_type = subscr_signup). Dacă starea abonamentului se modifică, vor fi trimise IPN-uri suplimentare, vom gestiona numai subscr_payment și subscr_eot.

Codul scriptului Ipn.php


/ *
aici este codul care se conectează la baza de date
* /

concluzie

Articole similare