Witam
Właśnie sobie robię integracje z PayPal. Sama płatność działa, ale ma kilka pytań na które nie znalazłem odpowiedzi. Na razie testuje płatności w trybie testowym poprzez:
https://www.sandbox.paypal.comNa razie nie mam możliwości testowania systemu w praktyce.
1) Czy można wymusić system PayPal aby zawsze po płatności sam przekierował użytkownika z powrotem na stronę, a nie jak jest teraz że trzeba kliknąć w link. Nie każdemu się chce, a w tym momencie system walidacji płatności traci sens.
2) W systemie testowym nie jest przekazywana zmienna paypal_adr
Kod generujący formularz:
<?php
............
$orderProduct = ''; $ID_order = 1;
$queryOrderProduct = $mysql->recordAll("SELECT * FROM `".DB_PREFIX."order_product` WHERE `orderID`='".$_SESSION['basketData']['orderID']."' AND `sessionID`='".$_SESSION['basketData']['sessionID']."';");
foreach($queryOrderProduct as $DB->orderProduct){
$orderProduct .= '<input type="hidden" name="item_name_'.$ID_order.'" value="'.$DB->orderProduct['productID'].'">
<input type="hidden" name="amount_'.$ID_order.'" value="'.$DB->orderProduct['priceBrutto'].'">
<input type="hidden" name="quantity_'.$ID_order.'" value="'.$DB->orderProduct['productHow'].'">';
$ID_order++;
}
// Wybranie linku przesłania formularza.
if($CONF_PAYPAL_MODE == 1){
$formLink = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
} else {
$formLink = 'https://www.paypal.com/cgi-bin/webscr';
}
// Utworznie formularza do wysyłki
$formPayMethod1 = '<form action="'.$formLink.'" method="post" id="paypal_form" name="paypal_form">
<input type="hidden" name="cmd" value="_cart">
<input type="hidden" name="upload" value="1">
<input type="hidden" name="first_name" value="'.$customerBookAdresName.'">
<input type="hidden" name="last_name" value="'.$customerBookAdresSurname.'">
<input type="hidden" name="address1" value="'.$customerBookAdresStreet1.'">
<input type="hidden" name="address2" value="'.$customerBookAdresStreet2.($customerBookAdresStreet3 == true ? '/'.$customerBookAdresStreet3 : '').'">
<input type="hidden" name="city" value="'.$customerBookAdresCity.'">
<input type="hidden" name="zip" value="'.$customerBookAdresPostcode.'">
<input type="hidden" name="country" value="'.$customerBookAdresCountry.'">
<input type="hidden" name="email" value="'.$customerBookAdresEmail.'">
'.$orderProduct.'
<input type="hidden" name="amount" value="'.$DB->orderUser['orderProductSumBrutto'].'">
<input type="hidden" name="shipping_1" value="'.$DB->orderUser['orderDeliveryCost'].'">
<input type="hidden" name="business" value="'.$CONF_PAYPAL_ID.'">
<input type="hidden" name="shopping_url" value="'.DB_DOMAIN.'">
<input type="hidden" name="charset" value="utf-8">
<input type="hidden" name="currency_code" value="'.$DB->orderUser['orderCurrency'].'">
<input type="hidden" name="return" value="'.$CONF_PAYPAL_VERIFICATION_OK.'/'.$DB->orderUser['orderID'].'/'.$DB->orderUser['customerSessionID'].'">
<input type="hidden" name="cancel_return" value="'.$CONF_PAYPAL_VERIFICATION_ERROR.'/'.$DB->orderUser['orderID'].'/'.$DB->orderUser['customerSessionID'].'">
<input type="hidden" name="rm" value="2">
</form>
<body onload="document.paypal_form.submit();"></body>';
........
?>
Kod obsługujący walidację ze strony
http://blog.mmx3.pl/2008/01/22/paypal-wstep/#comments<?php
$req = 'cmd=_notify-validate'; //dokładamy komendę z prośbą o potwierdzenie tego powiadomienia o płatności
foreach ($_POST as $key => $value) {
$req .= "&$key=$value";
}
$header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; // ustawiamy nagłówki zapytania.
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; // w tej linii zamieszczamy długość naszego zapytania $fp = fsockopen (paypal_adr
, 80
, $errno, $errstr, 30
); // stała paypal_adr jest adresem na który wysyłamy nasze zapytanie z prośbą o validację
if (!$fp) { // sprawdzamy czy wszystko ok z naszym połączeniem jeżeli nie jest to deskryptor przyjmuje wartość false
// tutaj możemy napisać obsługę HTTP ERROR
} else {
// jeżeli deskryptor jest ok to wysyłamy mu nasze nagłówki połączone z zapytaniem o validacje powiadomienia
fputs ($fp, $header . $req);
$res = fgets ($fp, 1024
);
if(strcmp($res, "VERIFIED")==0) { // Sprawdzamy czy transakcja ma status jako zakończona
if (strcmp ($payment_status, "Completed") == 0) { //jeżeli tak to możemy spokojnie dalej przetwarzać dane
}
} elseif(strcmp($res, "INVALID")==0){ // możemy zarejstrować do pliku wszystkie próby ataków na nasz serwis np. tak:
// $fplog = fopen('ipnlog.txt','a');
//fwrite($fplog, gmstrftime ("%b %d %Y %H:%M:%S", time())." -- ".$res." -- ".$req."\n");
//fclose($fplog);
}
}
}
?>
Bardzo proszę o podpowiedź jak rozwiązać walidację.
Pozdrawiam