Как генерировать скидочный купон на PHP?

Доброго времени суток!
Нужно генерировать скидочный купон формата 123456-ABC или похожий на PHP так, чтобы потом путем математических преобразований и/или разнообразных подстановок можно было бы его проверить.
Использовать базу данных с занесенными туда ключами - не вариант, так как проект маленький, и база данных не используется.
Не нужны суперсложные алгоритмы, достаточно будет что-нибудь простого. Ключи будут генерироваться по несколько штук в день, действие купона - 1 год.
Наверное, вопрос к тем, кто разбирается в криптографии.
Буду благодарен за ответ!
  • Вопрос задан
  • 6210 просмотров
Решения вопроса 1
@zdiii
Сделал как хотели)
Вид купона:JFCA-4304790701739
И так, generate.php создает купон.
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Проверка купона</title>
</head>
<body>
    <form action="generate.php" method="post">
        Купон до:
        <input type="number" max="31" style="width:5%;" placeholder="31" name="d">        <input type="number" max="12" style="width:5%;" placeholder="06" name="m">
        <input type="submit" value="Создать">
    </form>
    <br><br><br>
    <?php
if (!isset($_POST['m'])){
    } else {
                $kupon = $_POST['m'].$_POST['d'];
                $dr = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
                $drr   = array( "A", "B", "C", "D", "E", "F", "G", "H", "I", "J");
                $data = str_replace($dr, $drr, $kupon);
                $kupon2 = $kupon * 79 * 89 * 99 * 99 * 99;
                $kupon2 = "$data-$kupon2";
                echo "Ваш купон: \"<b>$kupon2</b>\"";
};
?>
</body>
</html>

сохраняете код в виде generate.php .

Далее, proverka.php проверяет купон на действительность.
<!doctype html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Проверка купона</title>
</head>
<body>
    <form action="proverka.php" method="post">
        Введите купон:
        <input type="text" style="width:50%;" placeholder="88e3e18656d274a70518ecdcaf01aec5" name="kupon">
        <input type="submit" value="Проверить">
    </form>
    <br><br><br>
    <?php;
if (!isset($_POST['kupon'])){
    } else {
              $kupon = substr($_POST['kupon'], 0, 4);
              $date = date("md");
              $dr = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "0");
                $drr   = array( "A", "B", "C", "D", "E", "F", "G", "H", "I", "J");
                $data = str_replace($drr, $dr, $kupon);
                
              $kupon2 = $data * 79 * 89 * 99 * 99 * 99;
              $kupon2 = "$kupon-$kupon2";
              if ($_POST['kupon'] == $kupon2) {
                        if($data>=$date){
                                              echo "<h1>Действительный купон!</h1>";
                                              } else {
                                              echo "<h1>Недействительный купон!</h1>";
                        };
              } else {
              echo "<h1>Недействительный купон!</h1>";
              }
};
?>
</body>
</html>

сохраняете код в виде proverka.php .
Заливаете на сервер два файла.
Юзайте) Вопросы задавайте, отвечу)))
Могу модифицировать как пожелаете))) Конечно, за небольшую яндекс.деньги)
mail: marketing-kg@yandex.com
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@miki131
Если SQLite не подходит, сделайте просто JSON файл со списком кодов. Что то типа такого
[
{
  "code": "123456-ABC",
  "created_at": "22-06-2014",
  "valid": true
}
]
Ответ написан
Комментировать
morozovdenis
@morozovdenis
какая разница меленький или большой проект

если не хотите БД-сервер, то используйте SQLite и создайте БД-файл тут же на файле где пхп скрипты лежат
Ответ написан
Комментировать
bohdaniel
@bohdaniel Автор вопроса
До того, как понял, что предложенный мной вариант мне немного не подходит, делал так...
Может кому пригодится...

1) Допустим, нужно сгенерировать купон типа 314420-ABG
2) Генерируем рандомно число от 65 до 90 (=65)
3) Генерируем первую букву из ascii (=А)
4) Отнимаем от кода буквы 64 (65-64=1)
5) Умножаем 1х2 = 2
6) Переводим это число в радианы: 2*пи/180 = 0,03 (с округлением)
7) Узнаем остаток этого числа после комы (=03)
8) Разбиваем число на две части: 0 и 3
9) Получаем первое (3) и последнее (0) число из числового набора
10) Умножаем эти числа и додаем 14 (результат всегда будет двузначным = 14)
11) Раскладываем это число на отдельные числа 1 и 4. Это будет второе (1) и четвертое (4) число из числового набора
12) Умножаем 1-е, 2-е и 4-е число (=12). Разбиваем на отдельные символы (1, 2). Узнаем кто из них больше (=2). Это и будет наше 5-е число из числового набора.
13) Генерируем случайно вторую букву (66=B)
14) Отнимаем 64 = 2
15) abs(cos(2)) = 0.41
16) узнаем первое число после комы (4)
17) Это и будет наше последнее, 3е число из числового ряда.
18) Последняя буква тоже генерируется рандомно. Но она для красоты :)

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

Войдите, чтобы написать ответ

Похожие вопросы