PHP PayPal. Способ подтверждения платежа перед приемом платежей - PullRequest
1 голос
/ 15 сентября 2011

Можно ли проверить платеж до того, как PayPal выполнит заказ?

Я использую свою собственную корзину. Когда клиент нажимает кнопку «Отправить заказ», я перенаправляю пользователя на другой вызов страницы PayPalRedirect.php

PayPalRedirect.php

<form name="paypalform" action="https://www.sandbox.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="invoice" value="<? echo $idInvoice; ?>">
<input type="hidden" name="business" value="business_email@example.com">
<input type="hidden" name="notify_url" value="http://mydomain.com/catalog/IPNReceip">


 <? 
    $cpt = 1;
        foreach($ordering as $k => $v)
        {
        ?>
            <input type="hidden" name="item_name_<? echo $cpt?>" value="<? echo$v->Product->ProductNumber; ?>">
            <input type="hidden" name="quantity_<? echo $cpt?>" value="<? echo $v->Qty; ?>">
            <input type="hidden" name="amount_<? echo $cpt?>" value="<? echo $v->Price ?>"> 
            <?
            $cpt++;
        }
    ?>


<input type="hidden" name="currency_code" value="CAD">
<input type="image" src="http://www.paypal.com/en_US/i/btn/x-click-but01.gif" name="submit" alt="Make payments with PayPal - it's fast, free and secure!">
</form> 

Я использую этот JavaScript для отправки формы при загрузке страницы:

<script>
document.forms.paypalform.submit(); 
</script>

В настоящее время все в порядке. Пользователь перенаправляет на страницу PayPal и может войти в PayPal, а затем оплатить заказ.

Мой вопрос на данный момент: Можно ли с помощью PayPal вызвать веб-сервис на моей стороне (например, http://mydomain.com/ValidatePayment.php) и передать все товары из корзины покупок, которые получает PayPal, чтобы подтвердить, что цена верна. Если цена не верна Я хотел бы ответить PayPal, что платеж является недействительным, и отменить транзакцию. Все это, прежде чем клиент нажимает на PayNow на странице PayPal. Как я могу это сделать, если это возможно?

Большое спасибо

1 Ответ

4 голосов
/ 15 сентября 2011

Я не думаю, что можно делать то, что вы хотите. Как только вы отправите клиента в Paypal, он обработает платеж и в конце отправит вам подтверждение.

Если вы хотите убедиться, что клиент заплатил правильную сумму, вам следует проверить подтверждение, которое вам отправляет Paypal.

Как вы, вероятно, знаете, Paypal имеет два механизма подтверждения оплаты - PDT и IPN.

PDT зависит от клиента, возвращающегося на ваш сайт после оплаты. Как только клиент совершит платеж, Paypal отправит вам сообщение PDT с деталями транзакции. Эта информация - то, что вы можете использовать, чтобы показать чек клиенту. Проблема в том, что клиент закрывает свой браузер сразу после оплаты. Если это произойдет, вы можете никогда не получить сообщение PDT.

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

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

Смотрите ниже поток, который я использую на моем сайте:

1 - клиент нажимает кнопку для оплаты через Paypal

2 - мой сайт отправляет клиента в Paypal с деталями транзакции

3 - Paypal обрабатывает платеж

4 - после завершения оплаты Paypal отправит клиента обратно на мой сайт с сообщением PDT.

5 - мой веб-сайт отправляет в Paypal сообщение с подтверждением, чтобы проверить, что сообщение PDT является законным и получено от Paypal.

6 - Paypal отправляет обратно сообщение со всеми деталями транзакции, включая уплаченную цену.

7 - мой веб-сайт проверяет подтверждающее сообщение от Paypal и показывает квитанцию ​​на экране моему клиенту

8 - Paypal также отправит сообщение IPN, как только будет произведен платеж на мой счет продавца.

9 - когда мой веб-сайт получает сообщение IPN, он отправляет обратно сообщение Paypal, чтобы подтвердить, что сообщение является законным и было отправлено из Paypal.

10 - мой веб-сайт затем проверяет подтверждающее сообщение, отправленное обратно из Paypal, и подтверждает, что платеж был правильным.

Обратите внимание, что в большинстве случаев я получу два сообщения от Paypal (один PDT и один IPN). Это нормально, потому что я отслеживаю каждую транзакцию, и если я получаю IPN для транзакции, в которой я уже помечен как оплаченный, я просто отклоняю сообщение IPN.

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

В обоих сообщениях (PDT и IPN) Paypal сообщает вам, очищен ли платеж или нет. Как вы, вероятно, знаете, некоторые типы платежей не очищаются в течение нескольких дней после их отправки в Paypal. Paypal рекомендует не отправлять продукт до тех пор, пока платеж не будет очищен. PayPal отправит вам еще одно сообщение IPN, как только платеж будет очищен.

У меня есть два сценария на моем веб-сайте - один для обработки сообщений PDT, а другой для обработки сообщений IPN. Они очень похожи при обработке подтверждения оплаты. Ниже приведен пример:

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

Надеюсь, это поможет. Пожалуйста, не стесняйтесь задавать дополнительные вопросы.

Удачи!

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