{"id":137861,"date":"2021-08-26T00:00:00","date_gmt":"2021-08-26T00:00:00","guid":{"rendered":"https:\/\/adapty.io\/fr-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\/fr\/blog\/ios-in-app-purchases-part-4-server-side-purchase-validation\/","title":{"rendered":"Achats int\u00e9gr\u00e9s sous iOS, partie 4 : validation des achats c\u00f4t\u00e9 serveur"},"content":{"rendered":"\n

Qu’est-ce que la validation d’achat par le serveur ?<\/h2>\n\n\n\n

La validation par le serveur  (validation du re\u00e7u (receipt validation) c\u00f4t\u00e9 serveur<\/a>) est un moyen de v\u00e9rifier l’authenticit\u00e9 de l’achat. Contrairement \u00e0 la validation bas\u00e9e sur le dispositif, la validation du serveur se produit – attendez – du c\u00f4t\u00e9 du serveur. La validation signifie que l’appareil ou le serveur fait une requ\u00eate aux serveurs d’Apple pour savoir si l’achat a r\u00e9ellement eu lieu et s’il \u00e9tait valide.<\/p>\n\n\n\n\n\n

Pourquoi valider les achats ?<\/h2>\n\n\n\n

Il convient de noter que la validation du serveur n’est pas obligatoire – les achats int\u00e9gr\u00e9s fonctionneront toujours sans elle. Il pr\u00e9sente cependant quelques avantages :<\/p>\n\n\n\n

    \n
  1. Analyse avanc\u00e9e des paiements,<\/strong> ce qui est particuli\u00e8rement important pour les abonnements puisque tout ce qui se passe apr\u00e8s l’activation n’est pas trait\u00e9 par le dispositif. Sans traitement des achats sur le serveur, vous ne pourrez pas r\u00e9cup\u00e9rer l’\u00e9tat actuel de l’abonnement et savoir si l’utilisateur a renouvel\u00e9 ou annul\u00e9 l’abonnement, s’il y a des probl\u00e8mes de facturation, etc.<\/li>\n\n\n\n
  2. Pouvoir v\u00e9rifier l’authenticit\u00e9 de l’achat. <\/strong>Vous aurez la certitude que la transaction n’est pas frauduleuse et que l’utilisateur a r\u00e9ellement pay\u00e9 votre produit.<\/li>\n\n\n\n
  3. Abonnements multi-plateformes. <\/strong>Si vous pouvez v\u00e9rifier l’\u00e9tat de l’abonnement de l’utilisateur en temps r\u00e9el, vous pouvez le synchroniser avec d’autres plateformes. Par exemple, l’utilisateur qui a achet\u00e9 l’abonnement \u00e0 partir d’un appareil iOS pourra l’utiliser sur Android, le Web et d’autres plateformes. <\/li>\n\n\n\n
  4. La possibilit\u00e9 de contr\u00f4ler l’acc\u00e8s au contenu du c\u00f4t\u00e9 du serveur,<\/strong> ce qui vous prot\u00e8ge des utilisateurs qui tentent d’acc\u00e9der aux donn\u00e9es sans abonnement en ex\u00e9cutant simplement des requ\u00eates au serveur. <\/li>\n<\/ol>\n\n\n\n

    D’apr\u00e8s notre exp\u00e9rience, le premier avantage suffit \u00e0 lui seul \u00e0 mettre en place le traitement des achats par serveur.<\/p>\n\n\n\n

    Validation des achats<\/h2>\n\n\n\n

    En g\u00e9n\u00e9ral, le processus de validation des re\u00e7us sous iOS ressemble \u00e0 ceci :<\/p>\n\n\n\n

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

    G\u00e9n\u00e9ration du secret partag\u00e9 (shared secret)<\/h3>\n\n\n\n

    Pour envoyer une demande de validation de paiement, vous devez inclure le secret partag\u00e9 pour autoriser la demande. Vous pouvez en g\u00e9n\u00e9rer un dans App Store Connect. <\/p>\n\n\n\n

    Le secret partag\u00e9 peut \u00eatre cr\u00e9\u00e9 pour une application sp\u00e9cifique (secret sp\u00e9cifique \u00e0 l’application) ou pour toutes les applications du compte (secret principal).<\/p>\n\n\n\n

    Pour g\u00e9n\u00e9rer un secret sp\u00e9cifique \u00e0 l’application, ouvrez la page de l’application dans App Store Connect, allez dans Achats int\u00e9gr\u00e9s \u2192 G\u00e9rer et cliquez sur Secret partag\u00e9 sp\u00e9cifique \u00e0 l’application. Dans la fen\u00eatre qui s’ouvre, vous pourrez g\u00e9n\u00e9rer un nouveau jeton ou copier le jeton existant.<\/p>\n\n\n\n

    \"\"
    G\u00e9n\u00e9ration d’un secret partag\u00e9 sp\u00e9cifique \u00e0 l’application.<\/em><\/figcaption><\/figure>\n\n\n\n
    \"\"<\/figure>\n\n\n\n

    Pour recevoir le secret pour toutes les applications de votre compte, ouvrez la page Users and Access et s\u00e9lectionnez l’onglet Secret partag\u00e9.<\/p>\n\n\n\n

    \"\"
    Comment trouver un secret partag\u00e9 pour toutes les applications ?<\/em><\/figcaption><\/figure>\n\n\n\n

    Demande de validation de paiement<\/h3>\n\n\n\n

    Une fois que vous avez re\u00e7u le secret partag\u00e9, vous pouvez envoyer des re\u00e7us pour les faire valider sur les serveurs  d\u2019Apple. Cela se fait par le biais de la requ\u00eate verifyReceipt<\/a>. Vous devez envoyer une requ\u00eate POST \u00e0 https:\/\/buy.itunes.apple.com\/verifyReceipt<\/a>. Dans le  corps de requ\u00eate JSON, transmettez le secret partag\u00e9 dans le champ password<\/em> et le re\u00e7u dans le champ receipt-data<\/em>. Il y a aussi le param\u00e8tre optionnel exclude-old-transactions<\/em>. S’il s’agit de la valeur r\u00e9elle, alors pour chaque abonnement auto-renouvelable, vous recevrez uniquement la derni\u00e8re transaction en lieu et place de l’historique complet des renouvellements.<\/p>\n\n\n\n

    Voici la charge utile de la demande de validation d’achat :<\/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

    C’est pourquoi, dans les syst\u00e8mes r\u00e9els, la meilleure pratique consiste \u00e0 diriger la premi\u00e8re requ\u00eate vers le serveur de Production et \u00e0 la rediriger vers le serveur Sandbox au cas o\u00f9 la cl\u00e9 d’\u00e9tat renvoie le code d’erreur 21007. <\/em>C’est pourquoi, dans les syst\u00e8mes r\u00e9els, la meilleure pratique consiste \u00e0 diriger la premi\u00e8re requ\u00eate vers le serveur de Production et \u00e0 la rediriger vers le serveur Sandbox au cas o\u00f9 la cl\u00e9 d’\u00e9tat renvoie le code d’erreur 21007. Ce comportement est indispensable lors de la r\u00e9vision de l’application, car il permet aux employ\u00e9s d’Apple de tester les achats tout en permettant aux utilisateurs r\u00e9els de votre application de les effectuer.<\/p>\n\n\n\n

    Parmi les autres erreurs<\/a> \u00e0 mentionner, il y a le code d’erreur 21004 qui signifie que l’on utilise le mauvais secret. Il est important d’en assurer le suivi, car il a un impact \u00e0 la fois sur l’exp\u00e9rience des utilisateurs et sur la pr\u00e9cision des analyses. Dans le pire des cas, l’application peut \u00eatre retir\u00e9e de l’App Store si l’utilisateur n’a jamais acc\u00e8s aux fonctionnalit\u00e9s premium apr\u00e8s avoir pay\u00e9 pour celles-ci.<\/p>\n\n\n\n

    Si la validation a r\u00e9ussi (statut=0), la r\u00e9ponse contiendra le d\u00e9tail des transactions de l’utilisateur.<\/p>\n\n\n\n

    Voici la r\u00e9ponse \u00e0 la demande de validation du paiement :<\/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

    R\u00e9cup\u00e9ration de l’\u00e9tat de l’abonnement et de l’historique des transactions<\/h3>\n\n\n\n

    Pour savoir si l’utilisateur a acc\u00e8s aux fonctionnalit\u00e9s premium de l’application, vous devez pouvoir d\u00e9terminer le statut de son abonnement. La version actuelle de l’API ne comporte pas de requ\u00eate d\u00e9di\u00e9e \u00e0 la r\u00e9cup\u00e9ration de l’\u00e9tat de l’abonnement. Vous devrez donc travailler avec l’historique des transactions dans tous les cas.<\/p>\n\n\n\n

    Le tableau latest_receipt_info<\/em><\/a> contient, par d\u00e9faut, toutes les transactions d’achat int\u00e9gr\u00e9es \u00e0 l’application d’un utilisateur particulier, \u00e0 l’exception des produits consommables qui sont effectu\u00e9s du c\u00f4t\u00e9 de l’application. De cette fa\u00e7on, vous pouvez retrouver l’historique complet des achats de l’utilisateur. C’est tr\u00e8s utile \u00e0 la fois pour l’analyse et pour d\u00e9terminer l’\u00e9tat actuel de l’abonnement. <\/p>\n\n\n\n

    Il semble que les transactions arrivent toujours d\u00e9j\u00e0 tri\u00e9es en premier. Pour \u00eatre s\u00fbr, cependant, je recommande toujours d’impl\u00e9menter votre propre tri par date pour les transactions. <\/p>\n\n\n\n

    La charge utile de la transaction :<\/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

    Pour v\u00e9rifier l’\u00e9tat actuel de l’abonnement, il suffit de r\u00e9cup\u00e9rer la derni\u00e8re transaction de la cha\u00eene et de regarder la propri\u00e9t\u00e9 expires_date. L’exception \u00e0 cette r\u00e8gle est le d\u00e9lai de gr\u00e2ce, dont nous parlerons un peu plus tard.<\/p>\n\n\n\n

    \u00c0 des fins d’analyse, je recommande de sauvegarder les propri\u00e9t\u00e9s suivantes :<\/p>\n\n\n\n

    La r\u00e9ponse est assez lourde et a \u00e9t\u00e9 simplifi\u00e9e dans la nouvelle version de App Store Server API<\/a> mais l’impl\u00e9mentation actuelle n’est pas si difficile \u00e0 ma\u00eetriser.<\/p>\n\n\n\n\n\n

    Si vous travaillez dans un environnement Sandbox – c’est-\u00e0-dire que vous testez des achats -, envoyez des demandes de validation \u00e0 https:\/\/sandbox.itunes.apple.com\/verifyReceipt<\/a>. Le secret partag\u00e9, ainsi que les formats de la charge utile et de la r\u00e9ponse restent les m\u00eames. <\/p>\n\n\n\n