Проект с открытым исходным кодом, направленный на то, чтобы максимально упростить интеграцию веб-службы Java Spring в сеть Lightning.

LightningJ Paywall — это фреймворк, который просто позволяет вам аннотировать сервис API, за который вы хотите взимать плату, и фреймворк справится с большинством сложностей потока платежей за вас.

Как это работает

Что вам в основном нужно сделать для поддержки платежей за ваши услуги, так это подключиться к узлу LND Lightning и выполнить следующие три шага.

Шаг 1 Аннотируйте свой сервис

Сначала аннотируйте службы, которые вы хотите использовать с платным доступом, с помощью аннотации @PaymentRequired. Это автоматически обнаружит, что требуется оплата, прежде чем данные будут отправлены в службу, и инициируется поток платежей.

@RestController
public class MyServiceController {
  @PaymentRequired(articleId = "myservice1")
  @RequestMapping("/myservice")
  public MyServiceResult myservice() {
      ....
  }
}

Аннотация довольно гибкая, и можно создавать потоки платежей для разных сценариев, таких как оплата за каждый запрос, несколько запросов за заданное время и один платеж за доступ к нескольким услугам внутри приложения.

Шаг 2. Обработчик платежей

Чтобы потоки платежей работали, вам также необходимо реализовать класс PaymentHandler, который управляет сохранением сгенерированных платежей. Он содержит три метода для создания, поиска и обновления платежей. Обработчик платежей также отвечает за динамическое преобразование идентификатора статьи, указанного для услуги, в цену.

protected PaymentData newPaymentData(byte[] preImageHash, OrderRequest orderRequest) throws IOException, InternalErrorException {
    // Here create a new PaymentData for a given articleId
}

protected PaymentData findPaymentData(byte[] preImageHash) throws InternalErrorException {
    // Look up given PaymentData
}

protected void updatePaymentData(PaymentEventType type, PaymentData paymentData, LightningHandlerContext context) throws InternalErrorException {
    // Persist given PaymentData
}

PaymentHandler можно реализовать с помощью нескольких строк кода с использованием Spring Data или интегрировать в существующую базу данных платежей в зависимости от требований вашего приложения.

Шаг 5. Добавьте обработчики событий JavaScript

При вызове REST API из веб-приложения вы, вероятно, используете код, аналогичный приведенному ниже примеру, для вызова службы. (Если вы используете обычный JavaScript). Пример кода использует XMLHttpRequest для вызова службы и содержит один обработчик событий, onload, который срабатывает после обработки запроса сервером.

var xmlHttpRequest = new XMLHttpRequest();

xmlHttpRequest.onload = function(){
    if(xmlHttpRequest.status === 200) {
        // Process the service response
        var response = JSON.parse(xmlHttpRequest.responseText);
        ...
    }else{
        // Error calling the underlying service.
    }
};
xmlHttpRequest.open("GET","/myservice");
xmlHttpRequest.send();

Но при создании платного доступа к вашей услуге вы, вероятно, захотите отобразить счет для клиента, подобный изображенному ниже, и фактический запрос не должен обрабатываться до тех пор, пока счет не будет оплачен.

Для этого в платформе есть библиотека JavaScript, которая расширяет стандартный класс XMLHttpRequest с функциональностью платного доступа, которая называется PaywallHttpRequest. Новый класс поддерживает добавление новых обработчиков событий для этих конкретных событий, связанных с платным доступом. В противном случае он ведет себя так же, как XMLHttpRequest, и REST API будет вызываться автоматически, как только будет оплачен счет.

В приведенном ниже примере мы обновили вызов REST API, чтобы вместо него использовать PaywallHttpRequest, и добавили три обработчика событий. Один для отображения счета-фактуры, один для сокрытия счета-фактуры при расчете и один обработчик специального случая для сообщения о том, что срок действия счета-фактуры истек.

var paywallHttpRequest = new PaywallHttpRequest();

// The Invoice event handler adds invoice information to the modal and then displays it.
paywallHttpRequest.paywall.addEventListener("InvoiceListener", PaywallEventType.INVOICE, function (type, invoice) {
    // Populate a window and display information from the provided
    // invoice object.
});

// Event listener hides the modal upon settlement.
paywallHttpRequest.paywall.addEventListener("SettledListener", PaywallEventType.SETTLED, function (type, settlement) {
    // Hide invoice window.
});

// Event listener updates the modal with invoice expired information.
paywallHttpRequest.paywall.addEventListener("InvoiceExpiredListener", PaywallEventType.INVOICE_EXPIRED, function (type, invoice) {
    // Update invoice window with invoice expire information.
});

// The same onload handler that should have been used without paywall to call the service.
paywallHttpRequest.onload = function(){
    if(xmlHttpRequest.status === 200) {
        // Process the service response
        var response = JSON.parse(xmlHttpRequest.responseText);
        ...
    }else{
        // Error calling the underlying service.
    }
};

paywallHttpRequest.open("GET","/tademo");
paywallHttpRequest.send();

И это все, что вам нужно сделать, чтобы добавить функциональность микроплатежей в ваше приложение Spring Framework с помощью Lightning Network.

Библиотека JavaScript также содержит справочные методы для упрощения управления счетами, такие как генерация QR-кодов, преобразование денежных единиц и отображение счетчиков истечения срока действия.

Более подробное знакомство с фреймворком можно найти по адресу https://paywall.lightningj.org#gettingstarted.

Дорожная карта будущего

В настоящее время проект поддерживает только автономное приложение, но в будущем проект будет расширен для поддержки более распределенной настройки, в которой платежи можно будет контролировать централизованно для нескольких распределенных веб-сервисов более удобным для предприятия способом.

Дополнительная информация

Дополнительную информацию можно найти на:

Также за проектом можно следить в твиттере @LightningJ_org.