Есть несколько моментов, которые необходимо адаптировать в вашей облачной функции.
Прежде всего вам необходимо настроить свою платежную учетную запись, как указано в журнале ошибок. Очевидно, вы звоните в службу, которая не считается службой, принадлежащей Google, поэтому вам необходимо иметь «активный» план Flame или Blaze. См. https://firebase.google.com/pricing/ (наведите курсор мыши на знак вопроса, который находится сразу после заголовка «Облачные функции»)
Во-вторых, вы выполняете цепочку различных обещаний, выполняя
authClient.authorize()
.then(credentials => {
//....
return playDeveloperApiClient.purchases.products.get();
})
.then((axiosResponse) => {..})
.catch(reason => {
//....
return null;
});
но вы не возвращаете первое обещание в цепочке: вы должны выполнить return authClient.authorize()
.
В-третьих, параллельно цепочке обещаний (или в середине) вы выполняете return null;
.
authClient.authorize()
.then(credentials => {...})
.then((axiosResponse) => {..})
.catch(reason => {...});
return null; // <--- !!
или
.then((axiosResponse) => {
if (axiosResponse.status === 200 && axiosResponse.data.purchaseState === 0) {
return changeShowAdsFalse(userID);
} else {
console.log(typeof axiosResponse.status);
//Here you should do something, i.e. throw an error
}
return null; // <--- !!
});
В-четвертых, поскольку вы используете метод then()
для цепочки своих обещаний, вы можете удалить ключевое слово async
в onCreate()
method.
Итак, после настройки вашего платежного аккаунта нужно выполнить следующее. Однако обратите внимание, что я не видел код функции changeShowAdsFalse()
, но, исходя из вашего комментария выше, я предполагаю, что она возвращает Обещание.
exports.validatePurchases = functions.firestore
.document('users/{userID}/purchasesRemoveAds/{documentID}')
.onCreate((snap, context) => {
const userID = context.params.userID;
const purchase = snap.data();
if (!purchase) {
return null;
} else {
if (purchase.is_processed === true) {
console.log('Purchase already processed!, exiting');
return null;
}
const packageName = purchase.packageName;
const productId = purchase.productId;
const purchaseToken = purchase.purchaseToken;
return authClient.authorize()
.then(credentials => {
return playDeveloperApiClient.purchases.products.get({
auth: authClient,
packageName: packageName,
productId: productId,
token: purchaseToken
});
})
.then((axiosResponse) => {
if (axiosResponse.status === 200 && axiosResponse.data.purchaseState === 0) {
return changeShowAdsFalse(userID);
} else {
console.log(typeof axiosResponse.status);
throw new Error("Wrong type: " + typeof axiosResponse.status);
}
})
.catch(reason => {
console.log(`Rejection Code: ${reason.code}`);
console.log(`Rejection Message: ${reason.message}`);
return null;
});
}
});