Firebase Firestore + Cloud Function 服务器端验证应用内购买收据(Swift + NodeJS)

Scu*_*tt善 11 in-app-purchase firebase swift google-cloud-functions google-cloud-firestore

Firebase Firestore + 云功能服务器端验证收据(应用内购买),最终结果:状态 21002 这意味着:收据属性中的数据格式错误或丢失。

步骤1)我使用swift将应用内购买收据存储到Firestore中,Firestore数据库自然将其存储为blob

step2) 一旦收据进入 firestore 就会触发云功能。Firebase 函数向苹果 iTunes 商店发送收据,但最终结果是:状态 21002。

我猜在将收据从 base64EncodedData 转换为 Firestore blob 的过程中,不知何故格式错误,然后在云函数上检索它。如何获得正确的收据格式,以便我可以将其发送到 Apple iTunes 商店进行收据验证?

第 1 步快速代码:

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 {}
    }
Run Code Online (Sandbox Code Playgroud)

step 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
        })

    });
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

Scu*_*tt善 5

解决了,我需要更改编码方法。改变

let receiptData = rawReceiptData.base64EncodedData()
Run Code Online (Sandbox Code Playgroud)

let receiptData = rawReceiptData.base64EncodedString()
Run Code Online (Sandbox Code Playgroud)

如果您想使用 Firestore 和云功能进行服务器端收据验证,问题示例代码应该有很大帮助

  • “//将receiptData存储到firestore的标准方法,我这样做了,但为了清洁起见没有在这里发布完整的代码”我在哪里可以找到这种代码?我已经搜索过但没有找到任何东西 (2认同)