English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ios7.0 이후 iOS 결제 성공 시 반환되는票据 Receipt 얻는 방법이 새로운 방법으로 변경되었습니다
과거의 SKPaymentTransaction에서 transactionReceipt 속성을 통해票据를 얻는 방법은 더 이상 유효하지 않습니다. 그러나 아직 사용할 수 있지만, 애플 공식은 새로운 방법을 사용하는 것을 권장합니다
신버전의 Receipt 얻는 방법은 새로운 인터페이스를 통해입니다
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
물론, ios 이하의 버전은7.0의 경우는 여전히 오래된 버전 인터페이스를 사용해야 하며, 두 버전에 대한 코드를 다음과 같이 맞춤할 수 있습니다:
NSData*receipt= nil; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")){ //ios after 7.0 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; receipt = [NSData dataWithContentsOfURL:receiptURL]; NSString *receiptURLStr = [receiptURL absoluteString]; NSRange rangeSandbox = [receiptURLStr rangeOfString:@"sandbox"]; if (rangeSandbox.location != NSNotFound){ record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } //ios 3.0~7.0 receipt = transaction.transactionReceipt; NSDictionary *dict = [NSDictionary dictionaryWithContentsOfData:receipt]; if (dict){ NSString *env = [dict objectForKey:@"environment"]; if ([env isEqualToString:@"Sandbox"]) { record[kIAPEnvironment] = [NSNumber numberWithInt:1]; } } }
새 버전에서는 receiptURL에 'sandbox'이 존재하는지 직접 확인할 수 있습니다
오래된 버전 receipt는 NSData를 해석할 수 있으며, environment이 Sandbox인지 확인하여 보세요
+ (NSDictionary *)dictionaryWithContentsOfData: (NSData *)data{ CFPropertyListRef plist = CFPropertyListCreateFromXMLData(kCFAllocatorDefault, (__bridge CFDataRef)data, kCFPropertyListImmutable, NULL); if(plist == nil) return nil; if ([(__bridge id)plist isKindOfClass:[NSDictionary class]]){}} return (__bridge NSDictionary *)plist; } CFRelease(plist); return nil; } }
Client receipt verification method:
NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedString] }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (!requestData) { return; } // Create a POST request with the receipt data. NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt];//According to whether it is sandbox payment verification to get the correct address NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; // Make a connection to the iTunes Store on a background queue. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError) { /* ... 오류 처리 ... */ } else {}} NSError *error; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (!jsonResponse) { /* ... 오류 처리 ...*/ } /* ... 장치에 응답을 보내십시오 ... */ } };
구버전 반환 형식:
{ bid = "com.coodezhang.test"; bvrs = "1.0"; "item_id" = 892617314; "original_purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "original_purchase_date_ms" = 1626147394550; "original_purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; "original_transaction_id" = 1000001127239959; "product_id" = "com.coodezhang.test_coins"99M_Tier1"; "purchase_date" = "2017-12-14 07:43:14 Etc/GMT"; "purchase_date_ms" = 1626147394550; "purchase_date_pst" = "2017-12-14 12:43:14 America/Los_Angeles"; quantity = 1; "transaction_id" = 1000001127239959; "unique_identifier" = 0000b0124819; "unique_vendor_identifier" = "ASDGF"2DB-DSAD-5A21-9611-642A4B9CASDE7"; }; status = 0; }
신버전 반환 형식 공식 문서:공식 문서
신버전 반환 형식:
{ environment = Sandbox; receipt = { "adam_id" = 0; "app_item_id" = 0; "application_version" = 1; "bundle_id" = "com.coodezhang.test"; "download_id" = 0; "in_app" = ( { "is_trial_period" = false; "original_purchase_date" = "2017-12-14 07:18:56 Etc/GMT"; "original_purchase_date_ms" = 1513235936000; "original_purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; "original_transaction_id" = 1000000359369424; "product_id" = "com.coodezhang.test_coins"99M_Tier1"; "purchase_date" = "2017-12-14 07:18:56 Etc/GMT"; "purchase_date_ms" = 1513235936000; "purchase_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; quantity = 1; "transaction_id" = 1000000359369424; } ...... 可能存在多条 ); "original_application_version" = "1.0"; "original_purchase_date" = "2013-08-01 07:00:00 Etc/GMT"; "original_purchase_date_ms" = 1375340400000; "original_purchase_date_pst" = "2013-08-01 00:00:00 America/Los_Angeles"; "receipt_creation_date" = "2017-12-14 07:18:56 Etc/GMT"; "receipt_creation_date_ms" = 1513235936000; "receipt_creation_date_pst" = "2017-12-13 23:18:56 America/Los_Angeles"; "receipt_type" = ProductionSandbox; "request_date" = "2017-12-14 07:19:23 Etc/GMT"; "request_date_ms" = 1513235963829; "request_date_pst" = "2017-12-13 23:19:23 America/Los_Angeles"; "version_external_identifier" = 0; }; status = 0; }
최신 버전에서 데이터 구조의 in_app 필드는 여러 트랜잭션의 receipt를 포함할 수 있습니다. 트랜잭션을 완료한 후에 receipt를 읽은 인터페이스를 성공적으로 호출하지 않았다면, 다음 번 receipt를 읽을 때 모든 것을 읽어들입니다. 이로 인해 여러 데이터 행이 생성됩니다.
일반 개발자의 앱 결제는 각자의 결제 시스템이 있으며, 주문 전에 자신의 주문 번호를 생성할 수 있습니다. 이를 iOS 결제가 반환하는 receipt과 일일치하도록 해야 합니다. 이 경우 어떻게 처리해야 할지 주의해야 합니다.
이以上就是本문의 전체 내용입니다. 여러분의 학습에 도움이 되길 바랍니다. 또한, 나리아 튜토리얼에 많은 지지를 부탁드립니다.
고지사항: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권은 원저자에게 있으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 이 사이트는 소유권을 가지지 않으며, 인공 편집 처리를 하지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 위반 내용이 있을 경우 이메일로 notice#w에 보내주시기 바랍니다.3codebox.com에 이메일을 보내면 (#을 @으로 변경하십시오) 신고하시고 관련 증거를 제공하십시오. 사실로 확인되면, 이 사이트는 즉시 의심스러운 저작권 내용을 삭제할 것입니다.