A lightweight Lightning Network web payment tool for LND. It uses Alex Bosworth's ln-service to communicate with LND both localy and remotely.
Install lnd-pay on your server:
git clone https://github.com/mariodian/lnd-pay.git
cd lnd-pay
npm install
node server.js
The basic setup requires you to send one ajax request to api/v0/invoices
to create an invoice and then open websocket to listen for status changes.
The minimum code would look like this:
$.ajax({
method: "POST",
url: 'http://localhost/api/v0/invoices',
dataType: "json",
data: {
tokens: 100, // send 100 sat
description: 'Test payment' // not required
},
success: function(res) {
const paymentRequest = res.request;
let con = new WebSocket('ws://127.0.0.1:1337/ws');
con.onopen = function () {
// Send invoice ID to server so it only checks for particular invoice status
if (invoiceID) {
con.send(invoiceID)
} else {
con.close();
}
};
con.onmessage = function (message) {
const json = JSON.parse(message.data);
if (json.is_confirmed) {
// Invoice paid
// Change status to paid in UI
} else {
// Invoice not paid
}
};
}
});
If you'd like to use LND Pay frontend in your React project please go to lnd-pay-react.
I've created a javascript plugin for easy communication with the backend right from your website.
It's built with jQuery, Bootstrap, Font Awesome and kjua (QR code library).
A minimum HTML template would look like this:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<link href="css/lndpay.css" rel="stylesheet">
<link href="css/bootstrap-4.3.1.min.css" rel="stylesheet">
<link href="css/fontawesome.min.css" rel="stylesheet">
<script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
<script type="text/javascript" src="js/lndpay.jquery.js"></script>
<script type="text/javascript" src="js/kjua-0.6.0.min.js"></script>
</head>
<script>
$(document).ready(function(){
$('#lnd-pay').lndPay({
apiURL: 'http://localhost:11338/api/v0',
wsURL: 'ws://127.0.0.1:11337/ws'
});
});
</script>
<body>
<div id="lnd-pay"></div>
</body>
</html>
By default an UI is created for you. The design is very similar to yalls.org.
If you do NOT want to display a payment QR code, remove kjua and lndpay.css from the HTML header.
{
apiURL: null, // API URL prefix to create invoice
wsURL: null, // WebSocket url
amount: null, // Invoice amount
description: '', // Invoice description
expire: 60, // Invoice expires in X minutes
namespace: 'lndpay', // HTML lass namespace
buildUI: true, // Build UI
onCreateInvoice: null, // Callback when invoice get created (overwrites default)
onPaid: null // Callback on successful payment (overwrites default)
}
You can also use your own UI by setting buildUI
to false
:
$('#lnd-pay').lndPay({
...
...
buildUI: false
});
Make sure to follow this basic HTML template:
<div id="lnd-pay">
<input id="lndpay-amount" type="text">
<input id="lndpay-description" type="text">
<input id="lndpay-pay_req" readonly type="text" >
<a href="#" id="lndpay-pay">Pay</a>
<div id="lndpay-qr" class="qr-wrapper"></div>
</div>
You can set up custom HTML ID namespaces:
$('#lnd-pay').lndPay({
...
...
namespace: 'custom'
});
You would then have to set HTML elements like this: id="custom-amount"
.
If you build your own UI, you don't have to load Bootstrap.
You can also add custom callbacks.
When used with a custom UI it overrides the default behaviour. It extends the behaviour of the default UI on the hand.
$('#lnd-pay').lndPay({
...,
...,
// Invoice created callback
onCreateInvoice: function(obj, res) {
// Display payment request in anyway you want.
// To be notified about payment status via websocket you'll have to call openWebsocket
obj.openWebSocket(res.id);
},
// Invoice paid callback
onPaid: function(res) {
// Display a message about successful payment.
// If you don't call this callback a default message will be displayed.
},
});
Please have a look at an example folder to see the full working code.
If you like what I do, feel free to support me.