async validate(prd_id, store_type, receipt) { try { if (store_type === "android-playstore") { iap.config({ test: false, verbose: false, googlePublicKeyStrLive: process.env.GOOGLE_IAB_PUBLICKEY_LIVE }); } else if (store_type === "ios-appstore") { iap.config({ test: false, verbose: false }); } else { throw new ApiException({ "status": 400, "error": "Uknown store type" }); } await iap.setup(); let res = await iap.validate(receipt); console.log("Valid receipt"); return res; } catch (err) { console.error("receipt validation error ", err); throw new ApiException({ "status": err.status ? err.status : 500, "error": err.message ? err.message : err }); } }
router.post('/', function(req, res) { try { var type = req.body.type; var productId = req.body.id; var receipt = req.body.receipt; log.info(JSON.stringify(req.body)); //for j3k0 inapp purchase if (receipt == undefined && req.body.transaction) { if (req.body.transaction.type == 'android-playstore') { type = 'android'; receipt = []; receipt.push({receipt:req.body.transaction.receipt, signature:req.body.transaction.signature}); } } if (type === 'ios') { iap.validate( iap.APPLE, receipt, function (err, appleRes) { var response; if (err) { response = {ok: false, data: {code: 6778002, message: err.message}}; } else if (!iap.isValidated(appleRes)) { response = {ok: false, data: {code: 6778001, message: 'receipts is invalid'}}; } else { //can not use this func because it is not check cancellation_date //var purchaseDataList = iap.getPurchaseData(appleRes); var expires_date = calcExpirationDate(productId, appleRes.receipt.in_app); if (expires_date == undefined) { //PURCHASE_EXPIRED response = {ok: false, data: {code: 6778003, message: 'service is expired or canceled'}}; } else { appleRes.receipt.expires_date = expires_date; response = {ok: true, data:appleRes.receipt}; } } log.info(response); res.send(response); }); } else if (type === 'android') { if (receipt.length > 1) { log.error('receipt count over 1, you have to update this code'); //여러개일 경우 여러개 조합하거나, 실제 valid한 것을 찾는 방안이 필요함. } iap.validate(iap.GOOGLE, { data: receipt[0].receipt, signature: receipt[0].signature }, function (err, googleRes) { log.info(googleRes); var response; if (err) { response = {ok: false, data: {code: 6778002, message: err.message}}; } else if (!iap.isValidated(googleRes)) { response = {ok: false, data: {code: 6778001, message: 'receipts is invalid'}}; } else { if (googleRes.expirationTime <= (new Date()).getTime()) { response = {ok: false, data: {code: 6778003, message: 'service is expired or canceled'}}; } else { googleRes.product_id = googleRes.productId; googleRes.purchase_date_ms = googleRes.purchaseTime; googleRes.expires_date = (new Date(Number(googleRes.expirationTime))).toUTCString(); response = {ok: true, data:googleRes}; } } log.info(response); res.send(response); }); } else { throw new Error("Unknown type"); } } catch(e) { log.error(e); res.status(500).send(e.message); } });