Вот как я реализовал эту функцию на моем сайте. Работает нормально:
Код для отображения кнопки 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¤cy_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
}
}
Надеюсь, это поможет. Пожалуйста, не стесняйтесь задавать дополнительные вопросы.
Удачи!