代码之家  ›  专栏  ›  技术社区  ›  sk123

如何使用swift将收据数据发送到node.js服务器

  •  0
  • sk123  · 技术社区  · 7 年前

    我正在尝试验证 IAP 在iOS中接收用户订阅。首先,我发出一个邮件请求,从当前存储在 Bundle.main.appStoreReceiptURL .我可以在我的服务器中使用这个收据数据来验证收据,它工作得很好。但是,此收据数据字符串是硬编码的 Node 特定于某个用户。根据要验证的任何用户,我如何能够将此回执字符串发送到我的服务器以获取任何回执。这是我的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);
    });
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   enc_life    7 年前

    如果您要使用服务器验证收据(您应该这样做),那么 validatePurchaseReceipt 方法应该调用您的服务器,而不是 /verifyReceipt 端点。收据数据会像处理一样传递到服务器 requestReceiptDict .

    此外, secretKey 应该 在服务器上进行硬编码,而不是在客户机上的任何地方。

    下面是一个类似的问题: https://stackoverflow.com/a/54261816/3166209

    推荐文章