Пример #1
0
    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
            });
            }

    }
Пример #2
0
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);
    }
});