DevProTalk

Forumi IT profesionalaca
web development, web design, e-business, SEO


Idite nazad   DevProTalk > Web development i web aplikacije > PHP
Želite da se reklamirate ekskluzivno na ovoj poziciji? Javite se

PHP PHP aplikacije, Smarty, PEAR

Odgovori
 
Alati teme Način prikaza
Staro 13. 11. 2005.   #1
Ilija Studen
Direktor Kombinata
Invented the damn thing
 
Avatar Ilija Studen
 
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
Ilija Studen će postati "faca" uskoroIlija Studen će postati "faca" uskoro
Default PayPal, IPN i verifikacija

OK, manji problem.

Dobijem "obaveštenje" od PayPala (IPN) da je transakcija "legla" i sad treba da je verifikujem. Imam funkciju koji šalje verifikacioni zahtev i procesira odgovor ali ona definitivno ne radi kako treba pošto kao odgovor dobijem PayPal homepage (!).

Šta vi koristite? I kako?
Ilija Studen je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #2
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Možda da okačiš tu funkciju da vidimo, možda se dešava 404 pa 302 (redirect) - probaj da proveriš header koji se vraća? Meni liči na to.

Nisam koristio PayPal jako dugo, više od 5 godina, ne znam kako sada ide verifikacija, ali koliko se sećam sve je moglo da se strpa u 30-ak redova koda.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #3
Ilija Studen
Direktor Kombinata
Invented the damn thing
 
Avatar Ilija Studen
 
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
Ilija Studen će postati "faca" uskoroIlija Studen će postati "faca" uskoro
Default

Samu funkciju sam negde "pokupio" i malo prilagodio. Klasa i test primer odakle je ovo izvučeno je prikačeno na poruku. Probao sam da vidim nešto gotovo pošto nisam imao vremena sam da se cimam (par sati proučavanja dokumentacije i eksperimentisanja), ali mi se čini da će na kraju ipak biti tako... Korisnik se redirektuje na Success stranicu, ali verifikacija ne prođe kako treba.

Pri kraju je dodato logovanje odgovora u fajl, a $this->finish_order() menja stanje porudžbine i čuva izmene u bazu podataka.

PHP kôd:
/**
* OK, verify payment
*
* @access public
* @param void
* @return null
*/
function paypal_notify() {
  
  
// Prepare
  
$url_parsed   parse_url('https://www.paypal.com/cgi-bin/webscr');
  
$ipn_data     = array();
  
$ipn_response '';
  
$post_string  '';

  
// Generate the post string from the $_POST vars aswell as load the
  // $_POST vars into an arry so we can play with them from the calling
  // script.
  
foreach ($_POST as $field => $value) { 
    
$ipn_data[$field] = $value;
    
$post_string .= $field.'='.urlencode($value).'&'
  } 
// foreach
  
  // Add to post string...
  
$post_string .= 'cmd=_notify-validate'// append ipn command
  
  // Init..
  
$err_no null;
  
$err_str null;

  
// open the connection to paypal
  
$fp fsockopen($url_parsed['host'], '80'$err_no$err_str30); 
  
  
// FSock?
  
if(!$fp) {
    die();
  } else { 

    
// Post the data back to paypal
    
fputs($fp"POST" $url_parsed['path'] .  "HTTP/1.1\r\n"); 
    
fputs($fp"Host: " $url_parsed['host'] . "\r\n"); 
    
fputs($fp"Content-type: application/x-www-form-urlencoded\r\n"); 
    
fputs($fp"Content-length: " strlen($post_string) . "\r\n"); 
    
fputs($fp"Connection: close\r\n\r\n"); 
    
fputs($fp$post_string "\r\n\r\n"); 
    
    
// loop through the response from the server and append to variable
    
while(!feof($fp)) $ipn_response .= fgets($fp1024);
    
fclose($fp); // close connection

  
// if
  
  // Prepare for file and write it to the file...
  
$for_file "Post string:\r\n\r\n$post_string\r\n\r\nResponse:\r\n\r\n$ipn_response";
  @
write_in_filedirname(__FILE__) . '/lasttransaction.txt'$for_file );
  
  
// Vefied?
  
if (eregi("VERIFIED"$ipn_response)) {
    
$this->finish_order(false);
  } 
// if

// paypal_notify 
Priloženi fajlovi
Tip fajla: zip paypal-1.0.0.zip (6,1 KB, 961 pregleda)
Ilija Studen je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #4
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Evo šta meni pada na pamet:

fputs($fp, "Host: " . $url_parsed['host'] . "\r\n");

Ne šalješ port, možda mora port da se pošalje.

fputs($fp, "Host: " . $url_parsed['host'] . ":80\r\n");

Probao si konekciju sa portom 80.

$fp = fsockopen($url_parsed['host'], '80', $err_no, $err_str, 30);

jer je default, međutim i tu možda imaš grešku, pošto traži integer a ne string (ja sam imao problem sa tim kada sam portove čitao iz baze pa sam morao uvek intval($port) )

znači probaj sa:
$fp = fsockopen($url_parsed['host'], 80, $err_no, $err_str, 30);

Dalje, proveri da li je stvarno port 80.

Moguće je da te zbog jednog od ova 2 baca na index.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #5
Ilija Studen
Direktor Kombinata
Invented the damn thing
 
Avatar Ilija Studen
 
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
Ilija Studen će postati "faca" uskoroIlija Studen će postati "faca" uskoro
Default

Opet baca na index.

Hvala u svakom slučaju. Pogledaću šta dokumentacija ima da kaže na ovu temu pa javljam ako nađem nešto pametno
Ilija Studen je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #6
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Nekada nije islo preko https, vidim da sada ide tako...

Probaj ovaj kod, sad sam to nasao na disku ...

PHP kôd:

error_reporting
(E_ALL & ~E_NOTICE);

define('NO_REGISTER_GLOBALS'1);
define('SESSION_BYPASS'1);

$phrasegroups = array();
$specialtemplates = array();

chdir('./../');
require_once(
'./includes/init.php');
require_once(
'./includes/functions.php');
require_once(
'./includes/adminfunctions.php');
require_once(
'./includes/functions_subscriptions.php');

if (empty(
$_POST))
{
    exit;
}

$query[] = 'cmd=_notify-validate';
foreach (
$_POST as $key => $val)
{
    
$query[] = $key '=' urlencode ($val);
}
$query implode('&'$query);

$used_curl false;

if (
function_exists('curl_init') AND $ch curl_init())
{
    
curl_setopt($chCURLOPT_URL'http://www.paypal.com/cgi-bin/webscr');
    
curl_setopt($chCURLOPT_TIMEOUT15);
    
curl_setopt($chCURLOPT_POSTtrue);
    
curl_setopt($chCURLOPT_POSTFIELDSIZE0);
    
curl_setopt($chCURLOPT_POSTFIELDS$query);
    
curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 

    
$result curl_exec($ch);
    
curl_close($ch);
    if (
$result !== false)
    {
        
$used_curl true;
    }
}
if (!
$used_curl)
{

    
$header "POST /cgi-bin/webscr HTTP/1.0\r\n";
    
$header .= "Host: www.paypal.com\r\n";
    
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
    
$header .= "Content-Length: " strlen($query) . "\r\n\r\n";
    
$fp fsockopen('www.paypal.com'80$errno$errstr30);
    
socket_set_timeout($fp30);
    
fwrite($fp$header $query);
    while (!
feof($fp))
    {
        
$result fgets($fp1024);
        if (
strcmp($result'VERIFIED') == 0)
        {
            break;
        }
    }
    
fclose($fp);
}

if ((
$result == 'VERIFIED' OR strcmp($result'VERIFIED') == 0) AND !empty($_POST['item_number']) AND strtolower($_POST['business']) == strtolower($vboptions['ppemail']))
{

    
$item_number explode('_'$_POST['item_number']);
    
$subscriptionid intval($item_number[0]);

    if (empty(
$item_number[1]))
    { 
// non vBulletin subscription
        
exit;
    }

    
$userid $DB_site->query_first("SELECT userid FROM " TABLE_PREFIX "user WHERE userid = " intval($item_number[1]));

    
// lets check the values
    
if ($subscriptionid AND $userid['userid'])
    {
        
//its a paypal payment and we have some valid ids
        
$sub $DB_site->query_first("SELECT * FROM " TABLE_PREFIX "subscription WHERE subscriptionid = $subscriptionid");
        
$cost unserialize($sub['cost']);
        if (
$_POST['tax'] > 0)
        {
            
$_POST['mc_gross'] += $_POST['tax'];
        }

        
// Check if its a payment or if its a reversal
        
if ($_POST['txn_type'] == 'web_accept' AND $_POST['payment_status'] == 'Completed')
        {
            if (
$_POST['mc_gross'] == $cost[strtolower($_POST['mc_currency'])])
            {
                
build_user_subscription($subscriptionid$userid['userid']);
            }
        }
        else if (
$_POST['payment_status'] == 'Reversed' OR $_POST['payment_status'] == 'Refunded')
        {
            
delete_user_subscription($subscriptionid$userid['userid']);
        }
    }

    
// Paypal likes to get told its message has been received
    
if (SAPI_NAME == 'cgi' OR SAPI_NAME == 'cgi-fcgi')
    {
        
header('Status: 200 OK');
    }
    else
    {
        
header('HTTP/1.1 200 OK');
    }

__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!

Poslednja izmena od bluesman : 13. 11. 2005. u 01:38.
bluesman je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #7
bluesman
Goran Pilipović
Sir Write-a-Lot
 
Avatar bluesman
 
Datum učlanjenja: 18.05.2005
Lokacija: Beograd
Poruke: 5.450
Hvala: 288
1.247 "Hvala" u 446 poruka
bluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušatibluesman je osoba koju treba slušati
Pošaljite ICQ poruku za bluesman
Default

Proveri da li ti vraca: HTTP/1.1 200 OK

Ako da, onda je neka frka sa parametrima
Ako ne, vidi da nije 302, to je redirekcija...

Tako ces bar znati da li saljes na pravo mesto....
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman
I don't always know what I'm talking about but I know I'm right!
bluesman je offline   Odgovorite uz citat
Staro 13. 11. 2005.   #8
Ilija Studen
Direktor Kombinata
Invented the damn thing
 
Avatar Ilija Studen
 
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
Ilija Studen će postati "faca" uskoroIlija Studen će postati "faca" uskoro
Default

Rešeno, hvala Blues!

Najveći problem nije bila greška u kodu ili nešto slično, već ljudska greška. Naime IPN je po defaultu isključen (stupid) što meni nije rečeno. Zato je svaki moj zahtev bio usluživan sa index stranicom.

Kod funkcije je:

PHP kôd:
/**
* OK, verify payment
*
* @access public
* @param void
* @return null
*/
function paypal_notify() {
  
  
// Prepare query
  
$query = array('cmd=_notify-validate');
  
  
// Fill it with POST vars
  
foreach ($_POST as $key => $val) {
    
$query[] = $key '=' urlencode($val);
  } 
// foreach 
  
  // And join as string
  
$query implode('&'$query);
  
  
// Init curl...
  
$ch curl_init();
  
  
// Prepare curl
  
curl_setopt($chCURLOPT_URL'https://www.paypal.com/cgi-bin/webscr');
  
curl_setopt($chCURLOPT_TIMEOUT15);
  
curl_setopt($chCURLOPT_POSTtrue);
  
//curl_setopt($ch, CURLOPT_POSTFIELDSIZE, 0);
  
curl_setopt($chCURLOPT_POSTFIELDS$query);
  
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  
  
// Execute and close...
  
$result curl_exec($ch);
  
curl_close($ch);
  
  if(
$result == 'VERIFIED') {
    
$this->finish_order(false);
  } 
// if
  
  // Done here...
  
die();

// paypal_notify 
Mala adaptacije gore navedenog koda, curl only varijanta. Konstanta CURLOPT_POSTFIELDSIZE više ne postoji (iz nekog razloga) pa je ta linija zakomentarisana. To je manje više to, radi posao kao zmaj.
Ilija Studen je offline   Odgovorite uz citat
Odgovori



Pravila pisanja
Možete ne započinjati nove teme
Možete ne slati odgovore
Možete ne slati priloge
Možete ne izmeniti svoje poruke
vB kôd je Uključen
Smajliji su Uključen
[IMG] kod je Uključen
HTML kôd je Isključen
Pogledajte forum

Slične teme
Tema Početna poruka teme Forum Odgovori Poslednja poruka
Moneybookers verifikacija Viza internet kartice banke Intesa fanagoria Sva početnička pitanja 22 19. 05. 2011. 09:24
paypal Ekvador e-Business 74 23. 09. 2010. 09:20
PayPal on site Mitrović Srđan Sva početnička pitanja 16 20. 01. 2010. 14:32
PayPal placanje JustBest Opušteno 1 08. 01. 2010. 19:39
Google paypal nixa e-Business 1 14. 08. 2005. 13:47


Vreme je GMT +2. Trenutno vreme je 22:43.


Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.
Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.