in-app-purchase-multiple-iec
Version:
In-App-Purchase validation and subscription management for iOS, Android, Amazon, and Windows
465 lines (408 loc) • 28.3 kB
JavaScript
var assert = require('assert');
var fs = require('fs');
var fixedPath = process.cwd() + '/test/receipts/apple';
describe('#### Apple ####', function () {
it('Can parse the validated subscription receipt with duplicates', function (done) {
var iap = require('../');
var list = [{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381600687","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 19:58:55 Etc/GMT","purchase_date_ms":"1520539135000","purchase_date_pst":"2018-03-08 11:58:55 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:03:55 Etc/GMT","expires_date_ms":"1520539435000","expires_date_pst":"2018-03-08 12:03:55 America/Los_Angeles","web_order_line_item_id":"1000000038056225","is_trial_period":"false","is_in_intro_offer_period":"false"},{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381600903","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 20:03:55 Etc/GMT","purchase_date_ms":"1520539435000","purchase_date_pst":"2018-03-08 12:03:55 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:08:55 Etc/GMT","expires_date_ms":"1520539735000","expires_date_pst":"2018-03-08 12:08:55 America/Los_Angeles","web_order_line_item_id":"1000000038056226","is_trial_period":"false","is_in_intro_offer_period":"false"},{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381601336","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 20:09:15 Etc/GMT","purchase_date_ms":"1520539755000","purchase_date_pst":"2018-03-08 12:09:15 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:14:15 Etc/GMT","expires_date_ms":"1520540055000","expires_date_pst":"2018-03-08 12:14:15 America/Los_Angeles","web_order_line_item_id":"1000000038056264","is_trial_period":"false","is_in_intro_offer_period":"false"},{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381601740","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 20:14:30 Etc/GMT","purchase_date_ms":"1520540070000","purchase_date_pst":"2018-03-08 12:14:30 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:19:30 Etc/GMT","expires_date_ms":"1520540370000","expires_date_pst":"2018-03-08 12:19:30 America/Los_Angeles","web_order_line_item_id":"1000000038056312","is_trial_period":"false","is_in_intro_offer_period":"false"},{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381602052","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 20:19:30 Etc/GMT","purchase_date_ms":"1520540370000","purchase_date_pst":"2018-03-08 12:19:30 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:24:30 Etc/GMT","expires_date_ms":"1520540670000","expires_date_pst":"2018-03-08 12:24:30 America/Los_Angeles","web_order_line_item_id":"1000000038056364","is_trial_period":"false","is_in_intro_offer_period":"false"},{"quantity":"1","product_id":"basicmembership","transaction_id":"1000000381602343","original_transaction_id":"1000000381600687","purchase_date":"2018-03-08 20:24:30 Etc/GMT","purchase_date_ms":"1520540670000","purchase_date_pst":"2018-03-08 12:24:30 America/Los_Angeles","original_purchase_date":"2018-03-08 19:58:56 Etc/GMT","original_purchase_date_ms":"1520539136000","original_purchase_date_pst":"2018-03-08 11:58:56 America/Los_Angeles","expires_date":"2018-03-08 20:29:30 Etc/GMT","expires_date_ms":"1520540970000","expires_date_pst":"2018-03-08 12:29:30 America/Los_Angeles","web_order_line_item_id":"1000000038056406","is_trial_period":"false","is_in_intro_offer_period":"false"}];
var data = {
service: iap.APPLE,
receipt: {
in_app: [],
latest_receipt_info: list
}
};
var res = iap.getPurchaseData(data);
console.log(res);
assert.equal(res.length, 1);
assert.equal(res[0].originalTransactionId, '1000000381600687');
assert.equal(res[0].purchaseDateMs, 1520540670000);
assert.equal(res[0].isTrial, false);
done();
});
it('Can validate Unity apple in-app-purchase w/ auto-service detection', function (done) {
var path = process.cwd() + '/test/receipts/unity_apple';
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validate(receipt, function (error, response) {
if (error) {
console.error('Error >>>>', error);
}
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can validate apple in-app-purchase w/ auto-service detection', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validate(receipt, function (error, response) {
if (error) {
console.error('Error >>>>', error);
}
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can validate apple in-app-purchase w/ Promise & auto service detection', function (done) {
if (!Promise) {
return done();
}
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
var receipt = fs.readFileSync(path, 'utf8');
iap.setup()
.then(function () {
iap.validate(receipt).then(onSuccess).catch(onError);
}).catch(function (error) {
throw error;
});
function onSuccess(response) {
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
}
function onError(error) {
throw error;
}
});
it('Can validate apple in-app-purchase', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validate(iap.APPLE, receipt, function (error, response) {
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can validate apple in-app-purchase w/ .validateOnce() and w/ auto-service detection', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validateOnce(receipt, null, function (error, response) {
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can validate Unity apple in-app-purchase w/ .validateOnce()', function (done) {
var path = process.cwd() + '/test/receipts/unity_apple';
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validateOnce(receipt, null, function (error, response) {
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can validate apple in-app-purchase w/ .validateOnce()', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
fs.readFile(path, function (error, data) {
assert.equal(error, undefined);
var receipt = data.toString();
iap.validateOnce(iap.APPLE, null, receipt, function (error, response) {
assert.equal(error, undefined);
assert.equal(iap.isValidated(response), true);
var data = iap.getPurchaseData(response, { ignoreExpired: true });
for (var i = 0, len = data.length; i < len; i++) {
console.log('parsedPurchaseData:', i, data);
assert(data[i].productId);
assert(data[i].purchaseDate);
assert(data[i].quantity);
}
done();
});
});
});
});
it('Can NOT validate apple in-app-purchase with incorrect receipt w/ auto-service detection', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
iap.validate('fake-receipt', function (error, response) {
assert(error);
assert.equal(iap.isValidated(response), false);
done();
});
});
});
it('Can NOT validate apple in-app-purchase with incorrect receipt', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
iap.validate(iap.APPLE, 'fake-receipt', function (error, response) {
assert(error);
assert.equal(iap.isValidated(response), false);
done();
});
});
});
it('Can get an error response', function (done) {
var path = process.argv[process.argv.length - 1].replace('--path=', '');
if (path === 'false') {
path = fixedPath;
}
var iap = require('../');
iap.config({
verbose: true
});
iap.setup(function (error) {
assert.equal(error, undefined);
iap.validate(iap.APPLE, 'fake-receipt', function (error, response) {
assert(error);
assert(response);
assert.equal(iap.isValidated(response), false);
done();
});
});
});
it('Can detect a valid receipt that bought nothing', function (done) {
var receipt = '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';
var iap = require('../');
iap.setup(function (error) {
assert.equal(error, undefined);
iap.validate(iap.APPLE, receipt, function (error, response) {
assert(error);
assert.equal(iap.isValidated(response), false);
done();
});
});
});
it('can parse both in_app and latest_receipt_info array with .getPurchaseData()', function () {
var iap = require('../');
var rec = {
service: iap.APPLE,
receipt: {
in_app: [
{ quantity: '1',
product_id: 'in_app.0',
transaction_id: '210000259386802',
original_transaction_id: '210000259386802',
purchase_date: '2016-04-14 16:03:33 Etc/GMT',
purchase_date_ms: '1460649813000',
purchase_date_pst: '2016-04-14 09:03:33 America/Los_Angeles',
original_purchase_date: '2016-04-14 16:03:34 Etc/GMT',
original_purchase_date_ms: '1460649814000',
original_purchase_date_pst: '2016-04-14 09:03:34 America/Los_Angeles',
expires_date: '2016-05-14 16:03:33 Etc/GMT',
expires_date_ms: '1463241813000',
expires_date_pst: '2016-05-14 09:03:33 America/Los_Angeles',
web_order_line_item_id: '210000038560504',
is_trial_period: 'false' }
]
},
latest_receipt_info: [
{ quantity: '1',
product_id: 'latest_receipt_info.0',
transaction_id: '210000259386802',
original_transaction_id: '210000259386802',
purchase_date: '2016-04-14 16:03:33 Etc/GMT',
purchase_date_ms: '1460649813982',
purchase_date_pst: '2016-04-14 09:03:33 America/Los_Angeles',
original_purchase_date: '2016-04-14 16:03:34 Etc/GMT',
original_purchase_date_ms: '1460649814000',
original_purchase_date_pst: '2016-04-14 09:03:34 America/Los_Angeles',
expires_date: '2016-05-14 16:03:33 Etc/GMT',
expires_date_ms: '1463241813982',
expires_date_pst: '2016-05-14 09:03:33 America/Los_Angeles',
web_order_line_item_id: '210000038560504',
is_trial_period: 'false' },
{ quantity: '1',
product_id: 'latest_receipt_info.1',
transaction_id: '210000265773203',
original_transaction_id: '210000259386802',
purchase_date: '2016-05-14 16:03:33 Etc/GMT',
purchase_date_ms: '1463241813000',
purchase_date_pst: '2016-05-14 09:03:33 America/Los_Angeles',
original_purchase_date: '2016-05-14 10:03:37 Etc/GMT',
original_purchase_date_ms: '1463220217552',
original_purchase_date_pst: '2016-05-14 03:03:37 America/Los_Angeles',
expires_date: '2016-06-14 16:03:33 Etc/GMT',
expires_date_ms: '1465920213000',
expires_date_pst: '2016-06-14 09:03:33 America/Los_Angeles',
web_order_line_item_id: '210000038560503',
is_trial_period: 'false' }
]
};
iap.config({
verbose: true
});
var parsed = iap.getPurchaseData(rec);
var res = [
'in_app.0',
'latest_receipt_info.0',
'latest_receipt_info.1'
];
for (var i = 0, len = parsed.length; i < len; i++) {
if (res.indexOf(parsed[i].productId) === -1) {
console.error(parsed[i]);
throw new Error('missing purchase data');
}
console.log(parsed[i].productId, parsed[i].transactionId);
}
});
it('can parse without latest_receipt_info array with .getPurchaseData()', function () {
var iap = require('../');
var rec = {
service: iap.APPLE,
receipt: {
in_app: [
{ quantity: '1',
product_id: 'in_app.0',
transaction_id: '210000259386802',
original_transaction_id: '210000259386802',
purchase_date: '2016-04-14 16:03:33 Etc/GMT',
purchase_date_ms: '1460649813000',
purchase_date_pst: '2016-04-14 09:03:33 America/Los_Angeles',
original_purchase_date: '2016-04-14 16:03:34 Etc/GMT',
original_purchase_date_ms: '1460649814000',
original_purchase_date_pst: '2016-04-14 09:03:34 America/Los_Angeles',
expires_date: '2016-05-14 16:03:33 Etc/GMT',
expires_date_ms: '1463241813000',
expires_date_pst: '2016-05-14 09:03:33 America/Los_Angeles',
web_order_line_item_id: '210000038560504',
is_trial_period: 'false' }
]
}
};
iap.config({
verbose: true
});
var parsed = iap.getPurchaseData(rec);
var res = [
'in_app.0',
];
for (var i = 0, len = parsed.length; i < len; i++) {
if (res.indexOf(parsed[i].productId) === -1) {
throw new Error('missing purchase data');
}
console.log(parsed[i].productId, parsed[i].transactionId);
}
});
});