Browse Source

Merge pull request #494 from chjj/fix_paypro_example2

Fix Payment Protocol example in the browser
patch-2
Ryan X. Charles 11 years ago
parent
commit
095699a072
  1. 7
      examples/PayPro/README.md
  2. 120
      examples/PayPro/customer.js
  3. 27
      examples/PayPro/server.js

7
examples/PayPro/README.md

@ -65,3 +65,10 @@ testnet coins, you can pass `--no-tx` on the server command line.
If you don't want the tests to run automatically and simply host the payment If you don't want the tests to run automatically and simply host the payment
server, simply pass `--browser` (`-b`) as mentioned above. server, simply pass `--browser` (`-b`) as mentioned above.
## Using the example in a modular manner
``` js
var server = require('bitcore/examples/PayPro');
server.listen(8080);
```

120
examples/PayPro/customer.js

@ -62,45 +62,7 @@ var merchant = isNode
if (isNode) { if (isNode) {
var Buffer = global.Buffer; var Buffer = global.Buffer;
} else { } else {
var Buffer = function Buffer(data) { var Buffer = bitcore.Buffer;
var ab = new ArrayBuffer(data.length);
var view = new Uint8Array(ab);
data._size = data.length;
for (var i = 0; i < data._size; i++) {
view[i] = data[i];
}
if (!view.slice) {
// view.slice = ab.slice.bind(ab);
view.slice = function(start, end) {
if (end < 0) {
end = data._size + end;
}
data._size = end - start;
var ab = new ArrayBuffer(data._size);
var view = new Uint8Array(ab);
for (var i = 0, j = start; j < end; i++, j++) {
view[i] = data[j];
}
return view;
};
}
return view;
};
Buffer.byteLength = function(buf) {
var bytes = 0
, ch;
for (var i = 0; i < buf.length; i++) {
ch = buf.charCodeAt(i);
if (ch > 0xff) {
bytes += 2;
} else {
bytes++;
}
}
return bytes;
};
} }
function request(options, callback) { function request(options, callback) {
@ -281,7 +243,11 @@ function sendPayment(msg, callback) {
if (tx.buffer) { if (tx.buffer) {
tx.buffer = tx.buffer.slice(tx.offset, tx.limit); tx.buffer = tx.buffer.slice(tx.offset, tx.limit);
var ptx = new bitcore.Transaction(); var ptx = new bitcore.Transaction();
ptx.parse(tx.buffer);
var parser = new bitcore.BinaryParser(tx.buffer);
ptx.parse(parser);
// ptx.parse(tx.buffer);
tx = ptx; tx = ptx;
} }
var txid = tx.getHash().toString('hex'); var txid = tx.getHash().toString('hex');
@ -370,17 +336,7 @@ function createTX(outputs) {
'scriptPubKey': '76a94c14460376539c219c5e3274d86f16b40e806b37817688ac', 'scriptPubKey': '76a94c14460376539c219c5e3274d86f16b40e806b37817688ac',
'amount': 1.60000000, 'amount': 1.60000000,
'confirmations': 9 'confirmations': 9
} }];
];
// define transaction output
var outs = [];
outputs.forEach(function(output) {
outs.push({
address: addrs[0], // dummy address
amount: 0 // dummy value
});
});
// set change address // set change address
var opts = { var opts = {
@ -389,29 +345,59 @@ function createTX(outputs) {
} }
}; };
var tx = new TransactionBuilder(opts) var outs = [];
outputs.forEach(function(output) {
var amount = output.get('amount');
var script = {
offset: output.get('script').offset,
limit: output.get('script').limit,
buffer: new Buffer(new Uint8Array(
output.get('script').buffer))
};
// big endian
var v = new Buffer(8);
v[0] = (amount.high >> 24) & 0xff;
v[1] = (amount.high >> 16) & 0xff;
v[2] = (amount.high >> 8) & 0xff;
v[3] = (amount.high >> 0) & 0xff;
v[4] = (amount.low >> 24) & 0xff;
v[5] = (amount.low >> 16) & 0xff;
v[6] = (amount.low >> 8) & 0xff;
v[7] = (amount.low >> 0) & 0xff;
var s = script.buffer.slice(script.offset, script.limit);
var addr = bitcore.Address.fromScriptPubKey(new bitcore.Script(s), 'testnet');
outs.push({
address: addr.toString(),
amountSatStr: bitcore.Bignum.fromBuffer(v, {
// XXX for some reason, endian is ALWAYS 'big'
// in node (in the browser it behaves correctly)
endian: 'big',
size: 1
}).toString(10)
});
});
var b = new bitcore.TransactionBuilder(opts)
.setUnspent(unspent) .setUnspent(unspent)
.setOutputs(outs) .setOutputs(outs)
.sign(keys) .sign(keys);
.build();
outputs.forEach(function(output, i) { outputs.forEach(function(output, i) {
var value = output.get('amount'); var script = {
var script = output.get('script'); offset: output.get('script').offset,
var v = new Buffer(8); limit: output.get('script').limit,
v[0] = (value.low >> 0) & 0xff; buffer: new Buffer(new Uint8Array(
v[1] = (value.low >> 8) & 0xff; output.get('script').buffer))
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); var s = script.buffer.slice(script.offset, script.limit);
tx.outs[i].v = v; b.tx.outs[i].s = s;
tx.outs[i].s = s;
}); });
var tx = b.build();
print(''); print('');
print('Customer created transaction:'); print('Customer created transaction:');
print(tx.getStandardizedObject()); print(tx.getStandardizedObject());

27
examples/PayPro/server.js

@ -48,12 +48,12 @@ var server = https.createServer({
cert: fs.readFileSync(__dirname + '/../../test/data/x509.crt') cert: fs.readFileSync(__dirname + '/../../test/data/x509.crt')
}); });
server.options = argv;
server.setOptions = function(options) { server.setOptions = function(options) {
argv = options; server.options = argv = options;
}; };
var isNode = !argv.b && !argv.browser;
var app = express(); var app = express();
/** /**
@ -409,22 +409,29 @@ function error() {
server.on('request', app); server.on('request', app);
server.app = app; server.app = app;
server.port = +argv.p || +argv.port || 8080; server.port = 8080;
server.isNode = true;
if (argv.s) { setTimeout(function() {
server.listen(server.port); server.port = argv.p = argv.port = +argv.p || +argv.port || 8080;
server.isNode = !argv.b && !argv.browser;
if (argv.s || argv.server || argv.l || argv.listen) {
server.listen(server.port, function(addr) {
print('Listening on port %s.', server.port);
});
return; return;
} }
if (!module.parent || path.basename(module.parent.filename) === 'index.js') { if (!module.parent || path.basename(module.parent.filename) === 'index.js') {
server.listen(server.port, function(addr) { server.listen(server.port, function(addr) {
if (!isNode) return; print('Listening on port %s.', server.port);
if (!server.isNode) return;
var customer = require('./customer'); var customer = require('./customer');
customer.sendPayment(function(err) { customer.sendPayment(function(err) {
if (err) return error(err.message); if (err) return error(err.message);
customer.print('Payment sent successfully.'); customer.print('Payment sent successfully.');
}); });
}); });
} else {
module.exports = server;
} }
}, 1);
module.exports = server;

Loading…
Cancel
Save