Установить URL возврата PayPal и сделать его автоматическим?

127

Это следующий вопрос: PHP: простой способ начать оформление заказа через PayPal?

Итак, моя проблема в том, что я указываю URL-адрес возврата. Однако после оплаты через PayPal я попадаю на экран с надписью:

Вы только что завершили платеж. XXXX, вы только что завершили платеж. Ваш идентификатор транзакции для этого платежа: XXXXXXXXXXXXX.

Мы отправим письмо с подтверждением на адрес XX@XXXX.com. Эта транзакция будет отображаться в вашей выписке как PAYPAL.

Go to PayPal account overview

Мне нужно, чтобы этот экран не отображался, а переходил непосредственно к URL-адресу возврата. У меня есть:

  • Установите переменную "return"
  • Установите для переменной "rm" значение: 2 (согласно руководству = " браузер покупателя перенаправляется на URL-адрес возврата с помощью метода POST, и все платежные переменные включены ")

Собственно, вот и вся моя форма:

<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>

Есть идеи, как я могу заставить его автоматически вернуться? Или как мне вернуть результат платежа на свой сайт, чтобы я мог обновить базу данных? Что такое IPN?

coderama
источник
Обратите внимание, что узел ввода в вашем настраиваемом параметре возврата должен быть таким же, как настроен в вашей учетной записи PayPal.
Андреас

Ответы:

199

Вы должны включить автоматический возврат в своей учетной записи PayPal, иначе он проигнорирует это returnполе.

Из документации (обновлено, чтобы отразить новый макет, январь 2019 г.):

По умолчанию функция автоматического возврата отключена. Чтобы включить автоматический возврат:

  1. Войдите в свою учетную запись PayPal со страницы https://www.paypal.com или https://www.sandbox.paypal.com. Появится страница обзора моей учетной записи.
  2. Щелкните значок шестеренки в правом верхнем углу. Откроется страница сводки профиля.
  3. Щелкните ссылку "Мои предпочтения продаж" в левом столбце.
  4. В разделе «Продажа через Интернет» щелкните ссылку «Обновить» в строке «Настройки веб-сайта». Откроется страница "Настройки платежей на веб-сайте".
  5. В разделе «Автоматический возврат платежей через веб-сайт» установите переключатель «Вкл», чтобы включить автоматический возврат.
  6. В поле URL-адрес возврата введите URL-адрес, на который должны перенаправляться плательщики после того, как они завершат свои платежи. ПРИМЕЧАНИЕ. PayPal проверяет введенный вами URL-адрес возврата. Если URL-адрес неправильно отформатирован или не может быть подтвержден, PayPal не активирует автоматический возврат.
  7. Прокрутите страницу вниз и нажмите кнопку Сохранить.

IPN предназначен для мгновенного уведомления об оплате. Это даст вам более надежную / полезную информацию, чем то, что вы получите при автоматическом возврате.

Документация для IPN находится здесь: https://www.x.com/sites/default/files/ipnguide.pdf

Онлайн-документация для IPN: https://developer.paypal.com/docs/classic/ipn/gs_IPN/

Общая процедура заключается в том, что вы передаете notify_urlпараметр с запросом и настраиваете страницу, которая обрабатывает и проверяет уведомления IPN, а PayPal будет отправлять запросы на эту страницу, чтобы уведомить вас о платежах / возвратах / т. Д. проходить через. Эта страница обработчика IPN тогда будет правильным местом для обновления базы данных, чтобы отмечать заказы как оплаченные.

Кевин Стрикер
источник
2
Посмотрите здесь paypal.com/cgi-bin/webscr?cmd=p/mer/…
Разработчик
5
С новым макетом веб-сайта Paypal это уже не совсем точно. Шаг 3) Щелкните My Selling Tools Шаг 4) Щелкните Website PreferencesподSelling Online
Webnet
2
IPN следует использовать для проверки того, что заказ был правильно обработан PayPal, однако вам по-прежнему нужен обратный URL-адрес, чтобы показать пользователю, что вы знаете об успехе. Очень часто пользователи не получают отправленное вами электронное письмо, поэтому было бы хорошо, если бы они могли сразу же получить доступ к продукту (загрузить и т. Д.).
pcunite 05
1
@Kevin Stricker Как мы можем настроить обратный URL для двух разных сайтов? например, если я использую одну учетную запись PayPal для 2 веб-сайтов, но я могу добавить только один URL-адрес в качестве URL-адреса возврата, используя ваши шаги. как я могу использовать это для 2 сайтов?
Gaurav
4
Не совсем верно, что «Вы должны включить автоматический возврат в своей учетной записи PayPal, иначе он проигнорирует это returnполе». Любой returnпараметр URL-адреса, который вы передаете для оформления заказа, будет учитываться и переопределять любой URL-адрес автоматического возврата (или его отсутствие), настроенный в профиле учетной записи продавца PayPal, но если у них не включен автоматический возврат, покупатель должен будет вручную щелкнуть по конец оформления заказа, чтобы быть перенаправленным на этот URL-адрес, а не автоматически.
SubGothius
42

Пример формы с использованием PHP для прямых платежей.

<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>

пожалуйста, пройдите через поля notify_url, return, cancel_return

пример кода для обработки ipn (my_ipn.php), который запрашивается PayPal после оплаты.

Для получения дополнительной информации о создании IPN перейдите по этой ссылке.

<?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");
?>

Изображение ниже поможет вам понять процесс PayPal. Процесс Paypal

Для дальнейшего чтения перейдите по следующим ссылкам;

надеюсь, это поможет вам .. :)

Прашант Пратапагири
источник
1
Кто-нибудь знает, действительно ли это по-прежнему с сегодняшними API PayPal? Вижу, что вопрос 2 года.
Мэтт Веландер
1
URL-адреса return и cancel_return используются для предоставления покупателю немедленной обратной связи о транзакции и могут использовать для этого переменные PDT. Однако PP пытается использовать их только один раз, поэтому на них нельзя положиться при выполнении критически важного заказа (скажем, покупатель закрывает браузер после оплаты, но все еще в PP). Для этого вы можете также сделать резервную копию с помощью надежного процесса IPN с помощью 'notify_url', обрабатывая как минимум статус 'Завершено' (предположим, что что-то еще является ошибкой, возможно, требующей ручного согласования). Обработка вашего сервера PDT и IPN должна гарантировать, что заказ будет выполнен только один раз.
Патанджали
Я полагаю, что все изменилось, и Paypal success.php теперь работает только с переменными GET. См. Здесь: stackoverflow.com/questions/45671366/…
Sol
23

один способ я нашел:

попробуйте вставить это поле в созданный вами код формы:

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

rm означает метод возврата ;

2 означает (пост)

После того, как пользователь совершит покупку и вернется на URL-адрес вашего сайта, этот URL-адрес также получит параметры POST

ps при использовании php попробуйте вставить var_dump($_POST);обратный URL (скрипт), затем сделайте тестовую покупку, и когда вы вернетесь на свой сайт, вы увидите, какие переменные указаны в вашем URL.

T.Todua
источник
Вы действительно этим пользовались?
Саймон Гиббс
Это было здорово. Пока в PayPal передача платежных данных отключена, вы получаете все настройки публикации, отправляемые на обратный URL.
JulianJ
4

Делюсь этим, поскольку недавно я столкнулся с проблемами, похожими на эту тему

В течение долгого времени мой скрипт работал хорошо (базовая форма оплаты) и возвращал переменные POST на мою страницу success.php, а также данные IPN в качестве переменных POST. Однако в последнее время я заметил, что страница возврата (success.php) больше не получает никаких переменных POST. Я тестировал в песочнице и живу, и я почти уверен, что PayPal что-то изменил!

Notify_url по-прежнему получает правильные данные IPN, позволяющие мне обновлять БД, но мне не удалось отобразить сообщение об успешном завершении на моей странице URL-адреса возврата (success.php).

Несмотря на попытки использовать множество комбинаций для включения и выключения параметров в настройках оплаты веб-сайта PayPal и IPN, мне пришлось внести некоторые изменения в свой сценарий, чтобы гарантировать, что я все еще могу обрабатывать сообщение. Я добился этого, включив PDT и Auto Return, следуя этому отличному руководству .

Теперь все работает нормально, но единственная проблема в том, что URL-адрес возврата содержит все переменные PDT, что некрасиво!

Вы также можете найти это полезным

золь
источник
3

Я думаю, что идея установки значений автоматического возврата, как описано выше Кевином, немного странная!

Скажем, например, что у вас есть несколько веб-сайтов, которые используют одну и ту же учетную запись PayPal для обработки ваших платежей, или скажем, что у вас есть несколько разделов на одном веб-сайте, которые выполняют разные задачи покупки и требуют разных обратных адресов при оплате завершено. Если я размещу кнопку на своей странице, как описано выше в разделе «Пример формы с использованием PHP для прямых платежей», вы увидите, что там есть строка:

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

где вы устанавливаете индивидуальное возвращаемое значение. Почему его нужно ставить вообще, в том числе и в профиле?!?!

Кроме того, поскольку вы можете установить только одно значение в разделе профиля, это означает (AFAIK), что вы не можете использовать автоматический возврат на сайте с несколькими действиями.

Комментарии пожалуйста ??

Тим Макинс
источник
3
параметр возврата может быть передан для каждой формы, переопределяя настройку URL-
адреса
1
да, то, что сказал DropHit, это просто значение, автоматически возвращаемое по умолчанию, на случай, если вы забудете передать его в качестве параметра. если вы передадите его в качестве параметра, он будет использовать ваш возвращаемый URL для каждого из ваших сайтов.
Hamish
это помогает? codeseekah.com/2012/02/11/…
Хэмиш
@DropHit Тогда работает ли PDT с переопределенными returnзначениями для каждой кнопки ? Значит, у меня могут быть разные страницы возврата, которые все равно будут получать данные PDT?
Дай,
Извините за поздний ответ - я не уверен, что это сработает, НО мои текущие интеграции все еще работают
должным образом,
1

на странице оформления заказа найдите скрытый элемент формы cancel_return:

установите в качестве значения элемента формы cancel_return URL-адрес, по которому вы хотите вернуться:

Рахул Шинде
источник
Фактически, «отменить возврат» используется только в случае сбоя транзакции. Вы также ДОЛЖНЫ предоставить URL-адрес «возврата» для обработки успешно завершенных транзакций, в противном случае для них будет использоваться URL-адрес по умолчанию.
Патанджали
Не тогда, когда транзакция не удалась, а, скорее, когда покупатель нажимает ссылку «Отменить и вернуться к [название продавца]» во время оформления заказа, чтобы отказаться от выполнения своего заказа.
SubGothius,