2009-08-19 35 views
8

Tôi đã là những ngày qua cố gắng thử nghiệm ứng dụng iphone mua hàng trong ứng dụng đầu tiên của mình. Thật không may, tôi không thể tìm thấy cách để nói chuyện với máy chủ iTunes để xác minh transactionReceipt.Tạo đối tượng JSON với transactionReceipt

Vì đây là lần đầu tiên tôi thử với công nghệ này, tôi đã chọn xác minh biên nhận trực tiếp từ iPhone thay vì sử dụng hỗ trợ máy chủ. Nhưng sau khi cố gắng gửi yêu cầu POST bằng JSON onbject được tạo bằng cách sử dụng api JSON từ mã google, itunes luôn trả về một phản hồi lạ (thay vì chuỗi "status = 0" mà tôi đợi).

Dưới đây là đoạn code mà tôi sử dụng để xác minh nhận:

- (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]; 
} 

có lẽ tôi đang quên một cái gì đó trong tiêu đề của yêu cầu nhưng tôi nghĩ rằng vấn đề là trong phương pháp tôi sử dụng để tạo ra các đối tượng JSON.

dưới đây là cách đối tượng JSON trông giống như trước khi tôi thêm nó vào HTTPBody:

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

     ........... 

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

Các câu trả lời tôi đã có:

đáp ứng hoàn toàn { ngoại lệ = "java.lang. IllegalArgumentException: Phân tích danh sách thuộc tính thất bại trong khi cố gắng đọc chuỗi không được trích dẫn. Không tìm thấy ký tự cho phép. Tại số dòng: 1, cột: 0. "; trạng thái = 21002; }

Cảm ơn bạn đã hướng dẫn.

+0

Không có tài liệu nào nói rằng 'transactionReceipt' có thể được hiểu là chuỗi được mã hóa UTF-8 – user102008

Trả lời

20

Tôi vừa khắc phục điều đó sau 2 ngày gặp khó khăn. Bạn phải mã hóa biên nhận bằng Base64 trước khi chèn vào đối tượng json. Như thế (Ruby):

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

Base64 không được đề cập bất cứ nơi nào trong tài liệu chính thức (ít nhất là cho SDK 3.0), chỉ trên một vài blog.

Ví dụ: here chàng mã hóa biên nhận trong Base64 trước khi chuyển nó tới máy chủ PHP, nhưng không giải mã nó trở lại trong PHP, do đó gửi chuỗi mã hóa Base64 tới iTunes.

+0

Cảm ơn rất nhiều câu trả lời của bạn !! – Carlos

+0

Cảm ơn bạn rất nhiều vì đã chỉ ra điều này! –

+0

Hướng dẫn lập trình mua hàng trong ứng dụng hiện tại đề cập đến mã hóa cơ sở 64 trong bước 1. http://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/ uid/TP40008267-CH104-SW1 –

2

Re: "21.002: java.lang.IllegalArgumentException: propertyListFromString phân tích cú pháp một đối tượng, nhưng vẫn có nhiều văn bản trong chuỗi .:"

tôi cố định một vấn đề tương tự trong mã của tôi bằng cách gói dữ liệu nhận được trong { } trước khi mã hóa.

Việc tiếp nhận kết quả trông giống như:

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

Dưới đây là đoạn code tôi sử dụng:

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) 

Phản ứng của Apple:

{"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} 

Chúc may mắn!

Các vấn đề liên quan