Установка URL-адреса PayPal и его автоматического возврата?
Это следующий вопрос: PHP: простой способ запустить PayPal checkout?
Итак, моя проблема в том, что я указываю обратный URL. Однако после оплаты PayPal я заканчиваю на экране, который гласит:
Вы только что завершили платеж. XXXX, вы только что завершили платеж. Идентификатор транзакции для этого платежа: XXXXXXXXXXXXX.
Мы отправим письмо с подтверждением на адрес [email protected] Эта транзакция появится в вашем заявлении как 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="[email protected]" name="business">
<!-- <input type="hidden" name="undefined_quantity" value="1" /> -->
<input type="hidden" value="Order at The Greek Merchant:<Br />Goldfish Flock BLG<br />" 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?
Ответы
Ответ 1
Вы должны включить автоматический возврат в вашей учетной записи PayPal, в противном случае он будет игнорировать поле return
.
Из документации (обновлена, чтобы отразить новый макет январь 2019):
Автовозврат по умолчанию отключен. Чтобы включить автоматический возврат:
- Войдите в свою учетную запись PayPal по адресу https://www.paypal.com или https://www.sandbox.paypal.com. Откроется страница "Обзор моей учетной записи".
- Нажмите на значок шестеренки в правом верхнем углу. Откроется страница "Сводка профиля".
- Нажмите на ссылку Мои настройки продаж в левом столбце.
- В разделе "Продажа через Интернет" нажмите ссылку "Обновить" в строке "Настройки веб-сайта". Откроется страница "Настройки оплаты через веб-сайт"
- В разделе "Автоматический возврат платежей через веб-сайт" установите переключатель "Вкл.", Чтобы включить автоматический возврат.
- В поле "Возвратный URL" введите URL-адрес, на который вы хотите, чтобы ваши плательщики перенаправляли после завершения своих платежей. ПРИМЕЧАНИЕ. PayPal проверяет введенный вами URL-адрес возврата. Если URL-адрес неправильно отформатирован или не может быть проверен, PayPal не активирует функцию автоматического возврата.
- Прокрутите страницу вниз и нажмите кнопку Сохранить.
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
Пример формы с использованием 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="[email protected]">
<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 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("[email protected]", "IPN interaction not verified", "$req", "From: [email protected]");
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 != "[email protected]") {
//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("[email protected]", "NORMAL IPN RESULT YAY MONEY!", $req, "From: [email protected]");
?>
Ниже изображение поможет вам понять процесс paypal.
![Paypal process flow]()
Для дальнейшего чтения обратитесь к следующим ссылкам:
надеюсь, это поможет вам.:)
Ответ 3
один из способов:
попробуйте вставить это поле в код сгенерированной формы:
<input type='hidden' name='rm' value='2'>
rm означает метод возврата;
2 означает (пост)
Чем после покупки пользователем и возврата к URL вашего сайта, то этот url также получит параметры POST
p.s. если вы используете php, попробуйте вставить var_dump($_POST);
в ваш URL-адрес возврата (script), затем сделайте пробную покупку, и когда вы вернетесь на свой сайт, вы увидите, какие переменные получены на вашем URL-адресе.
Ответ 4
Я думаю, что идея установки значений Auto Return, как описано выше Кевином, немного странная!
Скажите, например, что у вас есть несколько веб-сайтов, которые используют одну и ту же учетную запись PayPal для обработки ваших платежей, или говорят, что у вас есть несколько разделов на одном веб-сайте, которые выполняют разные задачи по закупкам, и требуют разных обратных адресов когда платеж будет завершен. Если я разместил кнопку на своей странице, как описано выше, в разделе "Образец формы с использованием PHP для прямых платежей", вы увидите, что там есть строка:
input type="hidden" name="return" value="https://www.yoursite.com/checkout_complete.php"
где вы устанавливаете индивидуальное возвращаемое значение. Почему он должен быть установлен вообще, в разделе профиля также?!?!
Кроме того, поскольку вы можете установить только одно значение в разделе профиля, это означает (AFAIK), что вы не можете использовать автоматическое возвращение на сайт с несколькими действиями.
Комментарии, пожалуйста.
Ответ 5
Поделиться этим, как я недавно столкнулся с проблемами, похожими на эту тему
Долгое время мой сценарий работал хорошо (базовая форма оплаты) и возвращал переменные POST на мою страницу success.php, а данные IPN также в качестве переменных POST. Однако в последнее время я заметил, что страница возврата (success.php) больше не получает никаких POST-переменных. Я тестировал в Sandbox и живу, и я уверен, что PayPal что-то изменил!
Notify_url по-прежнему получает правильные данные IPN, что позволяет мне обновлять БД, но я не смог отобразить сообщение об успешном завершении на странице моего обратного URL (success.php).
Несмотря на попытки многих комбинаций для включения и выключения параметров в настройках оплаты на веб-сайте PayPal и в IPN, мне пришлось внести некоторые изменения в свой сценарий, чтобы обеспечить обработку сообщения. Я достиг этого, включив PDT и Auto Return, следуя этому прекрасному руководству.
Теперь все работает нормально, но единственная проблема заключается в том, что обратный URL-адрес содержит все переменные PDT, что ужасно!
Вы также можете найти это полезным
Ответ 6
на странице проверки найдите элемент скрытой формы "cancel_return":
задайте значение элемента формы cancel_return для URL-адреса, к которому вы хотите вернуться: