{"id":137906,"date":"2021-08-26T00:00:00","date_gmt":"2021-08-26T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/pl-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\/pl\/blog\/ios-in-app-purchases-part-4-server-side-purchase-validation\/","title":{"rendered":"Zakupy w aplikacji na iOS, cz\u0119\u015b\u0107 4: walidacja zakup\u00f3w po stronie serwera"},"content":{"rendered":"\n

Co to jest walidacja zakupu na serwerze?<\/h2>\n\n\n\n

Walidacja serwerowa (walidacja zakup\u00f3w po stronie serwera<\/a> – server-side receipt validation) jest sposobem weryfikacji autentyczno\u015bci zakupu. W przeciwie\u0144stwie do walidacji opartej na urz\u0105dzeniach, walidacja serwerowa odbywa si\u0119 po stronie serwera (niespodzianka, nieprawda\u017c?). Walidacja oznacza, \u017ce urz\u0105dzenie lub serwer wysy\u0142a \u017c\u0105danie do serwer\u00f3w Apple, aby dowiedzie\u0107 si\u0119, czy zakup rzeczywi\u015bcie nast\u0105pi\u0142 i czy by\u0142 poprawny.<\/p>\n\n\n\n\n\n

Dlaczego warto dokonywa\u0107 walidacji zakup\u00f3w?<\/h2>\n\n\n\n

Nale\u017cy zauwa\u017cy\u0107, \u017ce walidacja serwerowa nie jest obowi\u0105zkowa i zakupy w aplikacji b\u0119d\u0105 dzia\u0142a\u0107 tak\u017ce bez niej. Zapewnia ona jednak pewne korzy\u015bci:<\/p>\n\n\n\n

    \n
  1. Zaawansowana analityka p\u0142atno\u015bci, <\/strong>kt\u00f3ra jest szczeg\u00f3lnie wa\u017cna w przypadku subskrypcji, poniewa\u017c wszystko, co dzieje si\u0119 po aktywacji, nie jest przetwarzane przez urz\u0105dzenie. Bez przetwarzania zakupu po stronie serwera nie b\u0119dzie mo\u017cna odzyska\u0107 bie\u017c\u0105cego statusu subskrypcji i dowiedzie\u0107 si\u0119, czy u\u017cytkownik odnowi\u0142 lub anulowa\u0142 subskrypcj\u0119, czy wyst\u0119puj\u0105 problemy z op\u0142atami (billing issues), i tak dalej.<\/li>\n\n\n\n
  2. Mo\u017cliwo\u015b\u0107 weryfikacji autentyczno\u015bci zakupu. <\/strong>B\u0119dziesz mie\u0107 pewno\u015b\u0107, \u017ce transakcja nie jest oszustwem, a u\u017cytkownik faktycznie zap\u0142aci\u0142 za tw\u00f3j produkt.<\/li>\n\n\n\n
  3. Subskrypcje mi\u0119dzy platformami. <\/strong>Je\u015bli mo\u017cesz sprawdzi\u0107 status subskrypcji u\u017cytkownika w czasie rzeczywistym, mo\u017cesz zsynchronizowa\u0107 j\u0105 z innymi platformami. Na przyk\u0142ad u\u017cytkownik, kt\u00f3ry kupi\u0142 subskrypcj\u0119 z urz\u0105dzenia z systemem iOS, b\u0119dzie m\u00f3g\u0142 z niej korzysta\u0107 na Androidzie, na stronie internetowej i na innych platformach. <\/li>\n\n\n\n
  4. Mo\u017cliwo\u015b\u0107 kontrolowania dost\u0119pu do tre\u015bci od strony serwera<\/strong>, kt\u00f3ry chroni przed u\u017cytkownikami pr\u00f3buj\u0105cymi uzyska\u0107 dost\u0119p do danych bez subskrypcji, po prostu wykonuj\u0105c \u017c\u0105dania do serwera. <\/li>\n<\/ol>\n\n\n\n

    M\u00f3wi\u0105c z naszego do\u015bwiadczenia, pierwsza zaleta wystarczy, aby skonfigurowa\u0107 przetwarzanie zakup\u00f3w po stronie serwera.<\/p>\n\n\n\n

    Walidacja zakupu<\/h2>\n\n\n\n

    Og\u00f3lnie rzecz bior\u0105c, proces walidacji potwierdze\u0144 zakupu w systemie iOS wygl\u0105da nast\u0119puj\u0105co:<\/p>\n\n\n\n

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

    Generowanie shared secret<\/h3>\n\n\n\n

    Aby wys\u0142a\u0107 \u017c\u0105danie weryfikacji p\u0142atno\u015bci, musisz do\u0142\u0105czy\u0107 tak zwany „shared secret”, aby autoryzowa\u0107 \u017c\u0105danie. Mo\u017cesz go wygenerowa\u0107 w App Store Connect. <\/p>\n\n\n\n

    Shared secret mo\u017cna utworzy\u0107 dla okre\u015blonej aplikacji (tzw. app-specific secret) lub dla wszystkich aplikacji na koncie (primary secret).<\/p>\n\n\n\n

    Aby wygenerowa\u0107 app-specific secret, otw\u00f3rz stron\u0119 aplikacji w App Store Connect, przejd\u017a do  In-App Purchases \u2192 Manage i kliknij „App-Specific Shared Secret”. W oknie, kt\u00f3re si\u0119 otworzy, mo\u017cna b\u0119dzie wygenerowa\u0107 nowy token lub skopiowa\u0107 istniej\u0105cy.<\/p>\n\n\n\n

    \"\"
    Generowanie shared secretu specyficznego dla aplikacji<\/em><\/figcaption><\/figure>\n\n\n\n
    \"\"<\/figure>\n\n\n\n

    Aby otrzyma\u0107 secret dla wszystkich aplikacji na koncie, otw\u00f3rz stron\u0119 Users and Access page i wybierz zak\u0142adk\u0119 Shared Secret.<\/p>\n\n\n\n

    \"\"
    Jak znale\u017a\u0107 shared secret dla wszystkich aplikacji<\/em><\/figcaption><\/figure>\n\n\n\n

    \u017b\u0105danie walidacji p\u0142atno\u015bci<\/h3>\n\n\n\n

    Po otrzymaniu shared secret mo\u017cesz wysy\u0142a\u0107 potwierdzenia dla uzyskania walidacji na serwerach Apple. Odbywa si\u0119 to poprzez \u017c\u0105danie verifyReceipt<\/a>. Musisz wys\u0142a\u0107 \u017c\u0105danie POST na adres https:\/\/buy.itunes.apple.com\/verifyReceipt<\/a>. W tre\u015bci \u017c\u0105dania JSON przeka\u017c shared secret w polu password<\/em> i potwierdzenie w polu receipt-data<\/em>. Istnieje r\u00f3wnie\u017c opcjonalny parametr exclude-old-transactions<\/em>. Je\u015bli posiada on warto\u015b\u0107 true<\/em>, wtedy dla ka\u017cdej subskrypcji z automatycznym odnawianiem otrzymasz tylko ostatni\u0105 transakcj\u0119 zamiast pe\u0142nej historii odnowienia.<\/p>\n\n\n\n

    Oto jak wygl\u0105da \u017c\u0105danie o walidacj\u0119 zakupu:<\/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

    Nale\u017cy pami\u0119ta\u0107, \u017ce nie b\u0119dzie mo\u017cna zweryfikowa\u0107 potwierdzenia utworzonego w \u015brodowisku sandbox na serwerze produkcyjnym (Production server) i odwrotnie. <\/em>Dlatego w systemach rzeczywistych najlepsz\u0105 praktyk\u0105 jest skierowanie pierwszego \u017c\u0105dania do serwera produkcyjnego i przekierowanie go do serwera sandbox na wypadek, gdyby klucz stanu zwr\u00f3ci\u0142 kod b\u0142\u0119du 21007. Takie zachowanie jest konieczne podczas przegl\u0105dania aplikacji, poniewa\u017c pozwala pracownikom Apple testowa\u0107 zakupy, a jednocze\u015bnie umo\u017cliwia ich dokonywanie rzeczywistym u\u017cytkownikom aplikacji.<\/p>\n\n\n\n

    Mi\u0119dzy innymi b\u0142\u0119dami<\/a> warto zauwa\u017cy\u0107, \u017ce istnieje kod b\u0142\u0119du 21004 <\/em>, kt\u00f3ry oznacza u\u017cywanie niew\u0142a\u015bciwego secret. Wa\u017cne jest, aby to \u015bledzi\u0107, poniewa\u017c ma to wp\u0142yw zar\u00f3wno na do\u015bwiadczenie u\u017cytkownika, jak i dok\u0142adno\u015b\u0107 analizy. W najgorszym przypadku aplikacja mo\u017ce zosta\u0107 usuni\u0119ta ze sklepu App Store, je\u015bli u\u017cytkownik nie uzyska dost\u0119pu do funkcji premium po zap\u0142aceniu za nie.<\/p>\n\n\n\n

    Je\u015bli walidacja przebieg\u0142a pomy\u015blnie (status<\/em>= 0), odpowied\u017a b\u0119dzie zawiera\u0107 szczeg\u00f3\u0142y transakcji u\u017cytkownika.<\/p>\n\n\n\n

    Oto odpowied\u017a na \u017c\u0105danie weryfikacji p\u0142atno\u015bci:<\/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

    Pobieranie statusu subskrypcji i historii transakcji<\/h3>\n\n\n\n

    Aby dowiedzie\u0107 si\u0119, czy u\u017cytkownik ma dost\u0119p do funkcji premium w aplikacji, musisz okre\u015bli\u0107 status jego subskrypcji. W bie\u017c\u0105cej wersji interfejsu API nie ma dedykowanego \u017c\u0105dania pobierania statusu subskrypcji, wi\u0119c w ka\u017cdym przypadku musisz pracowa\u0107 z histori\u0105 transakcji.<\/p>\n\n\n\n

    Tablica latest_receipt_info<\/em><\/a> domy\u015blnie zawiera wszystkie transakcje zakupu w aplikacji danego u\u017cytkownika, z wyj\u0105tkiem produkt\u00f3w eksploatacyjnych, kt\u00f3re s\u0105 zako\u0144czone po stronie aplikacji. W ten spos\u00f3b mo\u017cesz odzyska\u0107 ca\u0142\u0105 histori\u0119 zakup\u00f3w u\u017cytkownika. Jest to bardzo przydatne zar\u00f3wno dla analityki, jak i okre\u015blania aktualnego statusu subskrypcji. <\/p>\n\n\n\n

    Wydaje si\u0119, \u017ce transakcje zawsze s\u0105 ju\u017c sortowane od najnowszych. Dla pewno\u015bci jednak nadal polecam implementacj\u0119 w\u0142asnego sortowania wed\u0142ug daty transakcji. <\/p>\n\n\n\n

    \u017b\u0105danie transakcji:<\/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

    Aby sprawdzi\u0107 aktualny status subskrypcji, wystarczy pobra\u0107 najnowsz\u0105 transakcj\u0119 \u0142a\u0144cucha i spojrze\u0107 na warto\u015b\u0107 expires_date<\/em>. Wyj\u0105tkiem od tego by\u0142by okres karencji, kt\u00f3ry om\u00f3wimy nieco p\u00f3\u017aniej.<\/p>\n\n\n\n

    Dla cel\u00f3w analitycznych zalecam zapisanie nast\u0119puj\u0105cych w\u0142a\u015bciwo\u015bci:<\/p>\n\n\n\n

    Odpowied\u017a jest do\u015b\u0107 uci\u0105\u017cliwa i zosta\u0142a uproszczona w nowej wersji API App Store Server<\/a>, ale obecna implementacja nie jest tak trudna do opanowania.<\/p>\n\n\n\n\n\n

    Je\u015bli pracujesz w \u015brodowisku sandbox (czyli testujesz zakupy), wy\u015blij pro\u015bby o walidacj\u0119 do https:\/\/sandbox.itunes.apple.com\/verifyReceipt<\/a>. Shared secret, jak r\u00f3wnie\u017c \u017c\u0105danie i formaty odpowiedzi pozostaj\u0105 takie same. <\/p>\n\n\n\n