Кнопка PayPal BuyNow экспресс-оплаты - PullRequest
0 голосов
/ 20 сентября 2011

Я хочу интегрировать Paypal на свой сайт с помощью Express Checkout и параметра notify_url, который уведомит мой сайт и, соответственно, я смогу предпринять действия.

Я сгенерировал кнопки buynow. Пример кнопки "Купить сейчас":

<form action="https://www.sandbox.paypal.com/cgi-bin/webscr" method="post">
                <input name="notify_url" value='http://localhost:9000/Home/ProcessPayment' type="hidden"/>
                <input type="hidden" name="cmd" value="_xclick">
                <input type="hidden" name="business" value="something@something.com">
                <input type="hidden" name="lc" value="US">
                <input type="hidden" name="item_name" value="Basic">
                <input type="hidden" name="amount" value="24.99">
                <input type="hidden" name="currency_code" value="USD">
                <input type="hidden" name="button_subtype" value="services">
                <input type="hidden" name="no_note" value="0">
                <input type="hidden" name="tax_rate" value="0.000">
                <input type="hidden" name="shipping" value="0.00">
                <input type="hidden" name="bn" value="PP-BuyNowBF:btn_buynowCC_LG.gif:NonHostedGuest">
                <input type="image" src="https://www.sandbox.paypal.com/en_US/i/btn/btn_buynowCC_LG.gif"
                    border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">
                <img alt="" border="0" src="https://www.sandbox.paypal.com/en_US/i/scr/pixel.gif"
                    width="1" height="1">
                </form>

Я добавил <input name="notify_url" value='http://localhost:9000/Home/ProcessPayment' type="hidden"/>, чтобы он мог уведомить мой метод действия в контроллере для целей отладки. Однако это не работает.

Я перенаправлен на счет Paypal:

https://www.sandbox.paypal.com/us/cgi-bin/webscr?cmd=_flow&SESSION=somesession&dispatch=somedispatch

Но как только платеж завершен, он никогда не достигает моей точки останова в действии ProcessPayment в контроллере Home. Есть что-то, чего мне не хватает?

Заранее спасибо:)

ОБНОВЛЕНИЕ: - У меня была учетная запись hidemyass pro, и все, что у меня было тогда, это настроить мой веб-сайт в IIS, а затем мой notify_url работал как чудо;).

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

В обычных случаях ваша точка останова никогда не будет достигнута, и это нормально, потому что:

Если у вас нет «прямого» внешнего IP-адреса (и у вас по крайней мере будет маршрутизатор), или вы настроили все для правильной переадресации порта NAT, IPN PayPal перейдет на:

1) Нирвана, потому что вы не настроили IP-адрес правильно

OR

2) На ваш Testserver / Productionserver, какой IP-адрес для IPN вы действительно настроили.

UPDATE:

Есть 2 решения:

  1. Установите IPP-прослушиватель PayPal на свой внешний адрес (может быть, ваш homerouter или ваш маршрутизатор компании) и настройте NAT или попросите администратора сделать это

OR

  1. Используйте Удаленный отладчик в вашей тестовой системе, чтобы подключиться к процессу iis и достичь точки останова.

Я лично склонялся бы к решению 1., потому что я никогда не заставлял удаленный отладчик работать так, как я ожидал ..

1 голос
/ 20 сентября 2011

см. Ниже несколько комментариев, которые, я считаю, помогут вам решить эту проблему:

1 - notify_url должен быть URL-адресом, к которому можно получить доступ из PayPal.Это должно быть что-то вроде http://www.example.com/path/to/your/script. Это URL, по которому PayPal будет публиковать результаты своей транзакции.

2 - вам потребуется способ идентифицировать транзакцию, когда она возвращается из PayPal.Я делаю это путем включения поля

<input type="hidden" name="invoice" value=$uniquevaluecreatedbyyourapplication>

. Paypal отправит это поле обратно в ответе.

В моем случае я добавляю транзакцию в таблицу MySQL и передаюуникальный идентификатор записи в качестве номера счета.Когда PayPal отправляет ответ, я проверяю номер счета в моей базе данных, чтобы идентифицировать транзакцию.

Надеюсь, это поможет.Если нет, пожалуйста, напишите снова.

Обновление, чтобы включить более подробную информацию о сообщении IPN

В основном, когда транзакция завершится, PayPal отправит сообщение наскрипт, который вы передали в поле notify_url.

Paypal добавит токен (tx) к этому сообщению.Ваш сценарий будет вызываться примерно так:

http://www.example.com/path/to/your/listener?tx=1234567890099r48&... (PayPal adds also other transaction fields here).

Однако вы не должны полагаться на поля транзакций, которые PayPal добавляет к первому сообщению, поскольку вы на самом деле не знаете, что оно пришло от PayPal.

Таким образом, чтобы подтвердить, что сообщение пришло от PayPal, вам необходимо отправить обратно сообщение в PayPal, включая отправленное вам tx_token PayPal;только знакомый вам auth_token (вы получаете его из своего аккаунта продавца PayPal);и переменная cmd, которая сообщает PayPal, что вы проверяете транзакцию.

Как только PayPal получит это сообщение от вашего скрипта слушателя, он ответит сообщением, подтверждающим, что транзакция была завершена, и всеми деталями.Вы можете положиться на это второе сообщение, поскольку оно пришло в результате вашего запроса к Paypal с использованием вашего уникального auth_token.

PayPal отправит вам несколько полей с информацией о транзакции, включая одно, подтверждающее, был ли платеж успешным илинаходится в состоянии ожидания.В зависимости от метода, используемого клиентом для оплаты, платеж может оставаться в состоянии ожидания некоторое время, пока не будет очищен.PayPal отправит вам другое сообщение автоматически после подтверждения оплаты.Таким образом, вы должны настроить ваш слушатель для обработки этого второго сообщения также.PayPal рекомендует не отправлять продукт до тех пор, пока платеж не будет очищен.

И для начала ознакомьтесь с кодом, который я использую для сценария прослушивателя, который обрабатывает ответ PayPal.Вам нужно будет настроить его под свои нужды, но он работает для меня.

$req = 'cmd=_notify-synch';

$tx_token = $_GET['tx'];
$auth_token = "enter your own authorization token";
$req .= "&tx=$tx_token&at=$auth_token";

// post back to PayPal system to validate
$header .= "POST /cgi-bin/webscr HTTP/1.0\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: " . strlen($req) . "\r\n\r\n";

//$fp = fsockopen ('http://www.sandbox.paypal.com', 80, $errno, $errstr, 30);
// If possible, securely post back to paypal using HTTPS
// Your PHP server will need to be SSL enabled
// replace www.sandbox.paypal.com with www.paypal.com when you go live
$fp = fsockopen ('ssl://www.sandbox.paypal.com', 443, $errno, $errstr, 30);

if (!$fp)
{
    // HTTP ERROR
}
else
{
    fputs ($fp, $header . $req);
    // read the body data
    $res = '';
    $headerdone = false;
    while (!feof($fp))
    {
        $line = fgets ($fp, 1024);
        if (strcmp($line, "\r\n") == 0)
        {
            // read the header
            $headerdone = true;
        }
        else if ($headerdone)
        {
            // header has been read. now read the contents
            $res .= $line;
        }
    }

    // parse the data
    $lines = explode("\n", $res);
    $keyarray = array();
    if (strcmp ($lines[0], "SUCCESS") == 0)
    {
        for ($i=1; $i<count($lines);$i++)
        {
            list($key,$val) = explode("=", $lines[$i]);
            $keyarray[urldecode($key)] = urldecode($val);
        }
        $firstname = $keyarray['first_name'];
        $lastname = $keyarray['last_name'];
        $itemname = $keyarray['item_name'];
        $amount = $keyarray['payment_gross'];
        $invoiceid = $keyarray['invoice'];
        $profileid = $keyarray['subscr_id'];
        // check the payment_status is Completed
        // check that txn_id has not been previously processed
        // check that receiver_email is your Primary PayPal email
        // check that payment_amount/payment_currency are correct
        // process payment
        // show receipt to client
    }
}

Надеюсь, это поможет.

1 голос
/ 20 сентября 2011

Это потому, что они создают свой собственный HTTPRequest для этого URL, и он не является частью вашего сеанса.

Они будут пытаться связаться с вашим localhost: 9000 со своего сервера, и этот URL не существует для них.

Вам нужно будет внести некоторые записи в журнал, чтобы проверить, что происходит, когда они обращаются к этому URL, например, регистрировать, что они достигли страницы, и что произошло в коде.Затем поместите эту страницу "Live" где-нибудь, чтобы PayPal мог с ней поговорить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...