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.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:
  1. <?php
  2. ............
  3.  
  4. $orderProduct = ''; $ID_order = 1;
  5. $queryOrderProduct = $mysql->recordAll("SELECT * FROM `".DB_PREFIX."order_product` WHERE `orderID`='".$_SESSION['basketData']['orderID']."' AND `sessionID`='".$_SESSION['basketData']['sessionID']."';");
  6. foreach($queryOrderProduct as $DB->orderProduct){
  7. $orderProduct .= '<input type="hidden" name="item_name_'.$ID_order.'" value="'.$DB->orderProduct['productID'].'">
  8. <input type="hidden" name="amount_'.$ID_order.'" value="'.$DB->orderProduct['priceBrutto'].'">
  9. <input type="hidden" name="quantity_'.$ID_order.'" value="'.$DB->orderProduct['productHow'].'">';
  10. $ID_order++;
  11. }
  12.  
  13. // Wybranie linku przesłania formularza.
  14. if($CONF_PAYPAL_MODE == 1){
  15. $formLink = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
  16. } else {
  17. $formLink = 'https://www.paypal.com/cgi-bin/webscr';
  18. }
  19.  
  20.  
  21. // Utworznie formularza do wysyłki
  22. $formPayMethod1 = '<form action="'.$formLink.'" method="post" id="paypal_form" name="paypal_form">
  23. <input type="hidden" name="cmd" value="_cart">
  24. <input type="hidden" name="upload" value="1">
  25.  
  26. <input type="hidden" name="first_name" value="'.$customerBookAdresName.'">
  27. <input type="hidden" name="last_name" value="'.$customerBookAdresSurname.'">
  28. <input type="hidden" name="address1" value="'.$customerBookAdresStreet1.'">
  29. <input type="hidden" name="address2" value="'.$customerBookAdresStreet2.($customerBookAdresStreet3 == true ? '/'.$customerBookAdresStreet3 : '').'">
  30.  
  31. <input type="hidden" name="city" value="'.$customerBookAdresCity.'">
  32. <input type="hidden" name="zip" value="'.$customerBookAdresPostcode.'">
  33. <input type="hidden" name="country" value="'.$customerBookAdresCountry.'">
  34. <input type="hidden" name="email" value="'.$customerBookAdresEmail.'">
  35.  
  36. '.$orderProduct.'
  37.  
  38. <input type="hidden" name="amount" value="'.$DB->orderUser['orderProductSumBrutto'].'">
  39. <input type="hidden" name="shipping_1" value="'.$DB->orderUser['orderDeliveryCost'].'">
  40.  
  41. <input type="hidden" name="business" value="'.$CONF_PAYPAL_ID.'">
  42. <input type="hidden" name="shopping_url" value="'.DB_DOMAIN.'">
  43.  
  44. <input type="hidden" name="charset" value="utf-8">
  45. <input type="hidden" name="currency_code" value="'.$DB->orderUser['orderCurrency'].'">
  46.  
  47. <input type="hidden" name="return" value="'.$CONF_PAYPAL_VERIFICATION_OK.'/'.$DB->orderUser['orderID'].'/'.$DB->orderUser['customerSessionID'].'">
  48. <input type="hidden" name="cancel_return" value="'.$CONF_PAYPAL_VERIFICATION_ERROR.'/'.$DB->orderUser['orderID'].'/'.$DB->orderUser['customerSessionID'].'">
  49. <input type="hidden" name="rm" value="2">
  50. </form>
  51. <body onload="document.paypal_form.submit();"></body>';
  52.  
  53. ........
  54.  
  55. ?>


Kod obsługujący walidację ze strony http://blog.mmx3.pl/2008/01/22/paypal-wstep/#comments
  1. <?php
  2. $req = 'cmd=_notify-validate'; //dokładamy komendę z prośbą o potwierdzenie tego powiadomienia o płatności
  3. foreach ($_POST as $key => $value) {
  4. $value = urlencode($value);
  5. $req .= "&$key=$value";
  6. }
  7.  
  8. $header = "POST /cgi-bin/webscr HTTP/1.0\r\n"; // ustawiamy nagłówki zapytania.
  9. $header .= "Content-Type: application/x-www-form-urlencoded\r\n";
  10. $header .= "Content-Length: " . strlen($req) . "\r\n\r\n"; // w tej linii zamieszczamy długość naszego zapytania
  11. $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ę
  12.  
  13. if (!$fp) { // sprawdzamy czy wszystko ok z naszym połączeniem jeżeli nie jest to deskryptor przyjmuje wartość false
  14. // tutaj możemy napisać obsługę HTTP ERROR
  15. print 'error';
  16.  
  17.  
  18. } else {
  19. // jeżeli deskryptor jest ok to wysyłamy mu nasze nagłówki połączone z zapytaniem o validacje powiadomienia
  20. fputs ($fp, $header . $req);
  21.  
  22. while (!feof($fp)) {
  23. $res = fgets ($fp, 1024);
  24.  
  25. if(strcmp($res, "VERIFIED")==0) {
  26. // Sprawdzamy czy transakcja ma status jako zakończona
  27. if (strcmp ($payment_status, "Completed") == 0) {
  28. //jeżeli tak to możemy spokojnie dalej przetwarzać dane
  29. print 'zapłacono';
  30. }
  31.  
  32. } elseif(strcmp($res, "INVALID")==0){
  33. // możemy zarejstrować do pliku wszystkie próby ataków na nasz serwis np. tak:
  34. // $fplog = fopen('ipnlog.txt','a');
  35. //fwrite($fplog, gmstrftime ("%b %d %Y %H:%M:%S", time())." -- ".$res." -- ".$req."\n");
  36. //fclose($fplog);
  37. }
  38. }
  39. }
  40. ?>


Bardzo proszę o podpowiedź jak rozwiązać walidację.
Pozdrawiam