昨日の記事「ZAIF APIから仮想通貨の価格を自動取得する方法」では、仮想通貨の為替レートを取得しました。
今日は、NEMウォレットの情報を取得する方法を解説します。(昨日の記事が未読のかたは、まず昨日の記事を読んでいただくことをお勧めします)
NEMウォレットのアドレスを指定すると、そのアドレスの情報が取得できます。
2018年5月時点では、情報を取得するだけなら認証処理は不要です。(自分のウォレットにお金がどれだけあるか、どのウォレットと取引しているか、は誰でも知ることができます。)
NEMでは、所定のURLにアクセスすると、ウォレットの情報を取得できます。
http://alice3.nem.ninja:7890/account/transfers/incoming?address=(ウォレットID)
にアクセスすると、以下のようなデータを取得できます。
{"data":[{"meta":{"innerHash":{},"id":2020121,"hash":{"data":"37d4a590d2dc2a93259a24905dd34ca93caac5d6b25d288763b1d3deeaad4f69"},"height":1634788},"transaction":{"timeStamp":98970644,"amount":1000000,"signature":"85d971bdb14c9d2453ea0e284d5777a5030db4af11741f5348d4787efb2dfd2e10a6124317746c5ccc52ec25e9879c7a14cb178b8a737ebee8c80035d3a4d70f","fee":100000,"recipient":"NBZIB7E7Z7WJT67PQMHGBOK6L7OQERNMDQDBIOHR","type":257,"deadline":98992244,"message":{"payload":"7468616e6b796f75","type":1},"version":1744830465,"signer":"967be7f3c8e2badae6e2d0985def14966a2a95db18e787486e147738c737eb73"}}]}
上の例ではトランザクション一個ですが、トランザクションは複数取得できます。
データ形式は、jsonと呼ばれる形式です。
NEMのAPIドキュメントはこちらです。今回は、Incoming transactions(入金トランザクション)です。
処理の流れは、下記のようになります。プログラミング言語はphpで、ウェブサイト構築ではconcrete5を使う想定です。
0.入金確認したいウォレット・金額・メッセージを調べておく
1.nemのAPIページにアクセスする
2.戻ってくるトランザクションデータをphpの配列に変換する
3.トランザクションデータに、条件にあてはまる金額・メッセージがあるかを確認する
concrete5の例を載せますので、参考にしてください。(コードはオープンソースライセンス GPL ver.2 or later とします。無料でご自由にお使いいただけます。)
// 入金されるウォレット
$address = '';
// 入金される金額
$amount = '';
// nemウォレットの情報を取得
$apiurl = 'http://alice3.nem.ninja:7890/account/transfers/incoming';
$url = $apiurl . '?address=' . $address;
//前回と同じなので詳細は省略
$app = \Concrete\Core\Support\Facade\Facade::getFacadeApplication();
$httpClient = $app->make(\Concrete\Core\Http\Client\Client::class);
$httpClient->setUri($url);
$response = $httpClient->send();
$responseBody = $response->getBody();
$data = json_decode($responseBody, true);
// 支払いのチェック
$paid = false;
foreach($data['data'] as $transaction) {
$amount_transaction = $transaction['transaction']['amount'];
// 金額をチェックし、OKなら $paid に true
if ( $amount * 1000000 == $amount_transaction) {
$paid = true;
}
}
こうすることで、入金されているか確認することができました。
なお、実際のプロダクト(NEM決済ネットショップ)では、この処理を定期的に実行することにより、購入者が支払ったら、なるべく速く入金確認処理するようにしています。