Система активации действительно оказалась приятной штучкой. Самое главное её достоинство - это то, что не надо носиться с 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';
?>
В Яндекс есть секретное слово которое соединяется через амперсанд в строке с другими 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';
?>
Эти 2 файла: buy.php и lic.php - рабочие и проверены в действии. Теперь мы имеем полный контроль над оплатой. В первом файле можно добавить промокод, чтобы делать скидки или вообще раздавать продукты бесплатно друзьям. Важно, что у них будет аппаратно зависимая версия, и ваши программы не начнут гулять по инету.That’s all, folks.
<Quick Start Guide in Web License Manager>
Спасибо всем, кто прочитал и успеха вам в ваших добрых начинаниях.