Merge pull request #494 from chjj/fix_paypro_example2

Fix Payment Protocol example in the browser
This commit is contained in:
Ryan X. Charles 2014-08-18 15:58:02 -07:00
commit 095699a072
3 changed files with 88 additions and 88 deletions

View File

@ -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);
```

View File

@ -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());

View File

@ -48,11 +48,11 @@ var server = https.createServer({
cert: fs.readFileSync(__dirname + '/../../test/data/x509.crt') cert: fs.readFileSync(__dirname + '/../../test/data/x509.crt')
}); });
server.setOptions = function(options) { server.options = argv;
argv = options;
};
var isNode = !argv.b && !argv.browser; server.setOptions = function(options) {
server.options = argv = options;
};
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;
return; server.isNode = !argv.b && !argv.browser;
} if (argv.s || argv.server || argv.l || argv.listen) {
server.listen(server.port, function(addr) {
if (!module.parent || path.basename(module.parent.filename) === 'index.js') { print('Listening on port %s.', server.port);
server.listen(server.port, function(addr) {
if (!isNode) return;
var customer = require('./customer');
customer.sendPayment(function(err) {
if (err) return error(err.message);
customer.print('Payment sent successfully.');
}); });
}); return;
} else { }
module.exports = server; if (!module.parent || path.basename(module.parent.filename) === 'index.js') {
} server.listen(server.port, function(addr) {
print('Listening on port %s.', server.port);
if (!server.isNode) return;
var customer = require('./customer');
customer.sendPayment(function(err) {
if (err) return error(err.message);
customer.print('Payment sent successfully.');
});
});
}
}, 1);
module.exports = server;