{"id":137950,"date":"2021-08-26T00:00:00","date_gmt":"2021-08-26T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/pt-ios-in-app-purchases-part-4-server-side-purchase-validation\/"},"modified":"2021-08-26T00:00:00","modified_gmt":"2021-08-26T00:00:00","slug":"ios-in-app-purchases-part-4-server-side-purchase-validation","status":"publish","type":"post","link":"https:\/\/adapty.io\/pt\/blog\/ios-in-app-purchases-part-4-server-side-purchase-validation\/","title":{"rendered":"Compras no aplicativo para iOS, parte 4: valida\u00e7\u00e3o de compra do lado do servidor"},"content":{"rendered":"\n

O que \u00e9 valida\u00e7\u00e3o de compra no servidor?<\/h2>\n\n\n\n

Valida\u00e7\u00e3o no servidor (valida\u00e7\u00e3o do recibo do lado do servidor (server-side)<\/a>) \u00e9 uma forma de verificar a autenticidade da compra. Ao contr\u00e1rio da valida\u00e7\u00e3o baseada no dispositivo, a valida\u00e7\u00e3o no servidor ocorre – aguarde – no lado do servidor. A valida\u00e7\u00e3o significa que o dispositivo ou o servidor faz uma solicita\u00e7\u00e3o aos servidores da Apple para descobrir se a compra realmente ocorreu e se \u00e9 v\u00e1lida.<\/p>\n\n\n\n\n\n

Por que validar as compras?<\/h2>\n\n\n\n

Deve-se salientar que a valida\u00e7\u00e3o no servidor n\u00e3o \u00e9 obrigat\u00f3ria \u2014 as compras no aplicativo ainda ser\u00e3o realizadas sem ela. No entanto, ela confere algumas vantagens:<\/p>\n\n\n\n

    \n
  1. Fazer o analytics avan\u00e7ado do pagamento, <\/strong>o que \u00e9 particularmente importante no caso de assinaturas, uma vez que tudo o que acontece ap\u00f3s a ativa\u00e7\u00e3o n\u00e3o \u00e9 processado pelo dispositivo. Sem o processamento da compra no servidor, n\u00e3o \u00e9 poss\u00edvel recuperar o status atual da assinatura e saber se o usu\u00e1rio renovou ou cancelou a assinatura, se ocorreu algum problema de cobran\u00e7a, e assim por diante.<\/li>\n\n\n\n
  2. Verificar a autenticidade da compra. <\/strong>Voc\u00ea se certificar\u00e1 de que a transa\u00e7\u00e3o n\u00e3o \u00e9 fraudulenta, e que o usu\u00e1rio realmente pagou pelo produto.<\/li>\n\n\n\n
  3. Cruzar assinaturas em diferentes plataformas. <\/strong>Caso seja poss\u00edvel verificar o status da assinatura do usu\u00e1rio em tempo real, \u00e9 poss\u00edvel sincroniz\u00e1-la com outras plataformas. Por exemplo, o usu\u00e1rio que adquiriu a assinatura em um dispositivo iOS poder\u00e1 utiliz\u00e1-la no Android, na Web e em outras plataformas. <\/li>\n\n\n\n
  4. Conseguir controlar o acesso ao conte\u00fado do lado do servidor<\/strong>, o que o protege dos usu\u00e1rios que tentam acessar os dados sem assinatura, simplesmente fazendo solicita\u00e7\u00f5es ao servidor. <\/li>\n<\/ol>\n\n\n\n

    Segundo nossa experi\u00eancia, a primeira vantagem, por si s\u00f3, j\u00e1 \u00e9 suficiente para configurar o processamento de compras no servidor.<\/p>\n\n\n\n

    Valida\u00e7\u00e3o de compra<\/h2>\n\n\n\n

    Em geral, o processo de valida\u00e7\u00e3o de recibos no iOS \u00e9 assim:<\/p>\n\n\n\n

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

    Como gerar o segredo compartilhado<\/h3>\n\n\n\n

    Para enviar um pedido de valida\u00e7\u00e3o de pagamento, \u00e9 necess\u00e1rio incluir o segredo compartilhado para autorizar o pedido. Voc\u00ea pode gerar um segredo no App Store Connect. <\/p>\n\n\n\n

    O segredo compartilhado pode ser criado para um aplicativo espec\u00edfico (segredo espec\u00edfico do aplicativo) ou para todos os aplicativos da conta (segredo prim\u00e1rio).<\/p>\n\n\n\n

    Para gerar um segredo espec\u00edfico para o aplicativo, abra a p\u00e1gina do aplicativo na App Store Connect, acesse Compras no aplicativo \u2192 Gerenciar e clique em Segredo compartilhado espec\u00edfico para o aplicativo. Na janela que se abre, \u00e9 poss\u00edvel gerar um novo token ou copiar o token existente.<\/p>\n\n\n\n

    \"\"
    Como gerar um segredo compartilhado espec\u00edfico para o aplicativo<\/em><\/figcaption><\/figure>\n\n\n\n
    \"\"<\/figure>\n\n\n\n

    Para receber o segredo para todos os aplicativos em sua conta, abra a p\u00e1gina Usu\u00e1rios e Acesso e selecione a aba Segredo Compartilhado.<\/p>\n\n\n\n

    \"\"
    Como localizar um segredo compartilhado para todos os aplicativos<\/em><\/figcaption><\/figure>\n\n\n\n

    Como solicitar uma valida\u00e7\u00e3o de pagamento<\/h3>\n\n\n\n

    Assim que voc\u00ea receber o segredo compartilhado, pode-se enviar os recibos para serem validados nos servidores da Apple. Para isso, \u00e9 necess\u00e1rio fazer uma solicita\u00e7\u00e3o verifyReceipt<\/a>. Voc\u00ea deve enviar uma solicita\u00e7\u00e3o POST para https:\/\/buy.itunes.apple.com\/verifyReceipt<\/a>. No corpo do JSON do pedido, digite o segredo compartilhado no campo. password<\/em> e o recibo no campo receipt-data<\/em>. Tamb\u00e9m existe o par\u00e2metro opcional exclude-old-transactions <\/em>. Caso tenha o valor true<\/em> value, para cada assinatura renov\u00e1vel automaticamente, voc\u00ea receber\u00e1 apenas a \u00faltima transa\u00e7\u00e3o ao inv\u00e9s do hist\u00f3rico completo de renova\u00e7\u00e3o.<\/p>\n\n\n\n

    Veja a seguir qual \u00e9 a carga \u00fatil da solicita\u00e7\u00e3o de uma valida\u00e7\u00e3o 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

    \u00c9 importante destacar que n\u00e3o ser\u00e1 poss\u00edvel validar um recibo criado no ambiente Sandbox em um servidor de Produ\u00e7\u00e3o, e vice-versa. <\/em>\u00c9 por isso que em sistemas do mundo real, a melhor pr\u00e1tica \u00e9 direcionar a primeira solicita\u00e7\u00e3o ao servidor de Produ\u00e7\u00e3o e redirecion\u00e1-la para o servidor Sandbox caso a chave de status retorne o c\u00f3digo de erro 21007. Este comportamento \u00e9 obrigat\u00f3rio durante a revis\u00e3o do aplicativo, pois permite que os funcion\u00e1rios da Apple testem as compras e que os usu\u00e1rios reais do seu aplicativo as fa\u00e7am.<\/p>\n\n\n\n

    Entre outros erros<\/a> a serem observados, h\u00e1 o c\u00f3digo de erro 21004 <\/em>que significa que estamos usando o segredo errado. \u00c9 importante rastrear, j\u00e1 que isso tem um impacto n\u00e3o s\u00f3 na experi\u00eancia do usu\u00e1rio mas tamb\u00e9m na precis\u00e3o do processo de analytics. Na pior das hip\u00f3teses, o aplicativo pode ser removido da App Store caso o usu\u00e1rio n\u00e3o tenha acesso aos recursos premium depois de pagar por eles.<\/p>\n\n\n\n

    Caso a valida\u00e7\u00e3o tenha sido realizada com sucesso (status<\/em>=0), a resposta deve conter os detalhes das transa\u00e7\u00f5es do usu\u00e1rio.<\/p>\n\n\n\n

    Veja a seguir a resposta \u00e0 solicita\u00e7\u00e3o de valida\u00e7\u00e3o do pagamento:<\/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

    Como recuperar o status da assinatura e o hist\u00f3rico de transa\u00e7\u00f5es<\/h3>\n\n\n\n

    Para verificar se o usu\u00e1rio tem acesso aos recursos premium<\/em> do aplicativo, voc\u00ea precisa definir uma maneira de determinar o status da assinatura. N\u00e3o h\u00e1 nenhuma solicita\u00e7\u00e3o dedicada para recuperar o status da assinatura na vers\u00e3o atual da API, portanto, voc\u00ea deve trabalhar com o hist\u00f3rico de transa\u00e7\u00f5es em qualquer caso.<\/p>\n\n\n\n

    Por padr\u00e3o, a matriz latest_receipt_info<\/em><\/a> cont\u00e9m todas as transa\u00e7\u00f5es de compra de um usu\u00e1rio espec\u00edfico, exceto aquelas para produtos consum\u00edveis que s\u00e3o conclu\u00eddas no lado do aplicativo. Desta forma, \u00e9 poss\u00edvel recuperar todo o hist\u00f3rico de compras do usu\u00e1rio. Este procedimento \u00e9 bastante \u00fatil para o processo de analytics e para determinar o status atual da assinatura. <\/p>\n\n\n\n

    Ao que parece, sempre as transa\u00e7\u00f5es mais recentes s\u00e3o classificadas em primeiro lugar. De qualquer modo, recomendo que voc\u00ea fa\u00e7a a implementa\u00e7\u00e3o de uma classifica\u00e7\u00e3o por data para as transa\u00e7\u00f5es. <\/p>\n\n\n\n

    A carga \u00fatil da transa\u00e7\u00e3o:<\/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 verificar o atual status da assinatura, basta acessar a \u00faltima transa\u00e7\u00e3o da cadeia e analisar a propriedade expires_date<\/em>. Uma exce\u00e7\u00e3o importante seria o per\u00edodo de car\u00eancia, que discutiremos posteriormente.<\/p>\n\n\n\n

    Em termos anal\u00edticos, recomendo ter em mente as seguintes propriedades:<\/p>\n\n\n\n

    A resposta \u00e9 bastante complicada e foi simplificada na nova vers\u00e3o API do servidor da App Store<\/a>, mas a implementa\u00e7\u00e3o atual n\u00e3o \u00e9 t\u00e3o dif\u00edcil de se obter.<\/p>\n\n\n\n\n\n

    Caso voc\u00ea esteja trabalhando no ambiente Sandbox – ou seja, esteja testando as compras, envie solicita\u00e7\u00f5es de valida\u00e7\u00e3o para https:\/\/sandbox.itunes.apple.com\/verifyReceipt<\/a>. O segredo compartilhado, assim como a carga \u00fatil e os formatos de resposta permanecem os mesmos. <\/p>\n\n\n\n