English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
ios7Después de .0, la forma de obtener el票据 Receipt de pago exitoso en iOS ha cambiado
La forma de obtener el票据 Receipt en el atributo transactionReceipt de SKPaymentTransaction ya ha caducado, aunque aún se puede usar, pero la sugerencia oficial de Apple es usar la nueva
La nueva forma de obtener Receipt es a través de la nueva interfaz como se muestra a continuación
NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL];
Por supuesto, inferior a ios7.0 todavía necesita usar la versión antigua del interfaz, el código para adaptar ambas versiones es el siguiente:
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]; } } else { //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]; } } }
Para determinar si es pago en sandbox, la versión nueva puede determinar directamente si existe "sandbox" en receiptURL
La versión anterior del receipt puede analizar NSData para ver si environment es 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; } else { CFRelease(plist); return nil; } }
Método de verificación de receipt del cliente:
NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedString] }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (!requestData) { return; } // Crear una solicitud POST con los datos del recibo. NSURL *storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"];//Obtener la dirección correcta según si es una verificación de pago en sandbox NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; // Realizar una conexión al iTunes Store en una cola en segundo plano. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:storeRequest queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { if (connectionError) { /* ... Maneje el error ... */ } else {}} NSError *error; NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error]; if (!jsonResponse) { /* ... Maneje el error ...*/ } /* ... Envíe una respuesta de vuelta al dispositivo ... */ } };
Formato de retorno de versión antigua:
{ 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 América/"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 América/"Los_Angeles"; quantity = 1; "transaction_id" = 1000001127239959; "unique_identifier" = 0000b0124819; "unique_vendor_identifier" = "ASDGF"2DB-DSAD-5A21-9611-642A4B9CASDE7"; }; status = 0; }
Documentación oficial del formato de retorno de nueva versión:Documentación oficial
Formato de retorno de nueva versión:
{ 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 América/"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 América/"Los_Angeles"; quantity = 1; "transaction_id" = 1000000359369424; } ...... Puede haber múltiples ); "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 América/"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 América/"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 América/"Los_Angeles"; "version_external_identifier" = 0; }; status = 0; }
Es importante destacar que el campo in_app de la estructura de datos de la nueva versión puede contener varios receipts de transaction. Si no se ha llamado con éxito a la interfaz de lectura de receipt después de completar la transaction, la próxima vez que se lea el receipt, se leerán todos, lo que resulta en múltiples datos.
Los desarrolladores de aplicaciones generalmente tienen su propio sistema de pago, y pueden crear su propio número de pedido antes de cada orden, que debe coincidir con el receipt devuelto por el pago de iOS. En este caso, cómo manejarlo es algo que debe prestar atención.
Esto es todo el contenido del artículo, espero que sea útil para su aprendizaje y que todos apoyen el tutorial de alarido.
Declaración: El contenido de este artículo se ha obtenido de la red, pertenece al propietario original, ha sido contribuido y subido por los usuarios de Internet de manera autónoma. Este sitio no posee los derechos de propiedad, no ha sido editado por humanos y no asume ninguna responsabilidad legal relacionada. Si encuentra contenido sospechoso de infracción de derechos de autor, por favor envíe un correo electrónico a notice#w.3Aviso: Si encuentra contenido sospechoso de infracción de derechos de autor, envíe un correo electrónico a notice#w con el # reemplazado por @ y proporcione evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso.