Sisteme de plăți. PayPal
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
PayPal acceptă mai multe 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ă
Achiziționați "cu un singur clic"
Cea mai simplă formă este:
Descrierea parametrilor principali
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:
- 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).
- 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. Voi nota că, în cazul nostru, sesiunile de stocare a conținutului coșului nu sunt potrivite, deoarece nu vom putea restabili datele sesiunii în scriptul nostru IPN. Din motive de definire, cred că $ _COOKIE ['cart_id'] conține identificatorul coșului, prin care distingem coșul unui utilizator de celălalt. Lăsați conținutul coșului să fie stocat în baza de date MySQL, în tabelul cu următoarea structură:
După efectuarea plății, coșul cumpărătorului trebuie șters și se introduc intrările din tabelul de comandă. Informații generale despre comenzi vor fi stocate în tabelul de comenzi:
Vom păstra detaliile comenzii în tabelul order_details:
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 ORDER_ID FROM ordinele 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 v-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 cart
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"]) "",
country = 'mysql_escape_string ($ _POST ["adresa_country"]). "");
$ 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 = $ order_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);
e-mail ($ adminemail "Comandă nouă" "Noua ordine \ r \ Nørder ID-ul:" ... $ ORDER_ID "\ r \ nTransaction ID-ul:".
. $ _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, în cazul în care 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.
Scriptul IPN pentru abonament trebuie să se ocupe de mai multe tipuri de IPN. Acest lucru cauzează adesea dificultăți. Voi descrie în detaliu diferitele tipuri de IPN (txn_type)
În majoritatea cazurilor, este suficient să implementați procesarea subscr_signup. subscr_cancel. subscr_payment și subscr_eot.
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 abonatului sunt stocate în tabelul abonaților
Scriptul care verifică numele de utilizator și parola va trebui să utilizeze câmpul limitat pentru a determina dacă utilizatorul trebuie 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
În concluzie, câteva sfaturi