Ustawiasz zwrotny adres URL PayPal i ustawiasz automatyczny powrót?


128

To jest pytanie uzupełniające do: PHP: Łatwy sposób na rozpoczęcie realizacji transakcji PayPal?

Tak więc mój problem polega na tym, że określam zwrotny adres URL. Jednak po zapłaceniu przez PayPal widzę ekran, na którym jest napisane:

Właśnie zakończyłeś płatność. XXXX, właśnie zakończyłeś płatność. Twój identyfikator transakcji dla tej płatności to: XXXXXXXXXXXXX.

Wyślemy wiadomość e-mail z potwierdzeniem na adres XX@XXXX.com. Ta transakcja pojawi się na Twoim wyciągu jako PAYPAL.

Go to PayPal account overview

Potrzebuję go, aby nie pokazywał tego ekranu i przechodził bezpośrednio do zwrotnego adresu URL. Mam:

  • Ustaw zmienną „return”
  • Ustaw zmienną „rm” na: 2 (która zgodnie z guide = „ przeglądarka kupującego jest przekierowywana na zwrotny adres URL metodą POST i uwzględniane są wszystkie zmienne płatności ”)

W rzeczywistości oto cała moja forma:

<form method="post" action="https://www.sandbox.paypal.com/cgi-bin/webscr">
  <input type="hidden" value="_xclick" name="cmd">
  <input type="hidden" value="onlinestore@thegreekmerchant.com" name="business">
  <!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
  <input type="hidden" value="Order at The Greek Merchant:&lt;Br /&gt;Goldfish Flock BLG&lt;br /&gt;" name="item_name">
  <input type="hidden" value="NA" name="item_number">
  <input type="hidden" value="22.16" name="amount">
  <input type="hidden" value="5.17" name="shipping">
  <input type="hidden" value="0" name="discount_amount">        
  <input type="hidden" value="0" name="no_shipping">
  <input type="hidden" value="No comments" name="cn">
  <input type="hidden" value="USD" name="currency_code">
  <input type="hidden" value="http://XXX/XXX/XXX/paypal/return" name="return">
  <input type="hidden" value="2" name="rm">      
  <input type="hidden" value="11255XXX" name="invoice">
  <input type="hidden" value="US" name="lc">
  <input type="hidden" value="PP-BuyNowBF" name="bn">
  <input type="submit" value="Place Order!" name="finalizeOrder" id="finalizeOrder" class="submitButton">
</form>

Masz jakiś pomysł, jak mogę automatycznie wrócić? Alternatywnie, w jaki sposób mogę odzyskać wynik płatności na mojej stronie internetowej, aby zaktualizować bazę danych? Co to jest IPN?


Pamiętaj, że host wpisany w Twoim niestandardowym parametrze zwrotu musi być taki sam, jak skonfigurowany na koncie PayPal.
Andreas

Odpowiedzi:


199

Musisz włączyć automatyczny zwrot na swoim koncie PayPal, w przeciwnym razie zignoruje to returnpole.

Z dokumentacji (zaktualizowano w celu odzwierciedlenia nowego układu ze stycznia 2019 r.):

Automatyczny powrót jest domyślnie wyłączony. Aby włączyć automatyczny powrót:

  1. Zaloguj się na swoje konto PayPal pod adresem https://www.paypal.com lub https://www.sandbox.paypal.com Zostanie wyświetlona strona Moje konto - przegląd.
  2. Kliknij ikonę koła zębatego w prawym górnym rogu. Zostanie wyświetlona strona Podsumowanie profilu.
  3. Kliknij łącze Moje preferencje sprzedaży w lewej kolumnie.
  4. W sekcji Sprzedaż online kliknij łącze Aktualizuj w wierszu Preferencje witryny internetowej. Zostanie wyświetlona strona Preferencje płatności za pośrednictwem witryny
  5. W obszarze Automatyczny zwrot dla płatności za pośrednictwem witryny kliknij przycisk opcji Włącz, aby włączyć automatyczny zwrot.
  6. W polu Zwrotny adres URL wprowadź adres URL, na który mają być przekierowywani płatnicy po dokonaniu płatności. UWAGA: PayPal sprawdza wprowadzony zwrotny adres URL. Jeśli adres URL jest nieprawidłowo sformatowany lub nie można go zweryfikować, PayPal nie aktywuje automatycznego powrotu.
  7. Przewiń na dół strony i kliknij przycisk Zapisz.

IPN służy do natychmiastowego powiadamiania o płatnościach. Zapewnia bardziej wiarygodne / przydatne informacje niż te, które uzyskasz dzięki automatycznemu zwrotowi.

Dokumentacja IPN jest dostępna tutaj: https://www.x.com/sites/default/files/ipnguide.pdf

Dokumentacja online dla IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

Ogólna procedura polega na przekazaniu notify_urlparametru wraz z żądaniem i skonfigurowaniu strony, która obsługuje i weryfikuje powiadomienia IPN, a PayPal będzie wysyłać żądania do tej strony, aby powiadomić Cię o płatnościach / zwrotach / itp. iść przez. Ta strona obsługi IPN byłaby wówczas właściwym miejscem do aktualizacji bazy danych w celu oznaczenia zamówień jako opłaconych.



5
Dzięki nowemu układowi witryny Paypal nie jest to już dokładne. Krok 3) Kliknij My Selling Tools Krok 4) Kliknij Website PreferencespodSelling Online
Webnet

2
IPN powinien być używany do sprawdzenia, czy zamówienie zostało poprawnie obsłużone przez PayPal, jednak nadal potrzebujesz adresu URL zwrotnego, aby pokazać użytkownikowi, że wiesz o sukcesie. Tak wiele razy użytkownik nie otrzymuje e-maila, który wysyłasz, więc dobrze jest, jeśli może uzyskać dostęp do produktu (pobieranie itp.) Od razu.
pcunite

1
@Kevin Stricker Jak możemy ustawić zwrotny adres URL dla 2 różnych witryn? na przykład jeśli używam jednego konta PayPal dla 2 witryn internetowych, ale mogę dodać tylko jeden adres URL jako zwrotny adres URL, wykonując własne kroki. jak mogę tego użyć dla 2 witryn?
Gaurav

4
Nie jest do końca dokładne stwierdzenie „Musisz włączyć automatyczny zwrot na swoim koncie PayPal, w przeciwnym razie pole zostanie zignorowane return”. Każdy returnparametr adresu URL przekazany do kasy byłby honorowany i zastępowałby dowolny adres URL automatycznego zwrotu (lub jego brak) skonfigurowany w profilu konta PayPal sprzedającego, ale jeśli nie ma on tam włączonego automatycznego zwrotu, kupujący musiałby ręcznie kliknąć obok pola koniec kasy, aby zostać przekierowanym na ten adres URL, zamiast być przekierowywanym automatycznie.
SubGothius,

42

Przykładowy formularz wykorzystujący PHP do płatności bezpośrednich.

<form action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="upload" value="1">
    <input type="hidden" name="business" value="you@youremail.com">

    <input type="hidden" name="item_name_' . $x . '" value="' . $product_name . '">
    <input type="hidden" name="amount_' . $x . '" value="' . $price . '">
    <input type="hidden" name="quantity_' . $x . '" value="' . $each_item['quantity'] . '"> 
    <input type="hidden" name="custom" value="' . $product_id_array . '">
    <input type="hidden" name="notify_url" value="https://www.yoursite.com/my_ipn.php">
    <input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php">
    <input type="hidden" name="rm" value="2">
    <input type="hidden" name="cbt" value="Return to The Store">
    <input type="hidden" name="cancel_return" value="https://www.yoursite.com/paypal_cancel.php">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="currency_code" value="USD">
    <input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - its fast, free and secure!">
</form>

uprzejmie przejdź przez pola notify_url, return, cancel_return

przykładowy kod do obsługi IPn (my_ipn.php), którego żąda PayPal po dokonaniu płatności.

Więcej informacji na temat tworzenia IPN można znaleźć pod tym linkiem.

<?php
// Check to see there are posted variables coming into the script
if ($_SERVER['REQUEST_METHOD'] != "POST")
    die("No Post Variables");
// Initialize the $req variable and add CMD key value pair
$req = 'cmd=_notify-validate';
// Read the post from PayPal
foreach ($_POST as $key => $value) {
    $value = urlencode(stripslashes($value));
    $req .= "&$key=$value";
}
// Now Post all of that back to PayPal's server using curl, and validate everything with PayPal
// We will use CURL instead of PHP for this for a more universally operable script (fsockopen has issues on some environments)
//$url = "https://www.sandbox.paypal.com/cgi-bin/webscr";
$url = "https://www.paypal.com/cgi-bin/webscr";
$curl_result = $curl_err = '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/x-www-form-urlencoded", "Content-Length: " . strlen($req)));
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
$curl_result = @curl_exec($ch);
$curl_err = curl_error($ch);
curl_close($ch);

$req = str_replace("&", "\n", $req);  // Make it a nice list in case we want to email it to ourselves for reporting
// Check that the result verifies
if (strpos($curl_result, "VERIFIED") !== false) {
    $req .= "\n\nPaypal Verified OK";
} else {
    $req .= "\n\nData NOT verified from Paypal!";
    mail("you@youremail.com", "IPN interaction not verified", "$req", "From: you@youremail.com");
    exit();
}

/* CHECK THESE 4 THINGS BEFORE PROCESSING THE TRANSACTION, HANDLE THEM AS YOU WISH
  1. Make sure that business email returned is your business email
  2. Make sure that the transaction�s payment status is �completed�
  3. Make sure there are no duplicate txn_id
  4. Make sure the payment amount matches what you charge for items. (Defeat Price-Jacking) */

// Check Number 1 ------------------------------------------------------------------------------------------------------------
$receiver_email = $_POST['receiver_email'];
if ($receiver_email != "you@youremail.com") {
//handle the wrong business url
    exit(); // exit script
}
// Check number 2 ------------------------------------------------------------------------------------------------------------
if ($_POST['payment_status'] != "Completed") {
    // Handle how you think you should if a payment is not complete yet, a few scenarios can cause a transaction to be incomplete
}

// Check number 3 ------------------------------------------------------------------------------------------------------------
$this_txn = $_POST['txn_id'];
//check for duplicate txn_ids in the database
// Check number 4 ------------------------------------------------------------------------------------------------------------
$product_id_string = $_POST['custom'];
$product_id_string = rtrim($product_id_string, ","); // remove last comma
// Explode the string, make it an array, then query all the prices out, add them up, and make sure they match the payment_gross amount
// END ALL SECURITY CHECKS NOW IN THE DATABASE IT GOES ------------------------------------
////////////////////////////////////////////////////
// Homework - Examples of assigning local variables from the POST variables
$txn_id = $_POST['txn_id'];
$payer_email = $_POST['payer_email'];
$custom = $_POST['custom'];
// Place the transaction into the database
// Mail yourself the details
mail("you@youremail.com", "NORMAL IPN RESULT YAY MONEY!", $req, "From: you@youremail.com");
?>

Poniższy obrazek pomoże ci w zrozumieniu procesu paypal. Przebieg procesu Paypal

Więcej informacji można znaleźć pod następującymi linkami;

mam nadzieję, że to ci pomoże ... :)


1
Czy ktoś wie, czy jest to nadal ważne z dzisiejszymi API PayPal? Widzę, że pytanie ma 2 lata.
Matt Welander,

1
Adresy URL „return” i „cancel_return” służą do przekazywania kupującemu natychmiastowej informacji zwrotnej o transakcji i mogą w tym celu wykorzystywać zmienne PDT. Jednak PP próbuje z nimi tylko raz, więc nie można na nich polegać w przypadku krytycznej realizacji zamówienia (powiedzmy, że kupujący zamyka przeglądarkę po dokonaniu płatności, ale nadal w PP). W tym celu możesz również zechcieć wykonać kopię zapasową za pomocą niezawodnego procesu IPN, za pośrednictwem „notify_url”, przetwarzając co najmniej stan „Ukończono” (załóżmy, że cokolwiek innego się nie powiodło, być może wymagając ręcznej negocjacji). Przetwarzanie na serwerze PDT i IPN będzie musiało zapewnić, że zamówienie zostanie zrealizowane tylko raz.
Patanjali

Wierzę, że wszystko się zmieniło i Paypal success.php działa teraz tylko ze zmiennymi GET. Zobacz tutaj: stackoverflow.com/questions/45671366/…
Sol

23

w jeden sposób znalazłem:

spróbuj wstawić to pole do wygenerowanego kodu formularza:

<input type='hidden' name='rm' value='2'>

rm oznacza metodę powrotu ;

2 oznacza (post)

Następnie po zakupie przez użytkownika i powrocie do adresu URL Twojej witryny, ten adres URL również otrzymuje parametry POST

ps jeśli używasz php, spróbuj wstawić var_dump($_POST);swój adres zwrotny (skrypt), a następnie dokonaj zakupu testowego, a po powrocie do witryny zobaczysz, jakie zmienne znajdują się w twoim adresie URL.


Czy faktycznie tego użyłeś?
Simon Gibbs

To było świetne. Dopóki transfer danych płatności jest wyłączony w systemie PayPal, wszystkie ustawienia wiadomości są wysyłane na zwrotny adres URL.
JulianJ

4

Udostępniam to, ponieważ ostatnio napotkałem problemy podobne do tego wątku

Mój skrypt przez długi czas działał dobrze (podstawowa forma płatności) i zwracał zmienne POST na moją stronę success.php i dane IPN również jako zmienne POST. Jednak ostatnio zauważyłem, że strona zwrotna (success.php) nie otrzymywała już żadnych zmiennych POST. Testowałem w piaskownicy i na żywo i jestem prawie pewien, że PayPal coś zmienił!

Powiadomienie_url nadal otrzymuje prawidłowe dane IPN, co pozwala mi zaktualizować bazę danych, ale nie udało mi się wyświetlić komunikatu o powodzeniu na mojej stronie zwrotnego adresu URL (success.php).

Pomimo próbowania wielu kombinacji w celu włączania i wyłączania opcji w preferencjach płatności w witrynie PayPal i IPN, musiałem wprowadzić pewne zmiany w moim skrypcie, aby upewnić się, że nadal mogę przetworzyć wiadomość. Osiągnąłem to, włączając PDT i Auto Return, po wykonaniu tego doskonałego przewodnika .

Teraz wszystko działa dobrze, ale jedynym problemem jest to, że zwrotny adres URL zawiera wszystkie zmienne PDT, co jest brzydkie!

Może się również okazać pomocne


3

Myślę, że pomysł ustawienia wartości Auto Return, jak opisano powyżej przez Kevina, jest trochę dziwny!

Załóżmy na przykład, że masz wiele witryn internetowych, które używają tego samego konta PayPal do obsługi płatności lub powiedz, że masz kilka sekcji w jednej witrynie, które wykonują różne zadania zakupowe i wymagają różnych adresów zwrotnych podczas płatności jest zakończony. Jeśli umieszczę przycisk na mojej stronie, jak opisano powyżej w sekcji `` Przykładowy formularz używający PHP do płatności bezpośrednich '', zobaczysz, że jest tam wiersz:

input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"

gdzie ustawiasz indywidualną wartość zwracaną. Dlaczego trzeba to ustawić ogólnie, także w sekcji profilu?!?!

Ponadto, ponieważ możesz ustawić tylko jedną wartość w sekcji profilu, oznacza to (AFAIK), że nie możesz użyć funkcji automatycznego powrotu w witrynie z wieloma akcjami.

Komentarze proszę?


3
parametr return może być przekazany dla każdego formularza, nadpisując ustawienia automatycznego powrotu
adresu

1
tak, co powiedział DropHit, to tylko domyślna wartość automatycznie zwracana, na wypadek, gdybyś zapomniał przekazać ją jako parametr. jeśli przekażesz go jako parametr, użyje on Twojego zwrotnego adresu URL dla każdej Twojej witryny.
hamish


@DropHit Czy PDT nadal działa z nadpisanymi returnwartościami dla poszczególnych przycisków ? Czy mogę mieć różne strony zwrotne, które nadal będą otrzymywać dane PDT?
Dai

Przepraszam za spóźnioną odpowiedź - nie jestem pewien, czy to zadziała, ALE moje obecne integracje nadal działają zgodnie z oczekiwaniami, chociaż to nie gwarantuje, że Twój przypadek użycia będzie działał tak, jak mój
DropHit

1

na stronie kasy poszukaj ukrytego elementu formularza „cancel_return”:

ustaw wartość elementu formularza cancel_return na adres URL, do którego chcesz powrócić:


W rzeczywistości „anuluj zwrot” jest używane tylko wtedy, gdy transakcja się nie powiedzie. MUSISZ również podać „zwrotny” adres URL, aby obsłużyć pomyślnie zakończone transakcje, w przeciwnym razie zostanie do nich użyty domyślny adres URL.
Patanjali

Nie wtedy, gdy transakcja się nie powiedzie, ale raczej wtedy, gdy kupujący kliknie link „Anuluj i wróć do [nazwa sprzedawcy]” podczas realizacji transakcji, aby zrezygnować z realizacji zamówienia.
SubGothius,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.