ios 8,Swift,IAP收据验证

ios 8,Swift,IAP收据验证,ios,validation,swift,receipt,alamofire,Ios,Validation,Swift,Receipt,Alamofire,我正在拼命尝试在一个用Swift、IOS8.1编写的未来IOS应用程序中验证应用程序内的收据 我正在使用Alamofire框架来补偿NSURLConnection中的一个bug,但仍然没有从苹果服务器得到任何回报 func checkReceipt(data:NSData) { let ITMS_PROD_VERIFY_RECEIPT_URL = "https://buy.itunes.apple.com/verifyReceipt" let ITMS_SANDB

我正在拼命尝试在一个用Swift、IOS8.1编写的未来IOS应用程序中验证应用程序内的收据

我正在使用Alamofire框架来补偿NSURLConnection中的一个bug,但仍然没有从苹果服务器得到任何回报

func checkReceipt(data:NSData) {

    let ITMS_PROD_VERIFY_RECEIPT_URL        = "https://buy.itunes.apple.com/verifyReceipt"
    let ITMS_SANDBOX_VERIFY_RECEIPT_URL     = "https://sandbox.itunes.apple.com/verifyReceipt"

    let base64String = self.base64forData(data)
    if base64String != nil {

        let decodedData = NSData(base64EncodedString: base64String!, options: NSDataBase64DecodingOptions(0))
        let receiptInformation = self.dictionaryFromPlistData(decodedData!)

        let payload:NSString = "{\"receipt-data\" : \"\(base64String)\"}"
        println("-----------------------------------------")
        println("payload \(payload)")
        println("-----------------------------------------")
        let payloadData:NSData = payload.dataUsingEncoding(NSUTF8StringEncoding)!

        let serverURL = NSURL(string: ITMS_SANDBOX_VERIFY_RECEIPT_URL) //ITMS_PROD_VERIFY_RECEIPT_URL;

        var request = NSMutableURLRequest(URL: serverURL!)    // (URL:
        request.HTTPMethod = "POST"
        request.HTTPBody = payloadData

        let (param, _) = Alamofire.ParameterEncoding.URL.encode(request, parameters: nil)

        Alamofire.request(param)
            .response { (request, response, data, error) in
                    println(request)
                    println(response)
                    println(error)
            }
    }
}
来自服务器的反馈是:

Optional(<NSHTTPURLResponse: 0x17403b760> { URL: https://sandbox.itunes.apple.com/verifyReceipt } { status code: 200, headers {
    "Cache-Control" = "private, no-cache, no-store, no-transform, must-revalidate, max-age=0";
    Connection = "keep-alive";
    "Content-Encoding" = gzip;
    "Content-Length" = 36;
    Date = "Tue, 11 Nov 2014 19:20:38 GMT";
    Expires = "Tue, 11 Nov 2014 19:20:38 GMT";
    "Set-Cookie" = "Pod=100; version=\"1\"; expires=Thu, 11-Dec-2014 19:20:38 GMT; path=/; domain=.apple.com, itspod=100; version=\"1\"; expires=Thu, 11-Dec-2014 19:20:38 GMT; path=/; domain=.apple.com, mzf_in=990212; version=\"1\"; path=/WebObjects; domain=.apple.com; secure; HttpOnly, mzf_dr=0; version=\"1\"; expires=Thu, 01-Jan-1970 00:00:00 GMT; path=/WebObjects; domain=.apple.com";
    "apple-timing-app" = "193 ms";
    "edge-control" = "no-store, cache-maxage=0";
    itspod = 100;
    pod = 100;
    "x-apple-application-instance" = nnnnnnnn;
    "x-apple-application-site" = SB;
    "x-apple-jingle-correlation-key" = xxxxxxxxx;
    "x-apple-lokamai-no-cache" = true;
    "x-apple-orig-url" = "http://sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/verifyReceipt";
    "x-apple-translated-wo-url" = "/WebObjects/MZFinance.woa/wa/verifyReceipt";
    "x-frame-options" = SAMEORIGIN;
    "x-webobjects-loadaverage" = 0;
} })
可选({URL:https://sandbox.itunes.apple.com/verifyReceipt }{状态代码:200,标题{
“缓存控制”=“私有,无缓存,无存储,无转换,必须重新验证,最大年龄=0”;
连接=“保持活动”;
“内容编码”=gzip;
“内容长度”=36;
日期=“2014年11月11日星期二19:20:38 GMT”;
Expires=“2014年11月11日星期二19:20:38 GMT”;
“Set Cookie”=“Pod=100;version==“1\”expires=Thu,2014年12月11日19:20:38 GMT;path=/;domain=.apple.com,itspod=100;version==“1\”expires=Thu,2014年12月11日19:20:38 GMT;path=/;domain=.apple.com,mzf\u in=990212;version=“1\”path=/WebObjects;domain=.apple.com;secure=.apple.apple.com;secure;HttpOnly,mzf\u dr=0;version=“1\“expires=Thu,1970年1月1日00:00:00GMT;path=/WebObjects;domain=.apple.com”;
“苹果计时应用程序”=“193毫秒”;
“边缘控制”=“无存储,缓存最大值=0”;
itspod=100;
pod=100;
“x-apple-application-instance”=nnnnnn;
“x-apple-application-site”=SB;
“x-apple-Kingle-correlation-key”=xxxxxxxxx;
“x-apple-lokamai-no-cache”=真;
“x-apple-orig-url”=”http://sandbox.itunes.apple.com/WebObjects/MZFinance.woa/wa/verifyReceipt";
“x-apple-translated-wo-url”=“/WebObjects/MZFinance.woa/wa/verifyreceive”;
“x-frame-options”=SAMEORIGIN;
“x-webobjects-loadaverage”=0;
} })
而不是申请收据


感谢您的帮助。您的问题很简单。您可以查看响应标题而不是正文。查看数据。也可以使用
response
方法更好地使用
。responseJSON(选项:[],completionHandler:)
方法,请参阅我的代码

func validateReceipt() {
    if let receipt =  NSBundle.mainBundle().appStoreReceiptURL {
        if let data = NSData(contentsOfURL: receipt) {
            let requestContents:[String:String] = ["receipt-data":data.base64EncodedStringWithOptions([]), "password": "YOU_SHARED_SECRET"]
            let requestData = try! NSJSONSerialization.dataWithJSONObject(requestContents,options: [])
            let request = NSMutableURLRequest(URL: NSURL(string: "https://sandbox.itunes.apple.com/verifyReceipt")!)
            request.HTTPMethod = "POST"
            request.HTTPBody = requestData
            let (param, _) = Alamofire.ParameterEncoding.URL.encode(request, parameters: nil)

            Alamofire.request(param)
                .responseJSON(options: [], completionHandler: { (result) -> Void in
                    print(result)
                })
        }
    }
}
谢谢@R00We

Swift 5和Alamofire(5.0.0-beta.7)


NSURLConnection中存在什么错误?没有将此作为答案发布,但苹果强烈反对直接在设备和应用商店服务器之间远程验证收据。“使用应用商店验证需要应用和服务器之间的安全连接,并在服务器上编写代码,以使用应用商店验证收据。“相反,您可以在这里查找一篇关于设备验证的非常好的文章:
  func validateReceipt() {
        guard let receiptURL = Bundle.main.appStoreReceiptURL, let data = try? Data(contentsOf: receipt ) else {
              return
        }

        let model = ApplePayModel(receipt: data.base64EncodedString(options: []), "password": "YOU_SHARED_SECRET")

        AF.request( "https://sandbox.itunes.apple.com/verifyReceipt" , method: HTTPMethod.post, parameters: model, encoder: JSONParameterEncoder.prettyPrinted, headers: <Your Header, maybe be nil > ).response { (response: DataResponse<Data?>) in

            if let data = response.data{
                 // JSONSerialization it
            }

        }
 }
struct ApplePayModel: Encodable{
    let receipt: String
    let order_id: String


    private enum CodingKeys: String, CodingKey {
        case receipt = "receipt-data", order_id
    }
}