Задать вопрос

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

Доброго времени суток!
Нужно генерировать скидочный купон формата 123456-ABC или похожий на PHP так, чтобы потом путем математических преобразований и/или разнообразных подстановок можно было бы его проверить.
Использовать базу данных с занесенными туда ключами - не вариант, так как проект маленький, и база данных не используется.
Не нужны суперсложные алгоритмы, достаточно будет что-нибудь простого. Ключи будут генерироваться по несколько штук в день, действие купона - 1 год.
Наверное, вопрос к тем, кто разбирается в криптографии.
Буду благодарен за ответ!
  • Вопрос задан
  • 6264 просмотра
Подписаться 8 Оценить Комментировать
Помогут разобраться в теме Все курсы
  • Skillbox
    Веб-разработчик на PHP
    9 месяцев
    Далее
  • Хекслет
    PHP-разработчик
    10 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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) Последняя буква тоже генерируется рандомно. Но она для красоты :)

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

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

Похожие вопросы
FoodSoul Калининград
от 180 000 до 250 000 ₽
IT-Spirit Москва
от 230 000 до 320 000 ₽
от 200 000 до 290 000 ₽