una suscripciones suscripcion recuperar historial factura eliminar cómo compras compra como cancelar apple app iphone objective-c ios in-app-purchase subscription

iphone - suscripciones - Cómo comprobar en la aplicación de compra de suscripción automática renovable es válida



recuperar factura apple (4)

Estoy buscando implementar las nuevas suscripciones de Auto Renewable usando la compra en la aplicación, pero no estoy seguro de cómo o cuándo verificar si el usuario está suscrito actualmente. Mi entendimiento es que cuando el usuario se suscribe inicialmente, la aplicación puede usar la fecha de compra junto con la fecha de suscripción para calcular cuánto duraría su suscripción. ¿Qué pasa después de esta fecha pasada? ¿Cómo comprobamos si el usuario se ha renovado o cancelado automáticamente?

Si utilizo restoreCompletedTransactions para obtener una transacción y un recibo por cada renovación, se le solicitará al usuario que ingrese su contraseña de iTunes. ¿Significa esto que si compraron una suscripción de 7 días, tendrán que ingresar su contraseña cada 7 días cuando la aplicación verifique si la suscripción sigue siendo válida?


Es mejor utilizar una solución local antes de hacer cualquier llamada a la API de Apple. Cada vez que la aplicación se ejecuta, es una buena práctica validar el recibo local y si necesita verificar si un usuario tiene la suscripción activa, primero puede recuperar las compras del recibo local y descubrir si la compra está todavía activa. .

He implementado una pequeña biblioteca escrita en Swift para simplificar el trabajo con In-App Receipt localmente. Puede recuperar fácilmente el objeto que representa el recibo ( InAppReceipt ) y recuperar una compra activa / todas las compras.

Siéntase libre de usar. Enlace Github

Aquí hay un ejemplo de cómo resolver su problema:

import TPInAppReceipt do { let receipt = try InAppReceiptManager.shared.receipt() //retrive active auto renewable subscription for a specific product and date let purchase = receipt.activeAutoRenewableSubscriptionPurchases(ofProductIdentifier: "ProductName", forDate: Date()) //retrive all auto renewable subscription purchases for a specific product let allAutoRenewableSubscriptionPurchases = receipt.purchases(ofProductIdentifier: "productName").filter({ return $0.isRenewableSubscription }) } catch { print(error) }


Estoy empezando una campaña en torno a este tema. Aquí está mi observación y campaña:

Tras la renovación automática, la App Store llama a la paymentQueue y publica una transacción. La transacción se publica con transaction.transactionState==SKPaymentTransactionStateRestored .

El problema es que, desafortunadamente, esto se publica solo en un dispositivo. Un segundo dispositivo no obtiene la publicación. Por lo tanto, para detectar la renovación automática, o más bien para detectar la falta de un auto-envío y negarle al dispositivo una suscripción continua, tiene que hacer un restoreCompletedTransaction o "http publicar un JSON codificado de 64 bits que contiene la última transacción". Si es el primero, el usuario debe dar su contraseña; Eso es intrusivo, como has señalado anteriormente. Si es lo último, se requiere mucha codificación adicional. Entonces, mi pregunta es ... ¿por qué StoreKit no tiene un comando:

(no existe) - [[SKPaymentQueue defaultQueue] restoreAttachedTransactions:(NSArray *)transactions];

Este comando fluiría como un restoreCompletedTransactions pero solo restauraría las transacciones adjuntas y, lo más importante, no requeriría que el usuario inicie sesión. Tiene la misma protección de seguridad que la "publicación HTTP de un JSON codificado de 64 bits que contiene la última transacción" y permite que todo el proceso de compra en la aplicación se realice en StoreKit en lugar de requerir el código de publicación web.

Si esto tiene sentido para usted, sugiera cómo entregarle esto a Apple ... gracias.


Hoy tengo problemas con este problema.

Siga el documento de Apple aquí, utilicé esta forma para comprobar si la suscripción ha caducado o no. Mi idea: la respuesta de APPLE REST API del usuario: (tiempo de solicitud + tiempo de caducidad) para verificar la fecha de caducidad o no

+ (BOOL)checkInAppPurchaseStatus { // Load the receipt from the app bundle. NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfURL:receiptURL]; if (receipt) { BOOL sandbox = [[receiptURL lastPathComponent] isEqualToString:@"sandboxReceipt"]; // Create the JSON object that describes the request NSError *error; NSDictionary *requestContents = @{ @"receipt-data": [receipt base64EncodedStringWithOptions:0],@"password":@"SHARE_SECRET_CODE" }; NSData *requestData = [NSJSONSerialization dataWithJSONObject:requestContents options:0 error:&error]; if (requestData) { // Create a POST request with the receipt data. NSURL *storeURL = [NSURL URLWithString:@"https://buy.itunes.apple.com/verifyReceipt"]; if (sandbox) { storeURL = [NSURL URLWithString:@"https://sandbox.itunes.apple.com/verifyReceipt"]; } NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:storeURL]; [storeRequest setHTTPMethod:@"POST"]; [storeRequest setHTTPBody:requestData]; BOOL rs = NO; //Can use sendAsynchronousRequest to request to Apple API, here I use sendSynchronousRequest NSError *error; NSURLResponse *response; NSData *resData = [NSURLConnection sendSynchronousRequest:storeRequest returningResponse:&response error:&error]; if (error) { rs = NO; } else { NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:resData options:0 error:&error]; if (!jsonResponse) { rs = NO; } else { NSLog(@"jsonResponse:%@", jsonResponse); NSDictionary *dictLatestReceiptsInfo = jsonResponse[@"latest_receipt_info"]; long long int expirationDateMs = [[dictLatestReceiptsInfo valueForKeyPath:@"@max.expires_date_ms"] longLongValue]; long long requestDateMs = [jsonResponse[@"receipt"][@"request_date_ms"] longLongValue]; NSLog(@"%lld--%lld", expirationDateMs, requestDateMs); rs = [[jsonResponse objectForKey:@"status"] integerValue] == 0 && (expirationDateMs > requestDateMs); } } return rs; } else { return NO; } } else { return NO; } }

Espero que esto ayude.


Vea esto para los documentos:

http://developer.apple.com/library/ios/#documentation/NetworkingInternet/Conceptual/StoreKitGuide/VerifyingStoreReceipts/VerifyingStoreReceipts.html#//apple_ref/doc/uid/TP40008267-CH104-SW1

Si desea verificarlo desde un servidor web, hace ping a su API y devuelve el estado de la suscripción auto-renovable e información sobre el último pago.

Si está en el dispositivo, es probable que tenga que llamar a restoreCompletedTransactions, que supongo que solicita la contraseña.

No veo ningún otro método. Supongo que desde el dispositivo usted podría verificar la suscripción contactando el mismo servicio web utilizado en el servidor. No sé cómo los pros y los contras de eso.