Python + ngrokでLN決済APIサーバの構築
本業が落ち着いて時間的に余裕ができたので久しぶりにLN系の開発に戻ってきました。久々にLNDのAPIドキュメント見ましたが完全に忘れてます!
さて、今回はpythonでLNの決済処理をやってみたいと思います。内容的には以前にDH開発部で作った内容から決済部分のみを切り出してシンプルなWEB APIにしたものになります。DHチャットでngrokの話題を見かけたのと決済の所は以前から気になっていたので合わせて実装してみました。
大した事してないので、もういきなりソースで説明します。呼び出し側のサンプルhtmlはこんな感じです。
<html><head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
$('#button1').click(function (){
$.get('https://0fcb-117-108-71-175.jp.ngrok.io/createinvoice/' + $('#text1').val() + '/' + $('#text2').val())
.done(function(ret){
$('#amount').text(ret.amount);
$('#bolt11').text(ret.bolt11);
$('#desc').text(ret.desc);
$('#r_hash').text(ret.r_hash);
$('#qrImg').attr("src", ret.qr_str);
$('#sect').show();
})
;
});
$('#button2').click(function (){
if($('#r_hash').text() != ""){
$.get('https://0fcb-117-108-71-175.jp.ngrok.io/checkinvoice/' + $('#r_hash').text())
.done(function(ret){
//1:支払い済み; 0:未払い
if(ret.state == "1"){
$('#status').text("決済完了!");
}else{
$('#status').text("決済未完了..");
}
})
;
}
});
});
</script>
</head>
<body>
<INPUT id="text1" type="number" value="100" cols=40>
<INPUT id="text2" type="text" value="memo" cols=40>
<button id="button1" >invoice</button>
</br></br>
<div id="sect" style="display:none">
<div>amount:<div id="amount"></div></div><br>
<div>invoice:<div id="bolt11"></div></div><br>
<div>desc:<div id="desc"></div></div><br>
<div>payment_hash:<div id="r_hash"></div></div><br>
<img id="qrImg" style="height: 200px;width: 200px;"><br><br>
<button id="button2" >check</button>
<div>status:<div id="status"></div></div>
</div>
</body></html>
これをhtmlファイルでデスクトップにでも保存してください。そのままダブルクリックすると下の画面が表示されます。
invoiceボタンを押すとamountとdescriptionをgetパラメータで渡します。戻り値はいっぱいあるので詳細は上のソース見てください。そしたら画面は以下のようになります。
checkボタンを押し、payment_hash(invoiceボタン押下後の戻り値の一つ)をgetパラメータで渡すことによって支払い確認ができます。支払い済みの場合は以下のようになります。
Python側のソースですが機能は二つだけ、createinvoiceとcheckinvoice。至ってシンプル。ですが、ちょっとまだ汚い状態なのでアップは止めときます。
自分の実行環境ですが、Umbrelと同一ネットワーク内のwindows端末にPythonとngrokを常時起動させています。Umbrelのラズパイと同居できると思いますが、私は怖いのでやりません。invoice.macaroonとtls.certファイルはUmbrelよりwindows端末にコピーが必要です。この二つのファイルがPython実行端末にないと機能しません。やり方は以下記事内で少し説明しています。
今はUmbrelの周辺プログラムを普段利用しているwindowsで動かしていますが、最終的には予備のラズパイを使ってこの辺りのAPIとかを常駐させようかと考えています。
ngrokのおかげで簡単にサイトを外部開放できるので、UmbrelとこのLN決済APIサーバが動いていれば事業者サイトへの組み込みなど、WEB屋さんに頼めば簡単に決済画面を実装できるかと思います。(フロント側の作り方によってはリアルタイムで決済完了通知も可能!)
店舗での現地決済にも応用できますが、Umbrel使っているのならわざわざこのAPI使わなくてもスマホのtorブラウザからUmbrelでインボイス発行するほうが簡単で確実かなとも思います。ただ作り込めば当然より使い勝手のいいものにはなります。
もし興味ある方いたらコメント下さい。プロト版でよければ少しきれいにしてからPythonファイル提供します。