Keygen URL completion

Issues related to WebLM
Post Reply
andvl
Posts: 13
Joined: Thu Jan 16, 2020 11:07 am

Keygen URL completion

Post 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 - рабочие и проверены в действии. Теперь мы имеем полный контроль над оплатой. В первом файле можно добавить промокод, чтобы делать скидки или вообще раздавать продукты бесплатно друзьям. Важно, что у них будет аппаратно зависимая версия, и ваши программы не начнут гулять по инету.

Спасибо всем, кто прочитал и успеха вам в ваших добрых начинаниях.
Admin
Site Admin
Posts: 2566
Joined: Mon Aug 21, 2006 8:19 pm
Location: Russia, E-burg
Contact:

Re: Keygen URL completion

Post 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")
{
   ...
}
Post Reply