From 3582ff32fcde155bd939f5a93d29af2f215b6e6d Mon Sep 17 00:00:00 2001 From: Christopher Jeffrey Date: Fri, 25 Jul 2014 19:11:57 -0700 Subject: [PATCH] paypro: a more complete example of how to use server outputs. --- examples/PayPro/customer.js | 45 +++++++++++++++++++---- examples/PayPro/server.js | 71 +++++++++++++++++++------------------ 2 files changed, 75 insertions(+), 41 deletions(-) diff --git a/examples/PayPro/customer.js b/examples/PayPro/customer.js index 375f3e37c74..21d4384e5d7 100644 --- a/examples/PayPro/customer.js +++ b/examples/PayPro/customer.js @@ -239,7 +239,7 @@ function sendPayment(msg, callback) { var pay = new PayPro(); pay = pay.makePayment(); pay.set('merchant_data', merchant_data); - pay.set('transactions', [createTX()]); + pay.set('transactions', [createTX(outputs)]); pay.set('refund_to', refund_outputs); msg = msg || 'Hi server, I would like to give you some money.'; @@ -273,6 +273,19 @@ function sendPayment(msg, callback) { var memo = ack.get('memo'); print('Our payment was acknowledged!'); print('Message from Merchant: %s', memo); + payment = PayPro.Payment.decode(payment); + var pay = new PayPro(); + payment = pay.makePayment(payment); + print(payment); + var tx = payment.message.transactions[0]; + if (tx.buffer) { + tx.buffer = tx.buffer.slice(tx.offset, tx.limit); + var ptx = new bitcore.Transaction(); + ptx.parse(tx.buffer); + tx = ptx; + } + var txid = tx.getHash().toString('hex'); + print('First payment txid: %s', txid); return callback(); }); }); @@ -324,7 +337,7 @@ function parseQS(query) { return out; } -function createTX() { +function createTX(outputs) { // Addresses var addrs = [ 'mzTQ66VKcybz9BD1LAqEwMFp9NrBGS82sY', @@ -361,10 +374,13 @@ function createTX() { ]; // define transaction output - var outs = [{ - address: addrs[2], - amount: 0.00003000 - }]; + var outs = []; + outputs.forEach(function(output) { + outs.push({ + address: addrs[0], // dummy address + amount: 0 // dummy value + }); + }); // set change address var opts = { @@ -379,6 +395,23 @@ function createTX() { .sign(keys) .build(); + outputs.forEach(function(output, i) { + var value = output.get('amount'); + var script = output.get('script'); + var v = new Buffer(8); + v[0] = (value.low >> 0) & 0xff; + v[1] = (value.low >> 8) & 0xff; + v[2] = (value.low >> 16) & 0xff; + v[3] = (value.low >> 24) & 0xff; + v[4] = (value.high >> 0) & 0xff; + v[5] = (value.high >> 8) & 0xff; + v[6] = (value.high >> 16) & 0xff; + v[7] = (value.high >> 24) & 0xff; + var s = script.buffer.slice(script.offset, script.limit); + tx.outs[i].v = v; + tx.outs[i].s = s; + }); + print(''); print('Customer created transaction:'); print(tx.getStandardizedObject()); diff --git a/examples/PayPro/server.js b/examples/PayPro/server.js index cdf233d41ac..12d37024169 100755 --- a/examples/PayPro/server.js +++ b/examples/PayPro/server.js @@ -123,41 +123,42 @@ app.post('/-/request', function(req, res, next) { var outputs = []; - var po = new PayPro(); - po = po.makeOutput(); - // number of satoshis to be paid - po.set('amount', 0); - // a TxOut script where the payment should be sent. similar to OP_CHECKSIG - po.set('script', new Buffer([ - 118, // OP_DUP - 169, // OP_HASH160 - 76, // OP_PUSHDATA1 - 20, // number of bytes - 0xcf, - 0xbe, - 0x41, - 0xf4, - 0xa5, - 0x18, - 0xed, - 0xc2, - 0x5a, - 0xf7, - 0x1b, - 0xaf, - 0xc7, - 0x2f, - 0xb6, - 0x1b, - 0xfc, - 0xfc, - 0x4f, - 0xcd, - 136, // OP_EQUALVERIFY - 172 // OP_CHECKSIG - ])); - - outputs.push(po.message); + [2000, 1000].forEach(function(value) { + var po = new PayPro(); + po = po.makeOutput(); + // number of satoshis to be paid + po.set('amount', value); + // a TxOut script where the payment should be sent. similar to OP_CHECKSIG + po.set('script', new Buffer([ + 118, // OP_DUP + 169, // OP_HASH160 + 76, // OP_PUSHDATA1 + 20, // number of bytes + 0xcf, + 0xbe, + 0x41, + 0xf4, + 0xa5, + 0x18, + 0xed, + 0xc2, + 0x5a, + 0xf7, + 0x1b, + 0xaf, + 0xc7, + 0x2f, + 0xb6, + 0x1b, + 0xfc, + 0xfc, + 0x4f, + 0xcd, + 136, // OP_EQUALVERIFY + 172 // OP_CHECKSIG + ])); + outputs.push(po.message); + }); /** * Payment Details