Page 1 of 1

Keygen URL completion

Posted: Wed Feb 12, 2020 4:25 am
by andvl
Я прошу прощения, если что-то не понял, или кого-то обидел.

Система активации действительно оказалась приятной штучкой. Самое главное её достоинство - это то, что не надо носиться с HWID и загружать пользователя этой абракадаброй. Пользователь только нажимает кнопку <активировать> и дальше всё происходит автоматически.
Свой HWID пользователь не видит вообще.

Это ещё удобно при выдаче триал кода активации. Я на всякий случай скажу, если кто не понял, как это сделать.

+ Зайдя в свой Web License Manager (WLM) мы выбираем новый продукт и в пункте (Режим генератора) выбираем (Коды активации).

+ Затем, когда продукт создан, мы наведя на него мышь, выбираем (Новый Мод). В опциях указываем (ID компьютера) = (из URL), далее (Дата окончания) = (дней с даты) = 3 (или сколько вы хотите дней дать пользоваться продуктом) (Время действия) = (нет), остальное по желанию, нажимаем (Сохранить)

+ Затем в окне WLM выбираем (Новый код) из раздела (Коды активации). Далее в меню (Продукт) выбираем имя своего нового мода продукции (именно мода ! ) Графы (Имя) и (Email) заполняем названиями своего сайта и своей почты. (Кол-во Активаций) - там стоит 1 - стираем её. И как только мы кликнем в другую графу, в Кол-ве Активаций появляется надпись (unlimited) - Это важно. (Дату окончания) оставляем пустой, нажимаем (Сохранить).

+ Теперь в графе (Код) можно увидеть код активации, а в графе (Кол-во активаций/Использовано) будет знак бесконечности (это означает, что данный код можно активировать бесконечное число раз) и через черточку число (сначала 0), обозначающее сколько людей решили посмотреть вашу программу. Их программа будет активирована только на то кол-во дней, которое вы указали, когда создавали новый мод. Второй раз с того же компьютера активировать этот код на новый срок не удастся, и это важно.

+ В продаваемой программе (например в окне (About) ) вы предоставляете пользователю текстовое редактируемое поле, где заранее прописываете полученный вами выше код активации. А также кнопку (Активировать) Пользователь нажимает её и программа начинает функционировать... но только на 3 дня (или сколько вы указали).

Я работаю в Билдере там примерно это ( с учётом юникода) выглядит так:

Code: Select all

#include <Registry.hpp>
#include <tchar.h>
void __fastcall TForm1::FormShow(TObject *Sender)
{
   Form1->Edit1->Text = _T("XREW-5Q3B-TBL7"); // прописываете полученный код активации
}
//------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
   const int size = 2048 / 8 * 3 / 2 + 100; // способ вычисления описан: http://vmpsoft.com/support/user-manual/licensing-system/activation-system/activation-api/
   char new_serial[size];
   int result = VMProtectActivateLicense(   AnsiString(Edit1->Text.c_str()).c_str(), new_serial, size );

   if( result == ACTIVATION_OK )
   {
      VMProtectSetSerialNumber( new_serial );

          // Запись серийного номера в реестр
      TRegistry *RegKey = new TRegistry();
      RegKey->OpenKey( MY_KEY_NAME, true ); // Открываем ключ для записи
      RegKey->WriteString( MY_SERIAL_NUMBER_VAR, String(new_serial) );
      RegKey->CloseKey();  // Закрываем ключ
      delete RegKey;
   }
   else // неудача активации
   {
      //...
   }
}
//------------------------------------------------

В этой редактируемой строке пользователь может потом ввести купленный код активации и активировать программу уже навсегда.

Для этого надо создать новый мод продукта, где бы лицензия уже была бессрочной. В опциях
указываем: (ID компьютера) = (из URL), (Дата окончания) = (нет) (Время действия) = (нет), остальное по желанию, нажимаем (Сохранить)
На созданный мод продукта наводим мышь, нажимаем (Генератор) далее (Выберите шаблон:) = (PayPro) (стоит по умолчанию) и видим примерно такую строку:

http: //mysite.com/weblm/keygen.php ?productid=4&customeremail={CUSTOMER_EMAIL}&customername={CUSTOMER_NAME}&companyname={COMPANY_NAME}&quantity={PRODUCT_QUANTITY}&orderref={ORDER_ID}

Нам важно запомнить для начала номер продукта: productid=4 то есть 4 - номер нашего продукта (у вас может быть другой)

Теперь САМЫЙ ВАЖНЫЙ ВОПРОС: как же нам автоматически при покупке пользователем продукта сгенерировать код активации и передать ему на е-мэйл.

Авторы WLM считают, что большинство платёжных систем умеют сами сделать запрос к WLM получить от него код активации и отослать его пользователю.
Дерзну высказать своё мнение.
Большая просьба к модераторам форума не восклицать сразу после этого: "Какая жесть!", не закрывать тему, не стирать мои записи, и вообще, вспомнить о господствующем пока что в нашей стране всё-таки плюрализме мнений, о котором, как известно, двух мнений быть не может.
Так вот, я считаю, большинство платёжных систем означенные действия делать НЕ УМЕЮТ.
Я уже рассказывал, как я обратился в PayPro Global (которая как раз таки это делать умеет)
И там мне сказали, покажите нам свой сайт, дайте нам ваши продукты с паролями, представьте статистику возврата денег в ваши банки за год - и мы тогда подумаем подключать вас к системе или нет.
Если бы у меня были банки, я бы к вам и не обращался...
Что же умеет делать большинство платёжных систем? Они умеют делать HTTP уведомления, в которых GET или POST запросом передают нужные нам сведения о пользователе и оплате продукта. А вот обратно они ничего не ждут, никаких кодов активации, максимум код подтверждения удачного принятия уведомления, типа: 200 OK.
Поэтому в строке адреса, на который кошелек будет отправлять уведомления, надо указать не WLM, а файл со своим скриптом, который как раз сделает запрос к WLM, получит от него код активации, отошлёт его пользователю, а кошельку ответит: 200 OK.
Вот почему бы этот скрипт не написать было авторам WLM ? Вот, про то я и спрашивал как сделать запрос к WLM и получить код активации. Впрочем, умолкаю, а то точно тему закроют.

Поделюсь для желающих собственным опытом.
Проанализировав российские платёжные системы я пришёл к выводу, что лучше всего Яндекс.Кошелек. (Вы можете выбрать что-то другое) У него самая низкая комиссия: при переводе с банковской карты - 2%, а с Яндекс.Денег, так и вообще 0,5% (на февраль 2020)
В других платёжных системах комиссия от 10 до 20%. Единственно, что для работы с Яндекс деньгами у вас должен быть на сайте SSL сертификат, то есть HTTPS соединение. Без него личные данные (имя, почту) они не передают, а без этих данных - никак.

+ Создаём на сайте страницу оплаты (показываю только функционал без украшений). Назовём файл, например, buy.html В нём мы отправляем форму в Яндекс кошелёк (Подробно о создании таких форм: https://money.yandex.ru/quickpay/form?

Code: Select all

<!DOCTYPE html>
<html>
<head>
    <title>Выбор способа оплаты</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
    <h3> Выберите способ оплаты:</h3>
    <form name="buy" method="POST" action="https://money.yandex.ru/quickpay/confirm.xml">
       <p><label><input type="radio" name="paymentType" value="AC" checked = "checked">Банковской картой</label></p>
       <p><label><input type="radio" name="paymentType" value="PC">Яндекс.Деньгами</label></p>
       <p><label><input type="radio" name="paymentType" value="MC">С телефона</label></p>
       <p><input type="submit" value="Оплатить"><p>

       <input type="hidden" name="receiver" value="41XXXXXXXXXXXX"> <!-- Здесь передаем номер своего кошелька -->     
       <input type="hidden" name="formcomment" value="Оплата моего продукта через Яндекс.Деньги">   
       <input type="hidden" name="short-dest" value="Мой продукт">   
       <input type="hidden" name="label" value="4"> <!-- Здесь передаем номер продукта -->   
       <input type="hidden" name="quickpay-form" value="shop">   
       <input type="hidden" name="targets" value="Покупка бессрочной лицензии для моего продукта"> <!-- Цель платежа - будет хорошо видна пользователю при оплате -->   
       <input type="hidden" name="sum" value="500" data-type="number"> <!-- Стоимость продукта в рублях -->     
       <input type="hidden" name="comment" value="Код активации будет выслан на адрес указанной вами почты."> <!-- Комментарий к платежу - тоже виден пользователю при оплате -->     
       <input type="hidden" name="need-fio" value="true">    <!-- Имя - важно -->   
       <input type="hidden" name="need-email" value="true">  <!-- Почта обязательно нужна -->     
       <input type="hidden" name="need-phone" value="false">   
       <input type="hidden" name="need-address" value="false">   
    </form>
</body>
</html>

Здесь несколько важных полей:
+ receiver - это номер вашего счёта в кошельке
+ label - через него передаём номер продукта (в нашем примере 4)
+ sum - цена продукта в рублях
+ need-fio - будет требоваться ввод имени при оплате
+ need-email - будет требоваться ввод почты при оплате

Далее создаём на сайте файл, например, lic.php Адрес этого файла (например, https://mysite.com/lic.php) прописываем в настройках HTTP уведомлений Яндекс-кошелька. (Не забыть, что соединение должно быть https) Именно этот файл будет вызываться при оплате, и уже в нём мы сделаем POST запрос к WLM, чтобы получить код активации. Можно делать и GET запрос, но с точки зрения безопасности от взлома лучше невидимый для пользователя POST запрос. Чтобы "отловить" ответ WLM, я использовал расширение cURL для php.
Важно передать следующий ассоциативный массив:

Имя ключа Значение Объяснение
----------- ------------- ------------------
productid= 'N' номер МОДА продукта (в нашем примере 4)
customername= 'username' имя пользователя
customeremail= 'useremail' почта пользователя
orderref=' 'N' номер чека (из кошелька Яндекс) (это единственный неважный параметр, ни на что невлияющий)
quantity=' '1' количество активаций, доступных пользователю (обычно 1, нельзя оставить незаполненным, иначе количество активаций будет бесконечным)

Code: Select all

<?php
   // формируем POST запрос к WLM
   $params =
      'productid='     .$_POST['label'].
      '&customername=' .$_POST['firstname'].' '.$_POST['fathersname'].' '.$_POST['lastname']. // Складываем имя пользователя (Яндекс запрашивае ФИО)
      '&customeremail='.$_POST['email'].
      '&orderref='     .$_POST['operation_id'].
      '&quantity='     .'1';

   $ch = curl_init( 'https://mysite.com/weblm/keygen.php' );
   curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
   curl_setopt( $ch, CURLOPT_POST, true );
   curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
   $result = curl_exec( $ch );
   curl_close( $ch );
   }

   $to = $_POST['email'];
   $subject = 'Вам выслан код активации';
   $text = "Ваш код активации: $result";
   $headers = 'From: info@mysite.com\r\n';
   $headers .= 'Reply-to: <info@mysite.com>\r\n';
   $headers .= 'Content-type: text/html; charset=utf-8';
   mail( $to, $subject, $text, $headers );
   
   echo '200 OK';
?>

Остаётся добавить проверку валидности вызова liс.php именно вашей платёжной системой, а не злоумышленниками.
В Яндекс есть секретное слово которое соединяется через амперсанд в строке с другими POST параметрами, которые передаются в liс.php. Эта строка хешируется, и хеш тоже передаётся. Его мы и проверяем, зная секретное слово. Подробно: https://yandex.ru/dev/money/doc/dg/refe ... g-docpage/
Вот эта строка:
notification_type & operation_id & amount & currency & datetime & sender & codepro & notification_secret & label
где notification_secret — это секретное слово для проверки уведомлений.
В итоге вместе с проверками файл lic.php может выглядеть так:

Code: Select all

<?php
    //*********************** ПРОВЕРКИ ******************************
    // Проверка: прислан ли вообще sha1_hash
    if( !isset($_POST['sha1_hash']) )
    {
        echo '400 Bad Request';
        die;
    }
    // Формируем строку для хэширования
   $control = '';
   $fields = array( 'notification_type', 'operation_id', 'amount', 'currency', 'datetime', 'sender', 'codepro' );
   foreach( $fields as $f )
   {
       $control .= $_POST[$f] ?? '';
       $control .= '&';
   }             
   $control .= '123456789abcdefghABCDEFG'.'&'; // секретное слово
   $control .= $_POST['label'] ?? '';
   
   // Хешируем и проверяем валидность запроса
   $mysha1 = sha1($control);
   if( $mysha1 != $_POST['sha1_hash'] )
    {
        echo '403 Forbidden';
        die;
    }
   
    //***************** ПОЛУЧЕНИЕ И ОТПРАВКА КОДА АКТИВАЦИИ ******************************
    // Если деньги не дошли - оповещаем пользователя
   if( isset($_POST['unaccepted']) && $_POST['unaccepted'] == 'true' )
       $result = 'Деньги не дошли до адресата. Обратитесь, пожалуйста, в администрацию сайта.';
   else
   {
       // формируем POST запрос к WLM
       $params =
          'productid='     .$_POST['label'].
          '&customername=' .$_POST['firstname'].' '.$_POST['fathersname'].' '.$_POST['lastname']. // Складываем имя пользователя (Яндекс запрашивает ФИО)
          '&customeremail='.$_POST['email'].
          '&orderref='     .$_POST['operation_id'].
          '&quantity='     .'1';

       $ch = curl_init( 'https://mysite.com/weblm/keygen.php' );
       curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
       curl_setopt( $ch, CURLOPT_POST, true );
       curl_setopt( $ch, CURLOPT_POSTFIELDS, $params );
       $result = curl_exec( $ch );
       curl_close( $ch );
   }

    $to = $_POST['email'];
    $subject = 'Вам выслан код активации'; // тема письма
    $text = "Ваш код активации: $result";  // текст письма
    $headers = 'From: info@mysite.com\r\n';
    $headers .= 'Reply-to: <info@mysite.com>\r\n';
    $headers .= 'Content-type: text/html; charset=utf-8';
    mail( $to, $subject, $text, $headers );
   
    echo '200 OK';
?>

That’s all, folks.
<Quick Start Guide in Web License Manager>

Эти 2 файла: buy.php и lic.php - рабочие и проверены в действии. Теперь мы имеем полный контроль над оплатой. В первом файле можно добавить промокод, чтобы делать скидки или вообще раздавать продукты бесплатно друзьям. Важно, что у них будет аппаратно зависимая версия, и ваши программы не начнут гулять по инету.

Спасибо всем, кто прочитал и успеха вам в ваших добрых начинаниях.

Re: Keygen URL completion

Posted: Thu Feb 13, 2020 6:03 am
by Admin
На созданный мод продукта наводим мышь, нажимаем (Генератор) далее (Выберите шаблон:) = (PayPro) (стоит по умолчанию) и видим примерно такую строку:

Насколько я понимаю у вас есть исходники WebLM? Обратите внимание на include/keygen_keys.inc.php, там можно задать шаблон для новой платежной системы:

Code: Select all

<?php

$KEYGEN_KEYS = array(
   "PayPro" => array(
      "customeremail" => "{CUSTOMER_EMAIL}",
      "customername" => "{CUSTOMER_NAME}",
      "companyname" => "{COMPANY_NAME}",
      "quantity" => "{PRODUCT_QUANTITY}",
      "orderref" => "{ORDER_ID}"
   ),
   "Plimus" => array(
      "customeremail" => "<CUSTOMER_EMAIL>",
      "customername" => "<CUSTOMER_NAME>",
      "companyname" => "<COMPANY_NAME>",
      "quantity" => "<QUANTITY>",
      "orderref" => "<ORDER_ID>"
   ),
   "Avangate" => array(
      "type" => "avangate"
   ),
   "MyCommerce" => array(
      "type" => "mycommerce&"
   ),
   "Yandex" => array(
      "type" => "yandex&"
   )   
);

?>


И дописать новую ветку в keygen.php с парсингом параметров покупателя:

Code: Select all

elseif ($type == "yandex")
{
   ...
}