Firebase Firestore + облачная функция на стороне сервера проверяет квитанцию (покупка в приложении), конечный результат: статус 21002, что означает: данные в свойстве квитанции были искажены или отсутствуют.
step1) Я храню в-app-покупка квитанций в Firestore с помощью swift, база данных Firestore естественным образом хранит их как blob
step2) Облачная функция сработала после того, как квитанция пошла в firestore.Функция Firebase отправляет квитанцию в Apple iTunes Store, но конечный результат: состояние 21002.
Я полагаю, что квитанция имеет неправильный формат во время преобразования ее из base64EncodedData в BLOB-объект Firestore, а затем извлекает ее в облачной функции.Как получить правильный формат квитанции, чтобы я мог отправить его в Apple iTunes Store для проверки квитанции?
код шага 1 swift:
func sendReceiptToFirestore() {
guard let appStoreReceiptURL = Bundle.main.appStoreReceiptURL,
FileManager.default.fileExists(atPath: appStoreReceiptURL.path) else {return}
do {
let rawReceiptData = try Data(contentsOf: appStoreReceiptURL)
let receiptData = rawReceiptData.base64EncodedData()
//Standard way to store receiptData to firestore, i did that but not posting full code here for cleanliness
} catch {}
}
код облачной функции шага 2:
const request = require("request-promise");
exports.verifyReceiptIAP = functions.firestore
.document('userReceiptIAP/{userUid}')
.onWrite((change, context) => {
const receipt = change.after.data().receiptData
const userUid = context.params.userUid
var options = {
method: 'POST',
url: 'https://sandbox.itunes.apple.com/verifyReceipt',
body: ({
"receipt-data" : receipt,
"password" : "8bf2f13bedc6456f97c9323c743a3168"
}),
json: true
};
return request(options).then(function (response) {
console.log(response);
return null
})
});
Любая помощь приветствуется