{"id":137928,"date":"2021-08-26T00:00:00","date_gmt":"2021-08-26T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/es-ios-in-app-purchases-part-4-server-side-purchase-validation\/"},"modified":"2025-06-26T13:05:08","modified_gmt":"2025-06-26T13:05:08","slug":"ios-in-app-purchases-part-4-server-side-purchase-validation","status":"publish","type":"post","link":"https:\/\/adapty.io\/es\/blog\/ios-in-app-purchases-part-4-server-side-purchase-validation\/","title":{"rendered":"Las compras dentro de la aplicaci\u00f3n de iOS, parte 4: validaci\u00f3n de las compras del lado del servidor"},"content":{"rendered":"\n

\u00bfQu\u00e9 es la validaci\u00f3n de compra del servidor?<\/h2>\n\n\n\n

La validaci\u00f3n del servidor (validaci\u00f3n del recibo (receipt validation) del lado del servidor<\/a>) es una forma de verificar la autenticidad de la compra. A diferencia de la validaci\u00f3n basada en el dispositivo, la validaci\u00f3n del servidor se produce -espera- en el lado del servidor. La validaci\u00f3n significa que el dispositivo o el servidor hacen una solicitud a los servidores de Apple para averiguar si la compra se ha producido realmente y si ha sido v\u00e1lida.<\/p>\n\n\n\n\n\n

\u00bfPor qu\u00e9 validar las compras?<\/h2>\n\n\n\n

Hay que tener en cuenta que la validaci\u00f3n del servidor no es obligatoria: las compras dentro de la aplicaci\u00f3n seguir\u00e1n funcionando sin ella. Sin embargo, tiene algunas ventajas:<\/p>\n\n\n\n

    \n
  1. An\u00e1lisis de pagos adelantados, <\/strong>lo que es especialmente importante para las suscripciones, ya que todo lo que ocurre despu\u00e9s de la activaci\u00f3n no es procesado por el dispositivo. Si no hay procesamiento de compras en el servidor, no podr\u00e1s recuperar el estado actual de la suscripci\u00f3n y saber si el usuario ha renovado la suscripci\u00f3n o la ha cancelado, si hay problemas de facturaci\u00f3n, etc.<\/li>\n\n\n\n
  2. Poder verificar la autenticidad de la compra. <\/strong>Estar\u00e1s seguro de que la transacci\u00f3n no es fraudulenta, y que el usuario ha pagado realmente por tu producto.<\/li>\n\n\n\n
  3. Suscripciones multiplataforma. <\/strong>Al poder comprobar el estado de la suscripci\u00f3n del usuario en tiempo real, podr\u00e1s sincronizarlo con otras plataformas. Por ejemplo, el usuario que compr\u00f3 la suscripci\u00f3n desde un dispositivo iOS podr\u00e1 utilizarla en Android, en la Web y en otras plataformas. <\/li>\n\n\n\n
  4. Podr\u00e1s controlar el acceso al contenido desde el lado del servidor<\/strong>, lo que te proteger\u00e1 de los usuarios que intenten acceder a los datos sin estar suscritos, simplemente ejecutando solicitudes al servidor. <\/li>\n<\/ol>\n\n\n\n

    Seg\u00fan nuestra experiencia, la primera ventaja es suficiente para establecer el proceso de compra del servidor.<\/p>\n\n\n\n

    Validaci\u00f3n de compra<\/h2>\n\n\n\n

    En general, el proceso de validaci\u00f3n del recibo en iOS tiene el siguiente aspecto:<\/p>\n\n\n\n

    \"\"<\/figure>\n\n\n\n

    Generar el secreto compartido (shared secret)<\/h3>\n\n\n\n

    Para enviar una solicitud de validaci\u00f3n de pago, tienes que incluir el secreto compartido para autorizar la solicitud. Puedes generar uno en App Store Connect. <\/p>\n\n\n\n

    El secreto compartido puede crearse para una aplicaci\u00f3n espec\u00edfica (secreto espec\u00edfico de la aplicaci\u00f3n) o para todas las aplicaciones de la cuenta (secreto principal).<\/p>\n\n\n\n

    Para generar un secreto espec\u00edfico para la aplicaci\u00f3n, abre la p\u00e1gina de la aplicaci\u00f3n en App Store Connect, ve a Compras dentro de la aplicaci\u00f3n \u2192 Manage y haz clic en App-Specific Shared Secret. En la ventana que se abre, podr\u00e1s generar un nuevo token o copiar el existente.<\/p>\n\n\n\n

    \"\"
    Generar un secreto compartido espec\u00edfico de la aplicaci\u00f3n<\/em><\/figcaption><\/figure>\n\n\n\n
    \"\"<\/figure>\n\n\n\n

    Para recibir el secreto de todas las aplicaciones de tu cuenta, abre la p\u00e1gina Users y Access y selecciona la pesta\u00f1a Shared Secret.<\/p>\n\n\n\n

    \"\"
    C\u00f3mo encontrar un secreto compartido para todas las aplicaciones<\/em><\/figcaption><\/figure>\n\n\n\n

    Solicitar la validaci\u00f3n del pago<\/h3>\n\n\n\n

    Una vez que recibas el secreto compartido, puedes enviar los recibos para que sean validados en los servidores de Apple. Esto se realiza a trav\u00e9s de la solicitud verifyReceipt<\/a>. Tienes que enviar una solicitud POST a https:\/\/buy.itunes.apple.com\/verifyReceipt.<\/a> En el cuerpo JSON de la solicitud, pasa el secreto compartido en el campo password<\/em>y el recibo en el campo receipt-data<\/em>. Tambi\u00e9n est\u00e1 el par\u00e1metro opcional exclude-old-transactions<\/em>. Si tiene el valor true<\/em>, entonces para cada suscripci\u00f3n autorrenovable, recibir\u00e1s s\u00f3lo la \u00faltima transacci\u00f3n en lugar del historial completo de renovaciones.<\/p>\n\n\n\n

    Aqu\u00ed est\u00e1 la carga \u00fatil de la solicitud de validaci\u00f3n de compra:<\/p>\n\n\n\n

    <\/path><\/path><\/svg><\/span>
    {<\/span><\/span>\n  <\/span>"<\/span>password<\/span>"<\/span>:<\/span> <\/span>"<\/span>f4d35830e3...52aae<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>receipt-data<\/span>"<\/span>:<\/span> <\/span>"<\/span>MIIUVQY...4rVpL8NlYh2\/8l7rk0BcStXjQ==<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>exclude-old-transactions<\/span>"<\/span>:<\/span> <\/span>false<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

    Es importante tener en cuenta que no podr\u00e1s validar un recibo creado en el entorno Sandbox en un servidor de Producci\u00f3n, y vicerversa.<\/em> Por eso, en los sistemas del mundo real, la mejor pr\u00e1ctica es dirigir la primera solicitud al servidor de Producci\u00f3n y redirigirla al servidor Sandbox en caso de que la clave de estado devuelva el c\u00f3digo de error 21007. Este comportamiento es imprescindible durante la revisi\u00f3n de la aplicaci\u00f3n, ya que permite que los empleados de Apple prueben las compras y que los usuarios reales de tu aplicaci\u00f3n las realicen.<\/p>\n\n\n\n

    Entre otros errores <\/a>a tener en cuenta, est\u00e1 el c\u00f3digo de error 21004 <\/em>que significa que estamos utilizando un secreto incorrecto. Es importante tenerlo en cuenta, ya que tiene un impacto tanto en la experiencia del usuario como en la precisi\u00f3n de los an\u00e1lisis. En el peor de los casos, la aplicaci\u00f3n puede ser eliminada de la App Store si el usuario nunca tiene acceso a las funciones premium despu\u00e9s de haber pagado por ellas.<\/p>\n\n\n\n

    Si la validaci\u00f3n fue exitosa (estado<\/em>=0), la respuesta contendr\u00e1 los detalles de las transacciones del usuario.<\/p>\n\n\n\n

    Aqu\u00ed est\u00e1 la respuesta de la solicitud de validaci\u00f3n del pago:<\/p>\n\n\n\n

    <\/path><\/path><\/svg><\/span>
    {<\/span><\/span>\n  <\/span>"<\/span>environment<\/span>"<\/span>:<\/span> <\/span>"<\/span>Production<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>receipt<\/span>"<\/span>:<\/span> <\/span>{<\/span><\/span>\n    <\/span>"<\/span>receipt_type<\/span>"<\/span>:<\/span> <\/span>"<\/span>Production<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>adam_id<\/span>"<\/span>:<\/span> <\/span>123<\/span>,<\/span><\/span>\n    <\/span>"<\/span>app_item_id<\/span>"<\/span>:<\/span> <\/span>123<\/span>,<\/span><\/span>\n    <\/span>"<\/span>bundle_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>com.adapty.sample_app<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>application_version<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>download_id<\/span>"<\/span>:<\/span> <\/span>123<\/span>,<\/span><\/span>\n    <\/span>"<\/span>version_external_identifier<\/span>"<\/span>:<\/span> <\/span>123<\/span>,<\/span><\/span>\n    <\/span>"<\/span>receipt_creation_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:42:01 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>receipt_creation_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638921000<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>receipt_creation_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:42:01 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>request_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-09 18:26:02 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>request_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1628533562696<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>request_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-09 11:26:02 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>original_purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2017-04-09 21:18:41 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>original_purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1491772721000<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>original_purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2017-04-09 14:18:41 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>original_application_version<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n    <\/span>"<\/span>in_app<\/span>"<\/span>:<\/span> <\/span>[<\/span><\/span>\n      <\/span>{<\/span><\/span>\n        <\/span>"<\/span>quantity<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>original_transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>original_purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>original_purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>original_purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>expires_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-05-05 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>expires_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1620243718000<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>expires_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-05-05 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>web_order_line_item_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230000397200750<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>is_trial_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>true<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>is_in_intro_offer_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n        <\/span>"<\/span>in_app_ownership_type<\/span>"<\/span>:<\/span> <\/span>"<\/span>PURCHASED<\/span>"<\/span><\/span>\n      <\/span>}<\/span><\/span>\n    <\/span>]<\/span><\/span>\n  <\/span>},<\/span><\/span>\n  <\/span>"<\/span>latest_receipt_info<\/span>"<\/span>:<\/span> <\/span>[<\/span><\/span>\n    <\/span>{<\/span><\/span>\n      <\/span>"<\/span>quantity<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230001020690335<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-04 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1628106118000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-04 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-11 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1628710918000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-11 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>web_order_line_item_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230000438372383<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>is_trial_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>is_in_intro_offer_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>in_app_ownership_type<\/span>"<\/span>:<\/span> <\/span>"<\/span>PURCHASED<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>subscription_group_identifier<\/span>"<\/span>:<\/span> <\/span>"<\/span>272394410<\/span>"<\/span><\/span>\n    <\/span>},<\/span><\/span>\n    <\/span>{<\/span><\/span>\n      <\/span>"<\/span>quantity<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230001017218955<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-07-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1627501318000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-07-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-04 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1628106118000<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>expires_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-08-04 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>web_order_line_item_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230000849023623<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>is_trial_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>is_in_intro_offer_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>in_app_ownership_type<\/span>"<\/span>:<\/span> <\/span>"<\/span>PURCHASED<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>subscription_group_identifier<\/span>"<\/span>:<\/span> <\/span>"<\/span>272394410<\/span>"<\/span><\/span>\n    <\/span>}<\/span><\/span>\n  <\/span>],<\/span><\/span>\n  <\/span>"<\/span>latest_receipt<\/span>"<\/span>:<\/span> <\/span>"<\/span>MIIUVQY...4rVpL8NlYh2\/8l7rk0BcStXjQ==<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>pending_renewal_info<\/span>"<\/span>:<\/span> <\/span>[<\/span><\/span>\n    <\/span>{<\/span><\/span>\n      <\/span>"<\/span>auto_renew_product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>original_transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n      <\/span>"<\/span>auto_renew_status<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span><\/span>\n    <\/span>}<\/span><\/span>\n  <\/span>],<\/span><\/span>\n  <\/span>"<\/span>status<\/span>"<\/span>:<\/span> <\/span>0<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

    Recuperar el estado de la suscripci\u00f3n y el historial de transacciones<\/strong><\/p>\n\n\n\n

    Para saber si el usuario tiene acceso a las funciones premium de la aplicaci\u00f3n, necesitas una forma de determinar su estado de suscripci\u00f3n. En la versi\u00f3n actual de la API no hay una petici\u00f3n espec\u00edfica para recuperar el estado de la suscripci\u00f3n, as\u00ed que tendr\u00e1s que trabajar con el historial de transacciones en cualquier caso.<\/p>\n\n\n\n

    El conjunto latest_receipt_info<\/em><\/a>, por defecto, contiene todas las transacciones de compras dentro de la aplicaci\u00f3n de un usuario concreto, excepto los productos consumibles que se completan en el lado de la aplicaci\u00f3n. De este modo, puedes recuperar todo el historial de compras del usuario. Esto es bastante \u00fatil tanto para los an\u00e1lisis como para determinar el estado actual de la suscripci\u00f3n. <\/p>\n\n\n\n

    Al parecer, las transacciones siempre vienen primero ordenadas como las m\u00e1s nuevas. Sin embargo, para estar seguro, sigo recomendando que implementes tu propio ordenamiento por fecha para las transacciones. <\/p>\n\n\n\n

    La carga \u00fatil de la transacci\u00f3n:<\/p>\n\n\n\n

    <\/path><\/path><\/svg><\/span>
    {<\/span><\/span>\n  <\/span>"<\/span>quantity<\/span>"<\/span>:<\/span> <\/span>"<\/span>1<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>product_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>basic_subscription_1_month<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>original_transaction_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>1000000831360853<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>original_purchase_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>original_purchase_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1619638918000<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>original_purchase_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-04-28 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>expires_date<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-05-05 19:41:58 Etc\/GMT<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>expires_date_ms<\/span>"<\/span>:<\/span> <\/span>"<\/span>1620243718000<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>expires_date_pst<\/span>"<\/span>:<\/span> <\/span>"<\/span>2021-05-05 12:41:58 America\/Los_Angeles<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>web_order_line_item_id<\/span>"<\/span>:<\/span> <\/span>"<\/span>230000397200750<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>is_trial_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>true<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>is_in_intro_offer_period<\/span>"<\/span>:<\/span> <\/span>"<\/span>false<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>in_app_ownership_type<\/span>"<\/span>:<\/span> <\/span>"<\/span>PURCHASED<\/span>"<\/span>,<\/span><\/span>\n  <\/span>"<\/span>subscription_group_identifier<\/span>"<\/span>:<\/span> <\/span>"<\/span>272394410<\/span>"<\/span><\/span>\n}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n

    Para comprobar el estado actual de la suscripci\u00f3n, basta con recuperar la \u00faltima transacci\u00f3n de la cadena y ver la propiedad expires_date<\/em>. La excepci\u00f3n ser\u00eda el periodo de gracia, del que hablaremos un poco m\u00e1s adelante.<\/p>\n\n\n\n

    Para fines anal\u00edticos, recomiendo guardar las siguientes propiedades:<\/p>\n\n\n\n

    La respuesta es bastante engorrosa y se ha simplificado en la nueva versi\u00f3n de la API del servidor de App Store<\/a>, pero la implementaci\u00f3n actual no es tan dif\u00edcil de conseguir.<\/p>\n\n\n\n\n\n

    Si est\u00e1s trabajando en un entorno Sandbox, es decir, est\u00e1s probando las compras, env\u00eda solicitudes de validaci\u00f3n a https:\/\/sandbox.itunes.apple.com\/verifyReceipt<\/a>. El secreto compartido, as\u00ed como la carga \u00fatil y los formatos de respuesta siguen siendo los mismos. <\/p>\n\n\n\n