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.com
Na 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 // Sprawdzamy czy transakcja ma status jako zakończona //jeżeli tak to możemy spokojnie dalej przetwarzać dane } // 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