Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用Swift将收据数据发送到Node.js服务器_Javascript_Ios_Node.js_Swift_In App Purchase - Fatal编程技术网

Javascript 如何使用Swift将收据数据发送到Node.js服务器

Javascript 如何使用Swift将收据数据发送到Node.js服务器,javascript,ios,node.js,swift,in-app-purchase,Javascript,Ios,Node.js,Swift,In App Purchase,我目前正在尝试验证iOS中用户订阅的IAP收据。首先,我发出post请求,从当前存储在Bundle.main.appStoreReceiptURL中的收据中获取收据数据。我能够在我的服务器中使用这个收据数据来验证收据,它运行得很好。但是,此收据数据字符串在特定于某个用户的节点中硬编码。我如何才能将此收据字符串发送到我的服务器以获取任何收据,具体取决于要验证的任何用户。这是我的Swift和服务器代码。苹果在文件中说 要检索收据数据,请使用NSBundle的appStoreReceiptURL方法定

我目前正在尝试验证iOS中用户订阅的
IAP
收据。首先,我发出post请求,从当前存储在
Bundle.main.appStoreReceiptURL
中的收据中获取收据数据。我能够在我的服务器中使用这个收据数据来验证收据,它运行得很好。但是,此收据数据字符串在特定于某个用户的
节点中硬编码。我如何才能将此收据字符串发送到我的服务器以获取任何收据,具体取决于要验证的任何用户。这是我的Swift和服务器代码。苹果在文件中说

要检索收据数据,请使用NSBundle的appStoreReceiptURL方法定位应用程序的收据,然后读取整个文件。将此数据发送到服务器以及与服务器的所有交互,详细信息由您负责

我想获取收据数据并将其发送到我的服务器

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

如果要使用服务器验证收据(您应该这样做),则
validatePurchaseReceipt
方法应该调用服务器,而不是
/verifyReceipt
端点。收据数据将完全像您使用
requestReceiptDict
一样传递到服务器

另外,
secretKey
应该在服务器上硬编码,而不是在客户端的任何地方


这里有一个类似的问题:

非常感谢。这更有意义