Серверы с Windows - дорогое удовольствие. За то Линуксовые можно найти (за копейки, от ~50р в месяцхабр-обзор для ориентира). Развернуть там например, Nginx + PHP + MySQL = решение, готовое обрабатывать около 1 - 2 тысяч запросов в секунду на процессорное ядро, даже с кривыми руками. Статей, описывающих пошагово как это сделать очень много. Можно даже хостинг для сайта взять и на его платформе что-то клеить, но там свои подводные камни.
Можно так же минуя всё, написать собственное, асинхронное решение на Python 3.5+. Это потребует понимания многих тонкостей работы сервера, но за то из сборки aiohttp + uvloop, такой Линукс будет выдавать на порядок большую производительность. Будет надёжнее и работать глаже, если ожидаете большой трафик и обращение к БД. Хотя Nginx всё равно будет желателен.
По простому, полностью автономной задачу можно решить следующим способом:
Регистрируетесь, например, в Yandex(хотя, теперь уже Yoo)-money, можно и QIWI. У них есть удобное и хорошо документированное API, связку с которым Вы описываете в примитивном HTML-шаблоне, который вместо приветствия будет выдавать Ваш сервер. Можно даже не регистрировать доменное имя. На страницу можно и по выданному провайдером IP-адресу попасть.
На нём должна быть форма со всего одним инпутом, в который пользователь пишет свой почтовый ящик. Дальше, по нажатию кнопки "Отправить", запоминаете его почту и снабдив внутренним идентификатором Вашего сервиса, выполняете редирект запроса в платёжную систему. Там она сама разбирается с ним и если он всё правильно заполнил и оплатил, то вашему сервису, через веб-хук прилетит уведомление с тем самым, внутренним идентификатором, по которому Вы опознаете плательщика.
Генерируете в таблице ключей для Вашего софта, новый, уникальный хэш с датой его создания и отправляете его на указанную почту.
Далее, описываете некий resolve-API, которое будет выдавать оценку прилетающим запросам от пользователей софта, который будет стрелять в него введёнными ключами из почты и проверять как валидность самого ключа, так и его актуальность(просрочен/годен). Соответственно, на выданный ответ, софт будет либо работать, либо...
Это избавит от необходимости шарить по машине юзеров в поисках идентификаторов. Активность можно полностью привязать в сессию, что позволит иметь практически посекундное представление о том, когда софт запускался, сколько его копий было активно.
Но, это не избавит от особо хитрожопых умников, которые либо пропатчат Вашу программу так, чтобы она никуда ничего не отправляла, либо заснифают "общение" с сервером, реплицируют и просто будут повторять ответ на локальной машине.
Как показала практика, лучший способ сделать последнее невозможным, это вынести часть логики софта на сервер, тогда у него будет необходимость постоянно получать данные, без которых работа просто невозможна, но тут тоже, всё сильно зависит от контекста.