Вычисляем комиссию Paypal

Ох уж эти комиссии Paypal. Все, кто когда-либо имел дело с этой системой знает, что это такое. Вашему вниманию представляю код, который вычислит их для вас. Ввести нужно только сумму:

function paypalFees($sub_total, $round_fee) {
 
    // Начальные параметры
    $fee_percent = '3.4'; // процент за транзакцию (3.4% in UK)
    $fee_cash    = '0.20'; // сумма за транзакцию (£0.20 in UK)
 
    // Вычисление комиссии
    $paypal_fee = ((($sub_total / 100) * $fee_percent) + $fee_cash);
 
    if ($round_fee == true) {
        $paypal_fee = ceil($paypal_fee);
    }
 
    // вычисляем Grand Total
    $grand_total = ($sub_total + $paypal_fee);
 
    // перевод в цифры
    $sub_total   = number_format($sub_total, 2, '.', ',');
    $paypal_fee  = number_format($paypal_fee, 2, '.', ',');
    $grand_total = number_format($grand_total, 2, '.', ',');
 
    return array('grand_total'=>$grand_total, 'paypal_fee'=>$paypal_fee, 'sub_total'=>$sub_total);
}

Добавлено: 10 Мая 2018 18:56:16 Добавил: Андрей Ковальчук

Как замаскировать свою партнерскую ссылку?

В этом уроке пойдет речь о проблеме потери прибыли участниками партнерских программ из-за использования в своей работе незащищенных партнерских ссылок.

Для непосвященных поясню, о чем идет речь. Есть такой способ заработка в сети Интернет как участие в партнерских программах. Т.е. кто-то создал товар и предлагает Вам продавать его за определенное вознаграждение (обычно 10-60% от стоимости товара) с каждой проданной копии.

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

Часть ?partner - это Ваш идентификатор, по которому я могу отследить, что покупатель пришел именно от Вас.

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

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

Для маскировки есть несколько способов:

Если у Вас платный хостинг и есть поддержка php, то Вы можете создать страничку например disc.php, в которую следует внести следующие строки:

<?php $URL="http://allmoments.ruseller.com/?partner";
header("Location:$URL");
exit();
?>

Если хостинг бесплатный и поддержки php нет, то создайте обычную html страницу и между тэгами <head></head> просто вставьте специальный JavaScript.

В итоге у Вас должно получиться примерно так:
<head>
<script language="javascript">
<!-- Old browser shield
window.location.href="http://allmoments.ruseller.com/?partner";
// -->
</script>
</head>

Теперь Ваша партнерская ссылка будет выглядеть намного защищеннее:

http://sait.ru/disc.php - для первого случая.
http://sait.ru/disc.htm - для второго.

Добавлено: 10 Мая 2018 06:48:04 Добавил: Андрей Ковальчук

Robokassa - система электронных платежей

Рано или поздно любой веб-мастер столкнется с необходимостью использовать на своем или сайте клиента систему приема электронных платежей. Различных систем большое множество, можно использовать каждую в отдельности, но все же лучше воспользоваться уже готовым сервисом. Мой взгляд остановился на системе приема платежей под названием Робокасса (http://robokassa.ru/).
Прелесть данной системы в следующем:
1. Принимает платежи практически всеми известными способами (от SMS-сообщений до MasterCard);
2. Небольшая комиссия, которую можно возложить либо на клиентов, либо платить самому - 5%;
3. Удобная система отчетов о проведенных, отмененных и замороженых платежах;
4. Система работает как с юридическими лицами, так и физическими;
5. Адекватная техподдержка.
Для начала пройдите регистрацию и заполните все необходимые поля. Выполните все требования робокассы и мы приступим к самому интересному, к настройке счета и скриптов. Я показывать вам буду на примере моего проекта - сервиса объявлений.
После успешной регистрации и всех формальностей вы попадете в личный кабинет. Сразу обращаю ваше внимание на то, что пока вы пользуетесь тестовым сервером, но после запроса на активацию сменить настройки уже будет нельзя.
С паролями все ясно. Нас интересуют поля с методами отправки и URLами. Сразу оговорюсь, что не так важно какой метод отправки вы выберите, но все же лучше метод POST. А вот URLы имеют самое важное значение. У меня на сайте за проведение всех денежных операций пользователей отвечает 1 страница, которая меняется в зависимости от передаваемых ей данных. Именно поэтому каждый URL имеет похожее значение, где меняется только переменная act. Именно эта переменная будет передавать нашему серверу значение о том, в какое состояние перешел платеж. Вы можете настроить все по своему, но главное чтобы смысл вам был понятен. В зависимости от значения данной переменной мы будем запускать тот или иной скрипт.
Рассмотрим поближе всю систему. Скачайте демонстрационную систему с сайта Робокассы, она нам очень поможет. Для начала форма отправки заявки на оплату:

echo "<p>Стоимость 1 ОП равна 30 рублей. В зависимости от способа оплаты который вы выберете эта стоимость может изменится, т.к. некоторые платежные системы берут дополнительную комиссию.</p>
<div id="paymentform">
<form id="paymentForm"action="room.php#room_client" method="post">
<p class="coins">Количество приобретаемых ОП: ";
    $setTime = time();
    $maxCoins = 10;
    $userNumber = $_SESSION["iduser"];
    $numberOfOrder = $userNumber+$setTime;
    echo "<select id="coins_choice" name="coinsToPay"><option value="".$choiceCoin."">".$choiceCoin."</option></select></p>
            <p>Номер счета:".$numberOfOrder."</p>
            <p>Общая стоимость <input id="full_sum" size="4"> рублей</p>
            <input name="numberOfOrder"type="hidden" value="".$numberOfOrder."">
            <p><input id="button"type="submit" value="Продолжить оплату"></p>
            </form>
            <div id="payment_system"><img src="images/tamplate_1/payment_system.jpg"alt=""></div>
            </div>
            ";

Данная форма позволит нам выбрать, сколько очков мы будем покупать - 1 очко стоит 30 рублей. Таким образом выбрав 4 очка мы купим их за 120 рублей. В поле Общая стоимость выводится сразу сумма средствами JS (мы не будем здесь показывать как это делать, урок не о том). После нажатия на кнопку Продолжить оплату, пользователь передаст номер заказа, свой ID, сумму покупки скрипту, который выполняется на этой же странице.
При получении всех данных срабатывает следующий скрипт:
if (isset($_REQUEST["coinsToPay"]) && isset($_REQUEST["numberOfOrder"])) {
echo "<p><img src="images/tamplate_1/robokassa.gif" alt="" align="right"> Мы используем популярную систему приема платежей, которая гарантирует безопасность ваших переводов. В случае проблем просьба писать в техподдержку.</p>";
echo "<div id="paymentform">";
echo "<p>Номер счета: ".$_REQUEST["numberOfOrder"]."</p>";
$coins = $_REQUEST["coinsToPay"];
echo "<p>Вы приобретаете ".$coins." ОП</p>";
$sumPay = $coins*30;
echo "<p>Сумма к оплате по счету: ".$sumPay." руб.</p>";
// регистрационная информация (логин, пароль #1)
// registration info (login, password #1)
$mrh_login = "*********";
$mrh_pass1 = "*********";
// номер заказа
// number of order
$inv_id = $_REQUEST["numberOfOrder"];
// описание заказа
// order description
$inv_desc = "Оплата очков Easy-bay";
// сумма заказа
// sum of order
$out_summ = $sumPay;
// тип товара
// code of goods
$shp_item = "Coins";
// предлагаемая валюта платежа
// default payment e-currency
$in_curr = "PCR";
// язык
// language
$culture = "ru";
// формирование подписи
// generate signature
$crc  = md5("$mrh_login:$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item");
// форма оплаты товара
// payment form
print "".
    "<form action="https://merchant.roboxchange.com/Index.aspx" method="POST">".
    "<input name="MrchLogin" type="hidden" value="$mrh_login">".
    "<input name="OutSum" type="hidden" value="$out_summ">".
    "<input name="InvId" type="hidden" value="$inv_id">".
    "<input name="Desc" type="hidden" value="$inv_desc">".
    "<input name="SignatureValue" type="hidden" value="$crc">".
    "<input name="Shp_item" type="hidden" value="$shp_item">".
    "<input name="IncCurrLabel" type="hidden" value="$in_curr">".
    "<input name="Culture" type="hidden" value="$culture">".
    "<input type="submit" value="Оплатить">".
    "</form>";
echo "</div>";
mysql_query("INSERT INTO orders (id_order, userid, sum_pay, coins, status) VALUES ('$inv_id', '$userid', '$out_summ', '$coins', 0)");
}

В поля $mrh_login, $mrh_pass1 для начала оставьте те, что даны для тестового сервера, а после отладки всей системы смените на свои. Обратите внимание на переменную $crc, она необходима для того, чтобы передать серверам Робокассы зашифрованную подпись, без которой не пройдет платеж. Так же посоветую использовать свою базу для хранения всех заказов, как это сделано у меня. Так вам проще будет отследить кто оплатил, статус его платежа, дату и время и в случае какого-нибудь сбоя робокассы (или своих неверных настроек) вы сможете безболезненно все исправить.
Теперь распакуйте все скачанные с робокассы файлы, из всех файлов нам понадобятся: result.php, success.php, fail.php. Эти файлы содержат всю необходимую информацию о проведении оплаты. Давайте подключим их опять же к нашему же файлу:
if ($_REQUEST["act"]==1) {
    if (file_exists("includes/success.php")) {
        require("includes/success.php");
        mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
        $result_coins = mysql_query("SELECT coins, userid FROM orders WHERE id_order='$inv_id'");
        $myrow_coins = mysql_fetch_array($result_coins);
        $result_old = mysql_query("SELECT coins FROM users WHERE id='$myrow_coins[userid]'");
        $myrow_old = mysql_fetch_array($result_old);
        $new_coins  =$myrow_old["coins"]+$myrow_coins["coins"];
        mysql_query("UPDATE orders SET status='1' WHERE id_order='$inv_id'");
        mysql_query("UPDATE users SET coins='$new_coins' WHERE id='$myrow_coins[userid]'");
    }
}
if ($_REQUEST["act"]==2) {
    if (file_exists("includes/fail.php")) {
        require("includes/fail.php");
        mysql_query("UPDATE orders SET status='2' WHERE id_order='$inv_id'");
    }
}
if ($_REQUEST["act"]==3) {
    if (file_exists("includes/result.php")) {
        require("includes/result.php");
        mysql_query("UPDATE orders SET status='3' WHERE id_order='$inv_id'");
    }
}

Обратите внимание, в зависимости от того, какое значение мы передали переменной act у нас грузится соответствующий файл - вот в этом и была вся идея. Если мы получили значение 1, то значит платеж прошел успешно, мы получили деньги и соответственно можем плательщику начислить очки, а сам заказ перевести в состояние исполненных. Если 2, то в базе пишем, что пользователь отказался от платежа. act=3 вы вряд ли когда увидите, хотя он соответственно проходит и сразу же запускает нам условие равное 1, т.е. это промежуточный шаг который в основе своей оповещает только администратора.
Рассмотрим структуру каждого файла в отдельности.fail.php:
$inv_id = $_REQUEST["InvId"];
echo "Вы отказались от оплаты. Заказ# $inv_id\n";
echo "You have refused payment. Order# $inv_id\n";

Тут все просто, если пользователь отказался от платежа то мы просто выводим ему это на экран.
success.php:
// регистрационная информация (пароль #1)
// registration info (password #1)
$mrh_pass1 = "*******";
// чтение параметров
// read parameters
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$shp_item = $_REQUEST["Shp_item"];
$crc = $_REQUEST["SignatureValue"];
$crc = strtoupper($crc);
$my_crc =strtoupper(md5("$out_summ:$inv_id:$mrh_pass1:Shp_item=$shp_item"));
// проверка корректности подписи
// check signature
if ($my_crc != $crc)
{
  echo "bad sign\n";
  exit();
}
// проверка наличия номера счета в истории операций
// check of number of the order info in history of operations
$f=@fopen("order.txt","r+") or die("error");
while(!feof($f))
{
  $str=fgets($f);
 
  $str_exp = explode(";", $str);
  if ($str_exp[0]=="order_num :$inv_id")
  {
    echo "Операция прошла успешно\n";
    echo "Operation of payment is successfully completed\n";
  }
}
fclose($f);

Данный файл отвечает за финальное проведение платежа, сверяет контрольную подпись и успешно проводит платеж, а пользователю сообщает об успешном платеже. А также данный скрипт дописывает в файл order.txt лог проведенной операции.
result.php:
// регистрационная информация (пароль #2)
// registration info (password #2)
$mrh_pass2 = "*********";
//установка текущего времени
//current date
$tm=getdate(time()+9*3600);
$date="$tm[year]-$tm[mon]-$tm[mday] $tm[hours]:$tm[minutes]:$tm[seconds]";
// чтение параметров
// read parameters
$out_summ = $_REQUEST["OutSum"];
$inv_id = $_REQUEST["InvId"];
$shp_item = $_REQUEST["Shp_item"];
$crc = $_REQUEST["SignatureValue"];
$crc = strtoupper($crc);
$my_crc =strtoupper(md5("$out_summ:$inv_id:$mrh_pass2:Shp_item=$shp_item"));
// проверка корректности подписи
// check signature
if ($my_crc !=$crc)
{
  echo "bad sign\n";
  exit();
}
// признак успешно проведенной операции
// success
echo "OK$inv_id\n";
// запись в файл информации о прведенной операции
// save order info to file
$f=@fopen("order.txt","a+") or die("error");
fputs($f,"order_num :$inv_id;Summ :$out_summ;Date :$date\n");
fclose($f);

Как уже говорилось выше, это промежуточный файл, который при отсутствии проблем в системе вернет вам переменную act=1.
Причем обратите внимание, что мы используем введенные нами при регистрации пароли практически во всех исполнительных файлах. В каждом файле свой. Это сделано с целью безопасности системы приема платежа и вашего личного кабинета в системе Робокасса.
Я вам показал лишь пример работы с фиксироваными ценами, таким же образом можно сделать систему приема донатов или настроить интернет-магазин. Хочется пожелать вам удачи с этой системой, внимательно все заполняйте и продумывайте систему, чтобы потом не испытать гнев обманутых пользователей. Подробнее о выплатах вы уже можете прочитать на сайте Робокассы.

Добавлено: 13 Апреля 2018 07:06:29 Добавил: Андрей Ковальчук

Ошибки Sape или безопасная продажа ссылок



Совсем недавно DimoninG опубликовал статью об одной из уязвимостей Sape.

Вкратце ситуация такая. Если скрипт на вашем сайте не сможет соединиться с Sape, то вместо ссылок он выведет стандартное сообщение об ошибке, которое начинается со слов SAPE ERROR.

Если это увидит бот поисковика, то выводы будут однозначные.

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

Судите сами. При установке кода Sape в любом случае необходимо присвоить папке, в которой находится скрипт права на запись (777). Иначе скрипт sape.php не сможет создать файл links.db. Можно было бы создать в этой же папке debug.log и выводить ошибки в него.

Правда, не все так плохо.

Если посмотреть исходный код скрипта (файл sape.php), то становится ясно, что все ошибки выводятся функцией raise_error, которая имеет вид:

function raise_error($e) {
 
    $this->_error = '<p style="color: red; font-weight: bold;">SAPE ERROR: ' . $e . '</p>';
 
    if ($this->_verbose == true) {
        print $this->_error;
    }
 
    return false;
}


Думаю, тут все ясно. Ошибки будут выведены, только если переменная _verbose равна true. А по-умолчанию это не так $_verbose = false.

И все-таки, на мой взгляд, вариант с debug.log лучше, да и анализировать его удобнее. Хотя может быть владельцы Sape не хотят, чтобы кто-то анализировал отказы их сервера :-) .

В общем, будьте внимательны!

Добавлено: 03 Марта 2015 22:54:22 Добавил: Андрей Ковальчук