<?php
if($_module == 'merchant_bill') {
// Данные о товаре
$item = getItem($_item);
// Проверка на свободную цену
if(isset($_POST['price'])) {
$item['free_price'] = formatPrice($_POST['price']);
if($item['free_price'] < $item['price']) {
header('Location: ' . $_SERVER['HTTP_REFERER']);
exit;
} else {
$item['price'] = $item['free_price'];
// Если цена 0.00
if($item['price'] == '0.00') {
// Получение видов валют
$currencies = unserialize(ESHOP_CURRENCIES);
// Установка id транзакции
$_BILL['inv_id'] = time();
// Успешная оплата
successPayment($item, $item['price'], $currencies[$item['currency']], $item['id'], $_BILL);
exit;
}
}
}
// Адрес сервера
$_BILL['SERVER'] = ESHOP_DEBUG ? 'https://www.sandbox.paypal.com/cgi-bin/webscr' :
'https://www.paypal.com/cgi-bin/webscr';
// Получение видов валют
$currencies = unserialize(ESHOP_CURRENCIES);
// ID транзакции
$_BILL['TRANS_ID'] = time();
// ID товара
$_BILL['item_id'] = $item['id'];
if($item != false) {
// Русский язык при оплате
$_BILL['LANGUAGE'] = 'RU';
$_BILL['ACTION_CMD'] = '_xclick';
// Email продавца
$_BILL['RECEIVER_EMAIL'] = $_BILL['facilitator'];
// Название товара
$_BILL['GOODS_NAME'] = $item['name'];
// Описание товара
$_BILL['PAYMENT_DESC'] = $item['descr'];
// Стоимость товара (в валюте биллинга)
$_BILL['PAYMENT_AMOUNT'] = convertPrice($item['price'], $currencies[$item['currency']], 'USD');
// Адрес сервера и параметры
$_BILL['request_data'] = array(
'notify_url' => ESHOP_FULL_URL . ESHOP_ROOT_URL . '/?merchant=paypal&return=result',
'return' => ESHOP_FULL_URL . ESHOP_ROOT_URL . '/?merchant=paypal&return=success',
'cancel_return' => ESHOP_FULL_URL . ESHOP_ROOT_URL . '/?merchant=paypal&return=fail',
'no_shipping' => 1,
'lc' => $_BILL['LANGUAGE'],
'cmd' => $_BILL['ACTION_CMD'],
'business' => $_BILL['RECEIVER_EMAIL'],
'item_name' => $_BILL['GOODS_NAME'],
'item_number' => $_BILL['TRANS_ID'],
'amount' => $_BILL['PAYMENT_AMOUNT'],
'custom' => $item['name']
);
// Запоминание товара
$_SESSION[$_BILL['request_data']['custom']] = $_BILL['item_id'];
// Форма и отправка POST запроса
$tpl = '<html><head><title>Обработка платежа Paypal…</title></head>';
$tpl .= '<body';
$tpl .= ' onload="document.getElementById(\'paypal-payment\').submit();"';
$tpl .= '><form id="paypal-payment" method="post" action="' . $_BILL['SERVER'] . '" style="margin: 100px auto; width: 300px; text-align: center">';
while (list($key, $value) = each($_BILL['request_data']))
$tpl .= '<input type="hidden" name="' . $key . '" value="' . $value . '" />';
$tpl .= '<script type="text/javascript">document.write(\'Обработка платежа Paypal…\');</script>';
$tpl .= '<noscript><input type="submit" name="submit" value="Заплатить ' . displayPrice($item['price'], $item['currency']) . ' с помощью Webmoney" /></noscript></form></body></html>';
echo $tpl;
}
exit;
}
/**
* Обработка ответов
* биллинга Webmoney
*/
if($_module == 'merchant_return' && $_action != '') {
// Получение ID товара
$item_id = isset($_SESSION[$_POST['custom']]) ? $_SESSION[$_POST['custom']] : false;
// Получение информации о товаре
$item = getItem($item_id);
// Получение ID транзакции
$_BILL['inv_id'] = $_POST['item_number'];
/**
* Обработка оповещения о платеже
* (Result URL)
*/
if('result' == $_action) {
// STEP 1: read POST data
// Reading POSTed data directly from $_POST causes serialization issues with array data in the POST.
// Instead, read raw POST data from the input stream.
$data = file_get_contents('php://input');
$array = explode('&', $data);
$post = array();
foreach ($array as $keyval) {
$keyval = explode ('=', $keyval);
if (count($keyval) == 2)
$post[$keyval[0]] = urldecode($keyval[1]);
}
// read the IPN message sent from PayPal and prepend 'cmd=_notify-validate'
$req = 'cmd=_notify-validate';
if (function_exists('get_magic_quotes_gpc')) {
$get_magic_quotes_exists = true;
}
foreach ($post as $key => $value) {
if ($get_magic_quotes_exists == true && get_magic_quotes_gpc() == 1) {
$value = urlencode(stripslashes($value));
} else {
$value = urlencode($value);
}
$req .= "&{$key}={$value}";
}
// Step 2: POST IPN data back to PayPal to validate
$ch = curl_init('https://ipnpb.paypal.com/cgi-bin/webscr');
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $req);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_FORBID_REUSE, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Connection: Close'));
// In wamp-like environments that do not come bundled with root authority certificates,
// please download 'cacert.pem' from "https://curl.haxx.se/docs/caextract.html" and set
// the directory path of the certificate as shown below:
// curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');
if ( !($res = curl_exec($ch)) ) {
// Ошибка! Закрываем соединение
// с сервером и завершаем скрипт
curl_close($ch);
exit;
}
// Закрываем соединение с сервером
curl_close($ch);
// inspect IPN validation result and act accordingly
if (strcmp ($res, "VERIFIED") == 0) {
// Все успешно прошло, мы можем записать пользователя
// как купившего файл. Но мы делать этого конечно-же не будем :)
} else if (strcmp ($res, "INVALID") == 0) {
// Отдаём сообщение о том, что наш платёж не прошёл валидацию!
echo "The response from IPN was: <b>" .$res ."</b>";
sendErroMerchantEmail('PayPal', $item['name']);
exit;
}
// Отправка уведомления владельцу
sendMerchantEmail();
exit;
}
/**
* Успешное проведение платежа
* (Success URL)
*/
else if('success' == $_action && $item) {
// Установка id транзакции
$_BILL['inv_id'] = time();
// Установка правильной цены
$currencies = unserialize(ESHOP_CURRENCIES);
$currencies_l = unserialize(ESHOP_CURRENCIES_LABELS);
$_BILL['item_cur'] = $currencies_l[array_search(ESHOP_GA_PRICE, $currencies)];
// Успешное оплата
successPayment($item, $item['price'], $currencies[$item['currency']], $item['id'], $_BILL);
exit;
}
/**
* Неудачное проведение платежа
* (Fail URL)
*/
else if('fail' == $_action && $item) {
// Переход на страницу товара
header('Location: ./?buy=' . $item_id, true, 301);
exit;
}
exit;
}
exit;
?>