Как я могу отправить данные квитанции с помощью Swift на сервер Node.js - PullRequest
0 голосов
/ 21 января 2019

Я сейчас пытаюсь проверить IAP квитанции пользовательских подписок в iOS. Сначала я делаю почтовый запрос, который возвращает мне данные чека из чека, в настоящее время хранящегося в Bundle.main.appStoreReceiptURL. Я могу использовать эти данные на своем сервере, чтобы проверить, что чек работает достаточно хорошо. Однако эта строка данных квитанции жестко закодирована в Node, что характерно для определенного пользователя. Как я могу быть в состоянии отправить эту строку квитанции на мой сервер для любой квитанции в зависимости от любого пользователя, подлежащего проверке. Вот мой Swift и код сервера. Apple говорит в документации

Чтобы получить данные квитанции, используйте метод appStoreReceiptURL NSBundle, чтобы найти квитанцию ​​приложения, а затем прочитать весь файл. Отправьте эти данные на ваш сервер - как и во всех взаимодействиях с вашим сервером, ответственность за детали лежит на вас.

Я хотел бы получить данные квитанции и отправить их на мой сервер.

func getReceipt() {
    if let receiptUrl = receiptUrl {
        do {
            let purchaseReceipt = try Data(contentsOf: receiptUrl)
            self.validatePurchaseReceipt(pReceiptData: purchaseReceipt)
        } catch {
            let receiptRefreshRequest = SKReceiptRefreshRequest(receiptProperties: nil)
            receiptRefreshRequest.delegate = self
            receiptRefreshRequest.start()
        }
    }
}

func validatePurchaseReceipt(pReceiptData: Data) {
    let base64encodedReceipt = pReceiptData.base64EncodedString()
    let secretKey = "myAppstoreConnectSecretKey"
    let requestReceiptDict = ["receipt-data": base64encodedReceipt, "password": secretKey]
    guard JSONSerialization.isValidJSONObject(requestReceiptDict) else { return }
    do {
        let data = try JSONSerialization.data(withJSONObject: requestReceiptDict)
        let validationString = "https://sandbox.itunes.apple.com/verifyReceipt"
        guard let validationUrl = URL(string: validationString) else { return }
        let session = URLSession(configuration: .default)
        var request = URLRequest(url: validationUrl, cachePolicy: .reloadIgnoringLocalCacheData)
        request.httpMethod = "POST"
        let task = session.uploadTask(with:request, from: data) { (data, response, error) in
            guard let data = data, error == nil else { return }
            do {
                let purchaseReceiptJSON = try JSONSerialization.jsonObject(with: data, options: .allowFragments)
                print("Success retrieved json:\(purchaseReceiptJSON)")
            } catch let error {
                print(error)
            }
        }
        task.resume()
    } catch let error {
        print(error)
    }
}

Это мой код сервера

const express = require('express');
const requirePromise = require('request-promise');
const app = express();

let verificationURL = 'https://sandbox.itunes.apple.com/verifyReceipt';
let secretKey = 'myAppstoreConnectSecretKey';
let receiptData = 'MIIntgYJKoZIhvcNAQcCoIInpzCCJ6MCAQExCzAJBgUrDgMCGgUAMIIXVwYJKoZIhvcNAQcBoIIXSASCFetc'
const options = {
  url: verificationURL,
    method: 'POST',
    headers: {
    'User-Agent': 'Request-Promise',
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    json: true
};

options.form = JSON.stringify({
    'receipt-data': receiptData,
    'password': secretKey
});

requirePromise(options).then((resData) => {
    console.log(resData);
    return resData;
}).catch(function (error) {
    console.log(error);
});

1 Ответ

0 голосов
/ 21 января 2019

Если вы собираетесь использовать свой сервер для проверки квитанций (что необходимо), тогда метод validatePurchaseReceipt должен вызывать ваш сервер, а не конечную точку /verifyReceipt.Данные квитанции передаются на ваш сервер точно так же, как вы делаете с requestReceiptDict.

. Кроме того, secretKey должен быть жестко задан на вашем сервере, а не где-либо на клиенте.

Вот похожий вопрос: https://stackoverflow.com/a/54261816/3166209

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