Merge pull request #494 from chjj/fix_paypro_example2
Fix Payment Protocol example in the browser
This commit is contained in:
commit
095699a072
|
@ -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);
|
||||||
|
```
|
||||||
|
|
|
@ -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());
|
||||||
|
|
|
@ -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;
|
||||||
|
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…
Reference in New Issue