vigencia verificacion validador validacion validacfdi una saber impresos hacer fiscales falsa facturas factura consulta comprobantes como ios objective-c receipt receipt-validation
http://cdn1.raywenderlich.com/downloads/InAppRagePart2Finished.zip

ios - validador - verificacion sat 2018



iOS 7 Local(en el dispositivo) Validación de recibos y verificación de compras en la aplicación (5)

He implementado la validación de recibos localmente en el dispositivo utilizando OpenSSL y el compilador asn1c con ayuda de la Guía de programación de validación de recibos de Apple. Mi aplicación solo es compatible con iOS 7 y superior.

Según lo recomendado por Apple, llamo a [[NSBundle mainBundle] appStoreReceiptURL] para obtener el recibo de la tienda de aplicaciones. También hago esto cuando la aplicación se inicia por primera vez antes de mostrar cualquier IU. Esta primera llamada de lanzamiento es necesaria ya que Apple recomienda actualizar el recibo si no está en el primer intento. Como resultado de esta llamada ( SKReceiptRefreshRequest ), la aplicación le pide al usuario que ingrese la información de inicio de sesión de iTunes.

Ahora el problema es que Apple sigue rechazando la aplicación diciendo que estoy haciendo llamadas a sus servidores de producción en lugar de a los servidores de sandbox. Pero según lo que entiendo de la Guía de programación de validación de recibos, solo es válido si utiliza el segundo método de validación y envía datos a Apple a través de su propio servidor seguro. Sin embargo, estoy haciendo todo a nivel local y estoy muy confundido acerca de cómo diferenciar entre los entornos de producción y de sandbox para que mi aplicación pueda pasar la revisión.

Cualquier puntero o sugerencia sería muy útil.


Bien, esto es lo que funcionó para mí, Apple aprobó la aplicación anoche después de varias rondas de apelaciones de revisión y reenvíos que abarcan casi un mes.

NO intente actualizar el recibo cuando se inicie la aplicación y no bloquee la interfaz de usuario. Lo que estaba haciendo era no mostrar ninguna UI en el inicio hasta que se encontrara un recibo, por lo que cuando se le solicite la contraseña de iTunes al iniciar, al presionar cancelar se mostrará la versión limitada de la aplicación, al ingresar una contraseña correcta se intentaría descargar un nuevo recibo y actuar. según se haya encontrado uno.

Entonces, en el lanzamiento, si encuentra un recibo que está bien, si no, no intente actualizarlo.

Sin embargo, actualícelo cuando el usuario presione la opción Restaurar compras.

Espero que esto ayude.


He borrado mi respuesta anterior, había entendido mal la pregunta.

Creo que estás haciendo todo bien y Apple está confundido acerca de sus propias pautas, para ser honesto. Después de todo, en la Guía de programación de validación de recibos, advierten claramente: "Si la validación falla en iOS, use la clase SKReceiptRefreshRequest para actualizar el recibo" y no hay manera de influir en qué servidor se realiza esta llamada ( referencia de SKReceiptRefreshRequest )

De acuerdo con http://asciiwwdc.com/2013/sessions/308 , a qué servidor se llama depende de cómo se firma la aplicación, y es necesario que se firme para la producción luego de la presentación, obviamente.


La diferencia entre los entornos de producción y de sandbox se basa en el enlace que está llamando.

#define ITMS_PROD_VERIFY_RECEIPT_URL @"https://buy.itunes.apple.com/verifyReceipt" #define ITMS_SANDBOX_VERIFY_RECEIPT_URL @"https://sandbox.itunes.apple.com/verifyReceipt";

ITMS_PROD_VERIFY_RECEIPT_URL es un servidor de producción. ITMS_SANDBOX_VERIFY_RECEIPT_URL es un servidor sandbox.

  1. Asegúrese de crear el certificado de aprovisionamiento correcto desde el portal de aprovisionamiento de Apple. Conozca la diferencia entre Ad-Hoc vs Distribución.
  2. Cuando esté utilizando una cuenta de usuario de prueba de iTunes que creó con iTunes Connect para comprar, tendrá que probarla en el servidor de sandbox . En la Publicación de la identidad de firma de código , debe elegir el aprovisionamiento Ad-Hoc en lugar del aprovisionamiento de distribución .
  3. Pero cuando desea lanzar a la tienda de aplicaciones, debe elegir el aprovisionamiento de distribución y también el servidor de producción (ITMS_PROD_VERIFY_RECEIPT_URL). No puede utilizar la cuenta de usuario de prueba en este servidor. Deberá usar una cuenta de usuario de iTunes real para comprarla (después de que Apple la apruebe) para realizar una compra real.

Para aprender cómo implementar IAP localmente y verificar el recibo localmente, aprenda de: - 1. http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial

2. http://www.raywenderlich.com/23266/in-app-purchases-in-ios-6-tutorial-consumables-and-receipt-validation

Puede descargar el proyecto de muestra completado aquí: - 3. http://cdn1.raywenderlich.com/downloads/InAppRagePart2Finished.zip

NOTA: Puede haber otra forma de verificar el recibo que no conozco.

Encontré algo que podría ayudar: 1. https://developer.apple.com/library/ios/documentation/StoreKit/Reference/SKReceiptRefreshRequest_ClassRef/SKReceiptRefreshRequest_ClassRef.pdf

- (id)initWithReceiptProperties:(NSDictionary *)properties

Dice "En el entorno de producción, establezca este parámetro en nulo". propiedades En el entorno de prueba, las propiedades que debe tener el nuevo recibo. Para las claves, consulte “Propiedades del recibo” (página 4). En el entorno de producción, establezca este parámetro en nulo.


Me gustaría compartir mi experiencia. He estado trabajando en el Sandbox y falta el recibo de la aplicación después de eliminar la aplicación. (Y luego re-comando-R-ing) No sé si esto sucede en la producción, pero suena como si lo hiciera. Pedir una actualización en el primer inicio de la aplicación y pedirle al usuario su contraseña es sorprendente. Esto es un problema, por supuesto.

Parece como si [[SKPaymentQueue defaultQueue] restoreCompletedTransactions] también actualiza en silencio el recibo de la aplicación sin abrir un cuadro de diálogo. Lo que significa que, una vez que se haya restaurado la transacción, solicitar el appReceiptURL + Data devuelve un valor no nulo. Esto es sólo por mi corta cantidad de pruebas. Por favor, haz tus propias pruebas.


Se muestra el cuadro de diálogo para ingresar la contraseña del usuario si el recibo no es válido o no existe.

Por lo tanto, RATHER, a continuación, solicite psw al principio si el recibo no existe (porque el usuario está confundido porque acaba de iniciar la aplicación y no le pide ninguna razón) PROPORCIONE el btn de Restauración que debe proporcionar de ANYWAY y w8 hasta que obtenga el recibo que pueda Variar razonablemente.

Así que ponga su código de actualización en la declaración if:

if([[NSFileManager defaultManager] fileExistsAtPath:[[[NSBundle mainBundle] appStoreReceiptURL] path]] == YES) { self.receiptRefreshRequest = [[SKReceiptRefreshRequest alloc] initWithReceiptProperties:nil]; self.receiptRefreshRequest.delegate = self; [self.receiptRefreshRequest start]; }