Встановлення повернення URL-адреси PayPal та автоматичне повернення?


127

Це додаткове запитання до: PHP: Простий спосіб запуску PayPal?

Отже, моя проблема полягає в тому, що я вказую URL-адресу повернення. Однак, заплативши за допомогою PayPal, я опинився на екрані aa, на якому написано:

Ви щойно закінчили свій платіж. 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?


Зауважте, що хост enteres у вашому користувальницькому параметрі повернення повинен бути таким, як налаштований у вашому обліковому записі 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 буде тоді правильним місцем для оновлення бази даних, щоб позначити замовлення як оплачені.



5
З новим макетом веб-сайту Paypal це вже не зовсім точно. Крок 3) Клацніть My Selling Tools Крок 4) Клацніть Website PreferencesпідSelling Online
Webnet

2
IPN слід використовувати для перевірки того, чи правильно оброблялось замовлення PayPal, однак, вам все ще потрібна URL-адреса повернення, щоб показати користувачеві свій усвідомлений успіх. Тому багато разів користувач не отримує електронний лист, який ви надсилаєте, тому добре, якщо вони можуть отримати доступ до продукту (завантажити тощо) одразу.
pcunite

1
@Kevin Stricker Як ми можемо встановити URL-адресу повернення для двох різних сайтів? наприклад, якщо я використовую один обліковий запис Paypal для 2 веб-сайтів, але я можу додати лише одну URL-адресу як URL-адресу повернення за допомогою ваших кроків. як я можу використовувати це для 2-х сайтів?
Гаурав

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. Однак ПП намагається з ними лише один раз, тому на них не можна покладатися критичного виконання замовлення (скажімо, покупець закриває веб-переглядач після оплати, але все ще на ПП). З цього приводу ви можете також створити резервну копію надійного IPN-процесу за допомогою "notify_url", обробляючи статус "Завершено" як мінімум (припустимо, що все інше є невдалим, можливо, це вимагає ручного узгодження). Обробка ваших PDT та IPN-серверів повинна забезпечити заповнення замовлення лише один раз.
Патанджалі

Я вірю, що змінилися речі, і Paypal success.php тепер працює лише зі змінними GET. Дивіться тут: stackoverflow.com/questions/45671366/…
Сол

23

один із способів я знайшов:

спробуйте вставити це поле у ​​створений код форми:

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

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

2 засоби (посада)

Тоді після придбання користувачем і повернення до URL-адреси вашого веб-сайту, тоді ця URL-адреса отримує і параметри POST

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


Ви справді цим користувались?
Саймон Гіббс

Це було чудово. Поки переказ даних про платежі вимкнено в paypal, ви отримаєте всі налаштування пошти, що надсилаються до URL-адреси повернення.
JulianJ

4

Поділитися цим, як я нещодавно стикався з проблемами, схожими на цю тему

Тривалий час мій сценарій працював добре (основна форма оплати) і повертав змінні POST на мою сторінку success.php та дані IPN у вигляді змінних POST. Однак останнім часом я помітив, що зворотна сторінка (success.php) більше не отримує жодної пошти. Я пройшов тестування в Sandbox і живу, і я впевнений, що 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
параметр повернення може бути переданий для кожної форми, що
переосмислює

1
так, що сказав DropHit, що це лише значення автоматичного повернення за замовчуванням, якщо ви забудете передати його як параметр. якщо ви передасте його як параметр, він використовуватиме вашу URL-адресу повернення для кожного з ваших веб-сайтів.
хаміш

чи допомагає це? codeseekah.com/2012/02/11/…
hamish

@DropHit Чи PDT все ще працює з переокремленими returnзначеннями на кнопку ? Тож у мене можуть бути різні сторінки повернення, які все ще отримуватимуть PDT-дані?
Дай

Вибачте за пізню відповідь - я не впевнений, що вона буде працювати, але мої поточні інтеграції все ще працюють так, як очікувалося, хоча це не гарантує, що ваш випадок використання буде працювати як мій
DropHit

1

на сторінці оформлення замовлення шукайте прихований елемент форми 'cancel_return':

встановіть значення елемента форми Cancel_return до URL-адреси, до якої потрібно повернутися:


Насправді "скасувати повернення" використовується лише тоді, коли транзакція не завершиться. Вам ОБОВ'ЯЗКОВО надавати URL-адресу "return" для обробки успішно завершених транзакцій, інакше URL-адреса за замовчуванням буде використана для них.
Патанджалі

Не тоді, коли транзакція не вдається, а скоріше, коли покупець натискає на посилання "Скасувати та повернутися до [ім'я продавця]" під час оформлення замовлення, щоб відмовитися від виконання замовлення.
SubGothius
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.