문제

지난 날에는 첫 번째 인앱 구매 iPhone 응용 프로그램을 테스트하려고했습니다. 불행히도 나는 iTunes Server와 대화하여 TransactionReceipt를 확인하는 방법을 찾을 수 없습니다.

이 기술로 첫 번째 시도이기 때문에 서버 지원을 사용하여 iPhone에서 직접 영수증을 확인하기로 결정했습니다. 그러나 Google 코드에서 JSON API를 사용하여 생성 된 JSON ONBJECT로 게시물 요청을 보내려고 시도한 후 iTunes는 항상 이상한 응답을 반환합니다 (대신 대신 기다리고있는 "상태 = 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 객체를 만드는 데 사용하는 방법에 있다고 생각합니다.

httpbody에 추가하기 전에 JSON 객체의 모습은 다음과 같습니다.

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

       ...........

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

내가 가진 응답 :

완전한 응답 {exception = "java.lang.ilegalargumentexception : 품질 목록 구문 분석이 실패하지 않은 문자열을 읽으려고 시도했습니다. 허용 문자가 발견되지 않았습니다. 줄 번호 : 1, 열 : 0."; 상태 = 21002; }

당신의지도에 감사드립니다.

도움이 되었습니까?

해결책

나는 2 일 동안 어려움을 겪은 후에 그것을 해결했다. JSON 객체에 삽입하기 전에 Base64를 사용하여 영수증을 인코딩해야합니다. 그런 식 (루비) :

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

Base64는 공식 문서의 어느 곳에서나 (적어도 SDK 3.0의 경우) 몇 블로그에서만 언급되지 않았습니다.

예를 들어, 여기 Guy는 PHP 서버로 전달하기 전에 Base64에서 영수증을 인코딩하지만 PHP에서 다시 해독하지 않으므로 Base64- 인코딩 된 문자열을 iTunes로 보냅니다.

다른 팁

Re : "21002 : java.lang.illegalargumentexception : propertylistfromsproms는 객체를 구문 분석했지만 문자열에는 여전히 더 많은 텍스트가 있습니다. :"

인코딩하기 전에 영수증 데이터를 {}로 랩핑하여 코드에서 비슷한 문제를 수정했습니다.

결과 영수증은 다음과 같습니다.

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

다음은 내가 사용하는 코드입니다.

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":"1012307", "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}

행운을 빕니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top