2009-08-19 17 views
8

나는 처음으로 인앱 구매 아이폰 애플리케이션을 테스트하려고 시도 해왔다. 불행히도 나는 iTunesRelease를 확인하기 위해 iTunes 서버와 대화하는 방법을 찾을 수 없습니다.transactionReceipt를 사용하여 JSON 객체 생성

이 기술로 내 첫 번째 시도이기 때문에 서버 지원을 사용하는 대신 iPhone에서 영수증을 직접 확인하기로 결정했습니다. 하지만 JSON API를 사용하여 만든 JSON onbject를 사용하여 POST 요청을 Google 코드에서 보내려고 시도한 후, itunes는 항상 이상한 응답 (대신 "status = 0"문자열)을 반환합니다.

는 여기 영수증 확인하기 위해 사용하는 코드입니다 :
- (void)recordTransaction:(SKPaymentTransaction *)transaction { 
    NSString *receiptStr = [[NSString alloc] initWithData:transaction.transactionReceipt encoding:NSUTF8StringEncoding]; 
    NSDictionary *jsonDictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"algo mas",@"receipt-data",nil]; 

    NSString *jsonString = [jsonDictionary JSONRepresentation]; 
    NSLog(@"string to send: %@",jsonString); 

    NSLog(@"JSON Created"); 
    urlData = [[NSMutableData data] retain]; 

    //NSURL *sandboxStoreURL = [[NSURL alloc] initWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; 
    NSLog(@"will create connection"); 
    [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
} 

어쩌면 내가 요청의 헤더에 뭔가를 잊고을하지만 문제는 내가 JSON 개체를 만드는 데 사용하는 방법이라고 생각합니다.

다음은 JSON 객체가 나는 HTTPBody에 추가하기 전에처럼 보이는 방법은 다음과 같습니다 내가있어

string to send: {"receipt-data":"{\n\t\"signature\" = \"AUYMbhY 

     ........... 

D0gIjEuMCI7Cn0=\";\n\t\"pod\" = \"100\";\n\t\"signing-status\" = \"0\";\n}"} 

응답 :

완전 반응 {= "java.lang의 예외입니다. IllegalArgumentException : 인용 부호가없는 문자열을 읽는 동안 속성 목록 구문 분석에 실패했습니다. 허용되는 문자가 없습니다. 행 번호 : 1, 열 : 0. "; 상태 = 21002; }

감사합니다.

+0

문서에서 'transactionReceipt'가 UTF-8로 인코딩 된 문자열로 해석 될 수 있다고 말하지 않습니다 – user102008

답변

20

저는 고생 2 일 만에 고칠 수 있습니다. json 객체에 삽입하기 전에 Base64를 사용하여 영수증을 인코딩해야합니다. 그 (루비)처럼 :

dataForVerification = {"receipt-data" => Base64.encode64(receipt)}.to_json 

Base64로는 블로그의 몇에 (적어도 SDK 3.0) 공식 문서의 아무 곳이나 언급되어 있지 않습니다.

예를 들어, here 사람은 Base64로 영수증을 인코딩하여 PHP 서버에 전달하지만 다시 PHP로 디코딩하지 않으므로 Base64로 인코딩 된 문자열을 iTunes로 보냅니다.

+0

답변 해 주셔서 감사합니다 !! – Carlos

+0

이 점을 지적 해 주셔서 감사합니다! –

+0

현재 App App Purchase Programming Guide에 1 단계에서 base 64 인코딩에 대한 설명이 있습니다. http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/ uid/TP40008267-CH104-SW1 –

2

재 : "21002 : java.lang.IllegalArgumentException가 : propertyListFromString는 객체를 구문 분석,하지만 문자열 :에 더 많은 텍스트 여전히있다"

내가있는 영수증 데이터를 포장하여 내 코드에서 비슷한 문제를 해결은 { } 인코딩 전에.

receipt = "{%s}" % receipt // This step was not specified - trial and error 
encoded = base64.b64encode(receipt) 
fullpost = '{ "receipt-data" : "%s" }' % encoded 
req = urllib2.Request(url, fullpost) 
response = urllib2.urlopen(req) 

애플의 응답 :

{"receipt":{"item_id":"371235", "original_transaction_id":"1", "bvrs":"1.0", "product_id":"com.foo.cup", "purchase_date":"2010-05-25 21:05:36 Etc/GMT", "quantity":"1", "bid":"com.foo.messenger", "original_purchase_date":"2010-05-25 21:05:36 Etc/GMT", "transaction_id":"11237"}, "status":0} 

행운

{ 
    "signature" = "A[...]OSzQ=="; 
    "purchase-info" = "ew[...]fQ=="; 
    "pod" = "100"; 
    "signing-status" = "0"; 
} 

여기 내가 사용하는 코드입니다 :

결과 영수증처럼 보인다!