используя ответ POST в php - PullRequest
       41

используя ответ POST в php

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

Я настраиваю простую кнопку PayPal.При нажатии мне нужно записать заказ в мою базу данных, а затем перенаправить его через POST на PayPal.Часть базы данных работает просто отлично, однако POST для PayPal этого не делает.

Я использую код от wez furlong для отправки запроса на сервер PayPal и должен обработатьответ для правильного перенаправления клиента (мне нужно получить местоположение из ответа).

В конце концов, это должно вести себя так же, как обычная кнопка PayPal «купить сейчас», перенаправляя пользователя на PayPalпри нажатии.

Я просто не могу получить ответ, и документация PayPal очень расплывчата по этому вопросу.Как извлечь правильный URL для перенаправления клиента?

Любая помощь приветствуется!Tobias

Ответы [ 4 ]

0 голосов
/ 16 сентября 2011

Вот как я реализовал эту функцию на моем сайте. Работает нормально:

Код для отображения кнопки Paypal:

Content += "<br/><a href='javascript:Pay();'><img src='http://www.example.com/images/paypal_checkout_button.jpg' alt='Secure payment through PayPal' border='0' /></a><br/><br/>";

Pay () - это функция javascript, вызываемая, когда клиент нажимает кнопку.

Код функции Pay ()

function Pay() {
    var MessageParam = "msgjson=" + JSON.encode(msgJSON) + "&invoicejson=" + JSON.encode(invoiceJSON);
    var myRequest = new Request({url:"http://www.example.com/savetransaction.php", onSuccess: function(InvoiceId) {CallPayPal(InvoiceId);}}).post(MessageParam);
}

Функция Pay делает две вещи:

1 - передает детали транзакции в скрипт PHP (savetransaction.php), работающий на сервере. Этот скрипт сохраняет транзакцию в базе данных. Обратите внимание, что транзакция сохраняется как ожидающая в базе данных. Он изменится на Платный, как только я получу подтверждение от Paypal, что оно было оплачено. Скрипт savetransaction.php возвращает номер идентификатора счета, который является идентификатором из базы данных после вставки. Это уникальный идентификатор, который идентифицирует эту транзакцию на протяжении всего процесса оплаты. Я отправлю этот номер на PayPal, и он отправит его мне обратно в подтверждении платежа.

2 - onSuccess вызывает функцию CallPayPal (InvoiceId), которая отправит клиента в Paypal (см. Ниже).

Код функции CallPayPal (InvoideId)

function CallPayPal(InvoiceId) {
    var PayPalUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_xclick-subscriptions&business=YOURCODEHERE&lc=US&item_name=YOURITEMNAMEHERE&item_number=YOURITEMNUMBER&no_note=1&no_shipping=2&rm=1&return=URL_OF_SCRIPT_THAT_WILL_HANDLE_PAYPAL_RESPONSE&cancel_return=URL_OF_SCRIPT_THAT_WILL_BE_CALLED_IF_CLIENT_CANCEL_PAYMENT_AT_PAYPAL&src=1&a3=" + invoiceJSON.AmtSubs + "&p3=1&t3=M&currency_code=USD&bn=PP%2dSubscriptionsBF%3abtn_subscribeCC_LG%2egif%3aNonHosted";
    window.open(PayPalUrl + "&invoice=" + InvoiceId,"_self");
}

Вам нужно будет изменить URL PayPal в соответствии с вашими потребностями. Мой для кнопки подписки. Обратите внимание, что я включаю InvoiceId в конце. Это будет получено PayPal и отправлено обратно в ответ.

Когда клиент завершит оплату, Paypal отправит его обратно на адрес, указанный в переменной return. Paypal добавит код транзакции в URL. Смотрите ниже скрипт php, где я обрабатываю возврат из Paypal:

Код для PayPalPDT.php

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

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

Удачи!

0 голосов
/ 16 сентября 2011

Поскольку вам нужно перенаправить пользователя в PayPal, вы не можете сделать POST с сервера, чтобы это произошло.

Вместо этого я бы предложил вам использовать AJAX и перехватывать нажатие кнопки. Когда кнопка нажата, ваша функция JavaScript может вызвать URL на вашем сервере для записи данных, а затем отправить пользователя в PayPal.

0 голосов
/ 16 сентября 2011

Код на wezfurlong предназначен для того, чтобы сервер делал PHP-пост на paypal, а не для перенаправления клиента.Я думаю, что я реализовал это, создав HTML-форму, которая указывает на PayPal и команду Javascript для его отправки, что-то вроде:

<html><body>
<form method='post' action='paypalurl'>
  <input name='some required field' blah blah...>
</form>
<script>
  document.forms[0].submit();
</script>
</body></html>
0 голосов
/ 16 сентября 2011

Используйте переменные GET, если вы используете перенаправление заголовка.
Например: https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=yourpaypalemail&amount=theamount&item_name=the%20item%20name

См. Также «HTML-переменные для платежей через веб-сайт Standard» по адресу https://merchant.paypal.com/us/cgi-bin/?cmd=_render-content&content_ID=developer/e_howto_html_Appx_websitestandard_htmlvariablesдля дополнительных переменных вы можете использовать.

...