Только получение части уведомления Apple о подписке в облачной функции Google - PullRequest
0 голосов
/ 15 января 2020

Я пытаюсь настроить облачную функцию Google (GCF) для обработки уведомлений о подписке от Apple. Я знаком с GCF, но не очень хорошо знаком с написанием своего собственного REST API и Nodejs методов обработки данных, которые Apple отправляет с уведомлением. Я получаю уведомление от Apple, но только его часть. Вот мой код (с использованием express и каркасов body-parser). Я поместил всю свою функцию здесь, чтобы помочь людям, так как нет абсолютно ничего о том, как использовать GCF для уведомлений о подписке везде, где я мог бы найти в Интернете (обратите внимание, что этот код в значительной степени находится в стадии разработки, и я новичок в Nodejs):

// Set up express object
const express = require('express');
const app = express();
const bodyParser = require('body-parser');

exports.iosNotification = functions.https.onRequest((req, res) => {
console.log("We are receiving a request from Apple.");
app.use(bodyParser.json());
let receipt = req.body.latest_receipt;

console.log(req.body);

const chunks = [];
req.on('data', chunk => {
    chunks.push(chunk);
    console.log('A chunk of data has arrived:', chunk);
});
req.on('end', () => {
    const data = Buffer.concat(chunks);
    console.log('Data: ', data);
    console.log('No more data');
});

const type = req.body.notification_type;
console.log("Notification type: ", type);
const lri = req.body.latest_receipt_info;
console.log(lri, receipt);
// Verify the receipt.
validateAppleReceipt(receipt)
        .then((appleResponse) => {
            console.log("Receipt from App Store server validated.", appleResponse);
                res.sendStatus(200);
            const oTxId = appleResponse.latest_receipt_info[0].original_transaction_id;
            // Receipt is valid and we let Apple know.  Let's process the notification.
            switch (type) {
                case 'CANCEL':
                    // User canceled the subscription (like on accidental purchase).
                    console.log("User canceled a subscription.");

                    break;
                case 'DID_CHANGE_RENEWAL_PREF':
                    console.log("The subscriber downgraded.  Effective on next renewal.  Handle.");

                    break;
                case 'DID_CHANGE_RENEWAL_STATUS':
                    console.log("The subscriber downgraded or upgraded.  Effective on next renewal.  Handle.");

                    break;
                case 'DID_FAIL_TO_RENEW':
                    console.log("Subscription has a billing issue.  Check if in billing retry period.");

                    break;
                case 'DID_RECOVER':
                    console.log("Renewal of expired subscription that failed to renew.");

                    break;
                case 'INITIAL_BUY':
                    console.log("Initial purchase.  Ignored because we already handled with another function.");
                    break;
                case 'INTERACTIVE_RENEWAL':
                    console.log("Interactive renewal.  Not sure if we'll ever see this.");
                    break;
                case 'RENEWAL':
                    console.log("Renewal after failure.  Same as DID_RECOVER.  Handle there.");
                    break;
                default:
                    console.log("Hit default.");
                    break;
            };
        })
        .catch((error) => {
            console.log("Error validating receipt from App Store server.", error);      
        });
    });

Это вывод, который я получаю (это только часть уведомления, которое Apple отправляет). Я не получаю notification_type или другие части файла JSON, которые, согласно документам Apple, должны быть получены:

{ latest_receipt: 'ewoJInNpZ25hdHVyZSIgPSAiQTNVM0FjaDJpbXRPMG53cEtrQW9 <<shortened for this post>>  

Я никогда не вижу console.log для каких-либо кусков.

Что я могу сделать, чтобы убедиться, что я получил все «куски» и сложил их в полный файл JSON, который Apple отправляет мне, чтобы я мог с ним работать?

1 Ответ

0 голосов
/ 15 января 2020

Я решил это. Это было так просто. Я просто должен был использовать req.body вместо req. Вот код для тех, кто пытается использовать облачные функции Google для обработки уведомлений от сервера к серверу для подписок от Apple.

exports.iosNotification = functions.https.onRequest((req, res) => {
console.log("We are receiving a request from Apple.");
let receipt = req.body.latest_receipt;

const type = req.body.notification_type;
console.log("Notification type: ", type);
const lri = req.body.latest_receipt_info;
console.log(type, lri, receipt);
// Verify the receipt.
validateAppleReceipt(receipt)

См. Код выше для обработки типов, которые Apple отправляет ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...