2014-11-11 5 views
3
에 대한 영수증 검증

내가 필사적 스위프트로 작성된 FUTUR IOS 응용 프로그램에서 인 - 앱의 영수증을 확인하기 위해 노력하고있어, IOS8.1IOS 8, 스위프트, IAP

내가 보상하기 위해 Alamofire 프레임 워크를 사용하고 있습니다 NSURLConnection의 버그로 신속하게 대응할 수는 있지만 여전히 Apple 서버에서 돌아 오지는 않습니다.

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

...

이 어떤 도움이

+0

있는 NSURLConnection에서 어떤 버그? –

+0

답변으로 게시하지 않지만 Apple은 기기와 앱 스토어 서버간에 직접 영수증을 원격으로 확인하지 않을 것을 강력히 권유합니다. "앱 스토어에서 유효성을 검사하려면 앱과 서버 사이에 보안 연결이 필요하고 앱 스토어에서 영수증을 확인하기 위해 서버에 코드를 작성해야합니다." 대신 여기에 장치 유효성 검사에 대한 정말 좋은 기사를보십시오 : http://www.objc.io/issues/17-security/receipt-validation/ – Shirkrin

답변

1

겠어요 - 감사 문제는 간단합니다. 시체 대신 응답 헤더를 봅니다. 데이터를보십시오. 또한 대신 response 방법 더 나은 .responseJSON(options: [], 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) 
       }) 
     } 
    } 
} 
관련 문제