рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐
рдкрдЯрд╛рдЦреЛрдВ рд╕реЗ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдХреА рд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ ред рдереЛрдбрд╝рд╛ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рд╣реИрдХрд░реНрд╕ рдЕрднреА рднреА рдирд╣реАрдВ рдмреИрдарддреЗ рд╣реИрдВред рдпрд╣ рд░рдХреНрд╖рд╛ рдкрджреНрдзрддрд┐ рдмрд╣реБрдд рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рдЗрд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдЯреЛрдо рд╡рд┐рдзрд┐ рдХреЗ рддрд╣рдд, рдЬреЛ рдХрд┐ рдЕрдзрд┐рдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реИред
рдЗрд╕ рд╡рд┐рд╖рдп рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдкрд┐рдЫрд▓реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐
рдмреНрд░реЗрдХрд░реНрд╕ рд╕реЗ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдХреА рд░рдХреНрд╖рд╛ рдХреИрд╕реЗ рдХрд░реЗрдВ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рд╖рдп рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИред
рдореЗрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ, рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж, рд░рд╕реАрдж рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдореИрдВ рдЗрд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддрд╛ рд╣реВрдБ рдФрд░ рдЗрд╕реЗ рд▓реЙрдЧ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реВрдБред рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЬреЛ JSON рдЖрддрд╛ рд╣реИ рд╡рд╣ рдорд╛рдирдХ рд╣реИ, рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрд╢реЛрдзрд┐рдд рд╣реИред
рдорд╛рдирдХ рдПрдХ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
{ "receipt": { "original_purchase_date_pst": "2012-06-08 04:13:04 America/Los_Angeles", "purchase_date_ms": "1339153984956", "original_transaction_id": "430000009214053", "original_purchase_date_ms": "1339153984956", "app_item_id": "12312312323", "transaction_id": "430000009214053", "quantity": "1", "bvrs": "1.0", "version_external_identifier": "7809437", "bid": "xx.yyyyyy.zzzzzzz", "product_id": "xx.yyyyyy.zzzzzz.uuuuuu", "purchase_date": "2012-06-08 11:13:04 Etc/GMT", "purchase_date_pst": "2012-06-08 04:13:04 America/Los_Angeles", "original_purchase_date": "2012-06-08 11:13:04 Etc/GMT", "item_id": "123123123" }, "status": 0 }
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореИрдВрдиреЗ 3 рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реИрдХрд┐рдВрдЧ рдкреНрд░рдпрд╛рд╕реЛрдВ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛:
1. рд╕рдмрд╕реЗ рдЖрдо рд╡рд┐рдХрд▓реНрдкред рдкрдЯрд╛рдЦрд╛ рдирдХрд▓реА рдирд╣реАрдВ рд╣реИ Apple рдХреЗ рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд░рд╕реАрдж рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИ:
{ "status": 21002, "exception": "java.lang.ClassCastException" }
рд╣рдорд╛рд░реЗ рдкрд┐рдЫрд▓реЗ рддрд░реАрдХреЗ рдиреЗ рдРрд╕реА рд╣реИрдХ рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд┐рдпрд╛, рдЬрдм рд╕реЗ рд╕реНрдерд┐рддрд┐ = 21002
2. рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рд╣реИрдХрд┐рдВрдЧ рдХреЗ рдирдП рддрд░реАрдХреЗ рд╕рд╛рдордиреЗ рдЖрдП рд╣реИрдВред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡реЗ рджреВрд╕рд░реЗ рдЕрдиреБрд░реЛрдз рдкрд░ Apple рд╕рд░реНрд╡рд░ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирдХрд▓реА рдХрд░рддреЗ рд╣реИрдВред
JSON рдлрд┐рд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
{ "status":0 }
рдРрд╕реА рд╣реИрдХрд┐рдВрдЧ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдк рдХреБрдЫ рдЪрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, "product_id", рдФрд░ рд╕рдм рдХреБрдЫ рдЬрдЧрд╣ рдореЗрдВ рдЧрд┐рд░ рдЬрд╛рдПрдЧрд╛ред
3. рд▓реЗрдХрд┐рди рдЗрддрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реИред рдирдХрд▓реА JSON рдХрд╛ рдПрдХ рдФрд░ рд╕рдВрд╕реНрдХрд░рдг рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд╕рд╛рдордиреЗ рдЖрдпрд╛ рд╣реИ:
{ "status": 0, "receipt": { "product_id": "xx.yyyyyy.zzzzzzzz.uuuuuuu", "purchase_date": 1339152660.383128, "quantity": 1, "transaction_id": "xx.yyyyyy.zzzzzzzz.uuuuuuu" } }
рдпрджрд┐ рдЖрдк рдлрд┐рд░ рд╕реЗ рдХреБрдЫ рдЪреЗрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдЦреЛрдЬрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдмреНрд░реЗрдХрд┐рдВрдЧ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдЕрдиреБрд░реЛрдз рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рд╕рднреА рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдЖрдиреЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реЛрдЧрд╛ред
рд╣рдореЗрдВ "item_id" рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдпрд╣ рд╡рд╣ рдЖрдИрдбреА рд╣реИ рдЬреЛ Apple рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЖрдк рдЗрд╕реЗ iTunes рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ "рдЗрди-рдРрдк рдЦрд░реАрджрд╛рд░реА рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗред
рдлрд┐рд░ рд╣рдорд╛рд░рд╛ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:
kFeature1 = "xx.yyyyyy.zzzzzzzz.uuuuuuu"; kFeatureItemID1 = "123123123"; kFeature2 = "xx.yyyyyy.zzzzzzzz.uuuuuuu"; kFeatureItemID2 = "123123123"; kFeature3 = "xx.yyyyyy.zzzzzzzz.uuuuuuu"; kFeatureItemID3 = "123123123"; - (BOOL)verifyReceipt:(NSData*)receiptData { NSString *urlsting = @"https://buy.itunes.apple.com/verifyReceipt"; NSURL *url = [NSURL URLWithString:urlsting]; NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; NSString *st = [receiptData base64EncodedString]; NSString *json = [NSString stringWithFormat:@"{\"receipt-data\":\"%@\"}", st]; [theRequest setHTTPBody:[json dataUsingEncoding:NSUTF8StringEncoding]]; [theRequest setHTTPMethod:@"POST"]; [theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; NSString *length = [NSString stringWithFormat:@"%d", [json length]]; [theRequest setValue:length forHTTPHeaderField:@"Content-Length"]; NSHTTPURLResponse* urlResponse = nil; NSError *error = [[NSError alloc] init]; NSData *responseData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&urlResponse error:&error]; NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; NSDictionary *dic = [responseString JSONValue]; NSInteger status = [[dic objectForKey:@"status"] intValue]; NSDictionary *receiptDic = [dic objectForKey:@"receipt"]; BOOL retVal = NO; if (status == 0 && receiptDic) { NSString *itemId = [receiptDic objectForKey:@"item_id"]; NSString *productId = [receiptDic objectForKey:@"product_id"]; if (productId && ([productId isEqualToString:kFeature1] || [productId isEqualToString:kFeature2] || [productId isEqualToString:kFeature3] )) { if (itemId && ( [itemId isEqualToString:kFeatureItemID1] || [itemId isEqualToString:kFeatureItemID2] || [itemId isEqualToString:kFeatureItemID3] )) { retVal = YES; } } } return retVal; }
рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреНрд▓рд╕ рдХреНрдпрд╛ рд╣реИ: рдкрдЯрд╛рдЦрд╛ рдХреЛ item_id рдХрд╛ рдореВрд▓реНрдп рдирд╣реАрдВ рдкрддрд╛ рд╣реИ, рдпрд╣ рдЕрдиреБрд░реЛрдз рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХрд╣реАрдВ рднреА рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реАрд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рдХреА рд░рд╕реАрдж рджреЗрдирд╛ рдЖрд╕рд╛рди рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╢рд╛рдпрдж, рдпрд╣ рд╕рдВрднрд╡ рд╣реИред
рдФрд░ рдХреГрдкрдпрд╛ рдпрд╣ рдордд рдХрд╣реЛ рдХрд┐ рд╕рдм рдХреБрдЫ рдЯреВрдЯ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдорд╛рдирдХ рд╕рд╛рдзрдиреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╣реИрдХ рдХреЛ рд░реЛрдХрдирд╛ рд╣реИред