Ripple APIを使って送金の受領通知を受け取ることができます。
支払いが完了した契機で何かしらのデータ処理を行いたい場合に使用できそうです。
本物のXRPを使って検証を行うと費用がかかってしまいますので、今回もTest Net上で行います。接続先サーバや対象アドレスを変更すれば、本番環境でも動作すると思います。(試してません)
Test Net上のアカウント作成 および 送金方法については、『【RippleAPI】② XRP Test Net』や『【RippleAPI】③ Payment』を参考にしてください。
送金に先立って以下のプログラムを実行しておくことで、送金完了契機で通知を受け取ることができます。
プログラム例
const RippleAPI = require('ripple-lib').RippleAPI; const api = new RippleAPI({ server: 'wss://s.altnet.rippletest.net:51233' // testnet }); const address = '<監視対象アドレス>'; (async ()=>{ try { // Connect await api.connect(); // 送金受領通知 api.connection.on('transaction', (event) => { // 受領イベント処理 console.log(JSON.stringify(event, null, 2)) }); let response = await api.request('subscribe', { accounts: [ address ] }); console.log('Successfully subscribed') } catch (e) { console.log(e); } })();
受領イベント例
Test Net上でPaymentを行った際の受領イベントの結果例を示します。
{ "engine_result": "tesSUCCESS", "engine_result_code": 0, "engine_result_message": "The transaction was applied. Only final in a validated ledger.", "ledger_hash": "88813EB3BB0EE195F3C35382CD332947C9F117BA9AA61A96D59768302A372E57", "ledger_index": 19120610, "meta": { "AffectedNodes": [ { "ModifiedNode": { "FinalFields": { "Account": "rM6ToyvCmTavh4zPjJSsTVgCbabZ6Harup", "Balance": "1500000000", "Flags": 0, "OwnerCount": 0, "Sequence": 1 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "64CCDE20EFFDDBD96C3A9FA662433B31F6FC0F63E60E39396BF68876759DD42F", "PreviousFields": { "Balance": "1000000000" }, "PreviousTxnID": "AD398B47DDB44FF346908BE91D63EF74F5578A36622D48EF63ECB3E55A71D3E5", "PreviousTxnLgrSeq": 18568215 } }, { "ModifiedNode": { "FinalFields": { "Account": "rc8qCurPUeXBjE4DGqg3YQX3N6F5r7cog", "Balance": "8499999964", "Flags": 0, "OwnerCount": 0, "Sequence": 4 }, "LedgerEntryType": "AccountRoot", "LedgerIndex": "807ACAA6FC7612CB2D4A18ECAB1DD6BF1EA3E2C581123B438FCDEAF44C9016B2", "PreviousFields": { "Balance": "8999999976", "Sequence": 3 }, "PreviousTxnID": "AD398B47DDB44FF346908BE91D63EF74F5578A36622D48EF63ECB3E55A71D3E5", "PreviousTxnLgrSeq": 18568215 } } ], "TransactionIndex": 0, "TransactionResult": "tesSUCCESS", "delivered_amount": "500000000" }, "status": "closed", "transaction": { "Account": "<送付元アドレス>", "Amount": "500000000", "Destination": "<送付先アドレス>", "Fee": "12", "Flags": 2147483648, "LastLedgerSequence": 19120613, "Sequence": 3, "SigningPubKey": "03D9278E3BAE27CAA9EF9892523A6402253F9D96CACAC9EF5A7EB9F6D2377CDDC9", "TransactionType": "Payment", "TxnSignature": "3045022100BB0BFDA8EC3B3AFAEB238F6700CE17C67D11B371DB7C53AA4406FADD7941C05102200369C5FCBAD3306AD57CE5470C8A101DEFE04C1AFBFE4B27DC3410F9A2490358", "date": 610296010, "hash": "EA887B8046F0E9BE06A2CF29AF0900AA485D70D80F484093AE7FF29CEABD029D" }, "type": "transaction", "validated": true }
送金メモ
Payment時にメモを付与することができますので、金額だけでなく何らかの付加データも送ることができるようです。
送金処理
memos: [{ format: 'text/plain', data: 'This is test memo of payment.' }]
受領イベント
メモはHEX形式にエンコードされた形で渡ってきます。
{ ︙ "transaction": { ︙ "Memos": [ { "Memo": { "MemoData": "546869732069732074657374206D656D6F206F66207061796D656E742E", "MemoFormat": "746578742F706C61696E" } } ], ︙ } ︙ }
たとえば、以下のようにデコードできます。
let memo = Buffer.from('546869732069732074657374206D656D6F206F66207061796D656E742E', 'hex').toString(); console.log(memo);