¿Cómo notifica Apple las aplicaciones de iOS de reembolsos de compras en la aplicación (IAP)?

Tengo Apple iOS IAP implementado con éxito en mi aplicación y probado en el sandbox. Funciona genial.

Me preocupa que los usuarios puedan comprar algo con IAP, downloadlo en mi aplicación, luego quejarse a Apple y get un reembolso. No hay una forma obvia de que los reembolsos se informen a mi aplicación. ¿Están simplemente fuera de la list de productos que recibo durante una operación de "restauración"? ¿Hay algún tipo de transacción no documentada que se muestre asincrónicamente en mi SKPaymentTransactionObserver cuando ocurra un reembolso?

En este momento estoy operando en la suposition de que necesito eliminar las transactions IAP del usuario antes de hacer una restauración, y que todo lo reembolsado no estará en la list de transactions restauradas. ¿Esta es la manera correcta de hacerlo? ¿Hay alguna forma de probar esto en el arenero?

¿Alguien ha visto reembolsos en un entorno de producción y puede explicar cómo funcionan?

La guía de compras en la aplicación analiza el concepto de "cancelación" de las suscripciones. Este es el único lugar que he visto discutir sobre el tema.

Más detalles sobre el campo de date de cancelación también se pueden encontrar en la documentation de validation de recibos de App Store.

cancellation_date 

Después de decodificar un recibo, puede get la date de cancelación que le indicará lo siguiente:

Para una transacción que fue cancelada por el service de atención al cliente de Apple, la date y hora de la cancelación.

Se dan reembolsos, pero su aplicación no recibe ninguna notificación de ellos. Ya sea que se trate de una compra en la aplicación, una descarga de la aplicación o cualquier otro contenido de iTunes, el usuario aún puede usar el contenido incluso si ha solicitado un reembolso.

La estrategia es:

  1. Guarde el campo latest_receipt ("MIIUJgYJKoZIhvc …" base64) en su DB, asociado a la count de usuario.

  2. Todos los días consulta a Apple para validar todos los recibos, enviándoles el recibo base64 del campo guardado latest_receipt .

  3. En el recibo, verifica si hay un campo cancellation_date . Si lo encuentra, trátelo de acuerdo con la documentation :

Trate un recibo cancelado igual que si no se hubiera realizado ninguna compra.

De la misma manera que también verifica las renovaciones de suscripciones (verifique el campo expires_date_ms ).