Lo que necesita saber sobre la verificación de cheques de la tienda de aplicaciones (recibo de la tienda de aplicaciones)

StackOverflow todavía tiene muchas preguntas sobre la validación de las comprobaciones de la App Store, por lo que decidimos escribir un artículo sobre este tema en un formato de preguntas y respuestas.


imagen


¿Qué es un cheque de la tienda de aplicaciones?


Este es un archivo cifrado en formato PKCS # 7, que contiene información sobre todas las compras en la aplicación. Se encuentra en el paquete de la aplicación y se puede obtener fácilmente llamando a: Bundle.main.appStoreReceiptURL .


¿Siempre hay este archivo?


Si la aplicación se descargó de la App Store, sí, siempre. Y si se instaló a través de Xcode o Testflight, inicialmente la aplicación no tiene verificación de caja de arena hasta la primera compra o restauración de la verificación.


¿Qué significa "validar un cheque"?


Esto significa descifrar el archivo, recibir la fecha JSON y verificar las compras realizadas por el usuario. Puede hacerlo localmente o enviando una solicitud a Apple.


¿En qué casos un desarrollador requiere la validación de un cheque?


Para validar una compra recién completada.
Cuando muchos tuvieron un jailbreak, fue relevante: había utilidades para falsificar un cheque. Ahora este problema ha dejado de ser agudo, porque el jailbreak se ha convertido en una rareza.


Al restaurar compras.
Si un usuario reinstala su aplicación o se inicia desde otro dispositivo, debe darle acceso a la funcionalidad por la que ya ha pagado. Una vez descifrado el cheque de la App Store, puede averiguar si se compró una compra en la aplicación.


Al comprar suscripciones auto-renovables.
Para determinar el estado actual de la suscripción y la fecha de vencimiento.


¿Qué compras se pueden restaurar durante la validación?


Hay 4 tipos de compras en la aplicación:


  • compras consumibles
  • compras no consumibles
  • suscripciones no renovables
  • Suscripciones auto renovables
    Puede restaurar todo excepto las compras gastadas. Estos incluyen, por ejemplo, monedas en su aplicación, algo que puede comprar tantas veces como desee. Debe guardar el número actual de monedas en el usuario en su servidor.

¿Qué métodos de validación existen?


Hay tres de ellos:


  • validación local usando OpenSSL,
  • Validación a pedido de Apple directamente desde un dispositivo iOS,
  • Validación a pedido de Apple usando su servidor.

¿Qué método de validación es mejor?


La validación local es compleja y requiere mucho tiempo y esfuerzo para implementarla. También deberá agregar la biblioteca OpenSSL a su proyecto. En algunos casos, deberá actualizar el cheque.


Apple no recomienda verificar los controles en el dispositivo iOS. Esto no es seguro: una solicitud puede ser interceptada con un ataque de hombre en el medio.


Es mejor validar las verificaciones en el servidor. Además, Apple ocasionalmente agrega nuevos campos allí, por ejemplo, grace_period_expires_date y subscription_group_identifier . En nuestro servidor, podemos hacer cambios rápidamente sin actualizar la aplicación. Y los dos métodos de validación anteriores se pueden engañar fácilmente simplemente cambiando la hora del sistema en el dispositivo iOS.


¿Para qué sirve el secreto compartido?


Esta es una línea clave especial que es necesaria para descifrar cheques con compras renovables automáticamente. Apple usa el secreto compartido como parámetro en la solicitud HTTPS a Apple.


¿Dónde obtener el secreto compartido?


Vaya a App Store Connect, abra la aplicación, vaya a la pestaña Funciones , en la sección Compras integradas verá la Clave compartida para el botón de la aplicación . Genere una nueva clave, si aún no lo está.


Código de muestra para validar un cheque


 func validateReceipt(){ #if DEBUG let urlString = "https://sandbox.itunes.apple.com/verifyReceipt" #else let urlString = "https://buy.itunes.apple.com/verifyReceipt" #endif guard let receiptURL = Bundle.main.appStoreReceiptURL, let receiptString = try? Data(contentsOf: receiptURL).base64EncodedString() , let url = URL(string: urlString) else { return } let requestData : [String : Any] = ["receipt-data" : receiptString, "password" : "YOUR_SHARED_SECRET", "exclude-old-transactions" : false] let httpBody = try? JSONSerialization.data(withJSONObject: requestData, options: []) var request = URLRequest(url: url) request.httpMethod = "POST" request.setValue("Application/json", forHTTPHeaderField: "Content-Type") request.httpBody = httpBody URLSession.shared.dataTask(with: request) { (data, response, error) in // convert data to Dictionary and view purchases }.resume() } 

Este es un ejemplo de validación de un cheque en iOS. Recuerde reemplazar el valor de YOUR_SHARED_SECRET con su secreto compartido .


Después de recibir data , conviértalos a Dictionary :


 DispatchQueue.main.async { if let data = data, let jsonData = try? JSONSerialization.jsonObject(with: data, options: .allowFragments){ // your non-consumable and non-renewing subscription receipts are in `in_app` array // your auto-renewable subscription receipts are in `latest_receipt_info` array } } 

Ejemplo de recibo descifrado de App Store


Aquí puede ver un ejemplo de un cheque con dos transacciones en una aplicación con una suscripción de renovación automática.


¿Cuáles son las diferencias entre in_app y latest_receipt_info ?


  • latest_receipt_info contiene todas las transacciones, incluidas las renovaciones de compras auto renovables. Debe usar solo esta matriz.


  • in_app contiene transacciones de compras no in_app y suscripciones no renovables. La primera transacción de su suscripción auto-renovable también se duplica aquí. Las compras de consumibles también aparecerán en la matriz in_app , pero luego desaparecerán cuando el desarrollador complete la transacción.



Conclusión


En Apphud implementamos la validación de las comprobaciones de App Store para aplicaciones con suscripciones auto-renovables en un conveniente SDK de código abierto. Apphud también lo ayuda a rastrear el estado de la suscripción, analizar métricas clave, ofrecer automáticamente descuentos a usuarios no suscritos y mucho más. Si experimenta dolor mientras trabaja con suscripciones, pruebe nuestra solución de forma gratuita.

Source: https://habr.com/ru/post/472188/


All Articles