Intro
Cet article fait suite aux articles :
https://reactor.fr/un-site-e-commerce-en-moins-dune-heure
https://reactor.fr/woocommerce-configurations-avancees
https://reactor.fr/woocommerce-configurations-avancees-partie-2/
J’ai reussi à couvrir 99% de mes besoins.
Un utilisateur peut s’acheter une licence de jeu OutQuest. Le souci, c’est qu’il doit copier une clé de licence sur mon appli.
J’aimerais un lien qui lui permette de ne pas le faire. Vu que mon app mobile est un site web, il devrait être simple de rediriger l’utilisateur vers mon site en cliquant sur cette clé de license. (ou un lien que j’aurais fait).
Sauf que ca ne se fait pas par défaut. Les concepteurs du plugins me l’ont confirmé, ce n’est pas une fonctionnalité, ça le sera peut être un jour, inchallah.
Autre besoin, même si j’ai cet email, ou que l’utilisateur saisie manuellement cette clé de licence sur mon app, comment je vérifie celle ci ?
C’est l’objet de ce post.
API Licences Manager for Woo Commerce
Donc l’idée c’est de faire une requête depuis mon app (ou depuis n’importe où finalement) vers mon site web de e-commerce qui gère ces clés de licences.
Le plugin précédément installé qui gère ces licences a justement une gestion par une API de ces clés.
Dans les réglages de WooCommerces, Onglet « Gestion de licences » en base de page, on a la possibilité de gérer individuellement chaque endpoint de l’API.
Le lien de la documentation est celui ci
https://www.licensemanager.at/documentation/rest-api/#api-keys
La première chose que l’on nous demande c’est de passer nos liens en permaliens. Dans un précédent article nous avons déjà fait cette manipulation et d’ailleurs je ne souvenais plus pourquoi je devais le faire… ba c’est pour l’API de gestion de licences.
Ensuite il nous faut générer une clé d’API que l’on utilisera dans chacune de nos requêtes. Pensez à stocker ces clés car elles ne vous seront plus accessible par la suite.
Ca y est notre API est prête !
L’API lmfwc (Licence Manager for Woo Commerce) est situé dans ce path par defaut : https://shop.outquest.fr/wp-json/lmfwc/
Si vous ne faites pas la modification des permaliens vous aurez une 404.
Ensuite il faut rajouter la route de l’api que l’on souhaite, par exemple
https://shop.outquest.fr/wp-json/lmfwc/v2/licenses/sdf
Qui demande la clé « sdf » (qui n’existe pas). J’ai cette réponse 401 Unauthorized :
{
"code": "lmfwc_rest_authentication_error",
"message": "Clé client ou secrète manquante.",
"data": {
"status": 401
}
}
J’utilise une extension Visual Studio Thunder Client (c’est comme Postman) qui me permet de faire des requêtes sur mesure.
Il faut paramétrer une authorisation « Basic » avec username = clé client et password = clé secrète. En relancant la requête on obtient ceci :
{
"code": "lmfwc_rest_data_error",
"message": "License Key: sdf could not be found.",
"data": {
"status": 404
}
}
On nous indique une 404 car la clé de licence « sdf » n’existe pas.
Essayons maintenant avec une vraie clé : https://shop.outquest.fr/wp-json/lmfwc/v2/licenses/LBL-JVP
{
"success": true,
"data": {
"id": 1,
"orderId": 40,
"productId": 29,
"userId": 1,
"licenseKey": "LBL-JVP",
"expiresAt": null,
"validFor": 0,
"source": 1,
"status": 2,
"timesActivated": null,
"timesActivatedMax": 0,
"createdAt": "2022-09-30 16:00:10",
"createdBy": 1,
"updatedAt": "2022-09-30 16:00:10",
"updatedBy": 1
}
}
Bingo on obtient nos informations de licence !
L’api lmfwc dispose de 3 autres endpoints en get :
- licenses/validate/
- licenses/activate/
- licenses/deactivate/
La première vous donne ce type de réponse :
{
"success": true,
"data": {
"timesActivated": 0,
"timesActivatedMax": 0,
"remainingActivations": 0
}
}
En faisant une requete avec licenses/activate
{
"success": true,
"data": {
"id": 1,
"orderId": 40,
"productId": 29,
"userId": 1,
"licenseKey": "LBL-JVP",
"expiresAt": null,
"validFor": 0,
"source": 1,
"status": 2,
"timesActivated": 1,
"timesActivatedMax": 0,
"createdAt": "2022-09-30 16:00:10",
"createdBy": 1,
"updatedAt": "2022-10-10 13:04:29",
"updatedBy": 1
}
}
puis en refaisant licenses/validate on obtient :
{
"success": true,
"data": {
"timesActivated": 1,
"timesActivatedMax": 0,
"remainingActivations": -1
}
}
Notez qu’on a eu +1 sur timesActivated. Cela permettra de voir si la licence est utilisé plusieurs fois et éventuellement travailler sur de l’anti fraude.
en utilisant licenses/deactivate on fait l’opération inverse.
API Woo Commerce
On vient de voir comment valider une licence. Le souci c’est qu’à ce stade, je n’ai qu’un numéro orderId et un productId.
Je pourrais me démerder avec cela si je rentre en dur, coté application les références produits. Seulement si un jour je change de produit ca ne fonctionnera plus.
Comment faire ? Il faut requêter l’API Woo Commerce, tout simplement. De la même manière on va devoir générer des clés d’API dans l’onglet « avancé » des réglages de Woo Commerce.
Notre requête devra aussi avoir une authorisation basique avec ces clés. Le path api est wp-json/wc/
Voici une requête pour obtenir des informations sur la commande 40 :https://shop.outquest.fr/wp-json/wc/v2/orders/40
{
"id": 40,
"parent_id": 0,
"status": "completed",
"currency": "EUR",
"version": "6.9.4",
"prices_include_tax": true,
"date_created": "2022-09-30T18:00:07",
"date_modified": "2022-09-30T18:00:10",
"discount_total": "0.00",
"discount_tax": "0.00",
"shipping_total": "0.00",
"shipping_tax": "0.00",
"cart_tax": "0.17",
"total": "1.00",
"total_tax": "0.17",
"customer_id": 1,
"order_key": "wc_order_Px8132TVZef0E",
"billing": {
"first_name": "Yann",
"last_name": "Vasseur",
"company": "",
"address_1": "2 la en face",
"address_2": "",
"city": "Partis",
"state": "",
"postcode": "35580",
"country": "FR",
"email": "xxxxxxx@yahoo.fr",
"phone": "06 66 66 6 6 6"
},
"shipping": {
"first_name": "",
"last_name": "",
"company": "",
"address_1": "",
"address_2": "",
"city": "",
"state": "",
"postcode": "",
"country": "",
"phone": ""
},
"payment_method": "woocommerce_payments",
"payment_method_title": "Carte de crédit/carte de débit",
"transaction_id": "pi_3LnldEFq94z7RR2d10UTj3Te",
"customer_ip_address": "79.95.127.132",
"customer_user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36",
"created_via": "checkout",
"customer_note": "",
"date_completed": "2022-09-30T18:00:10",
"date_paid": "2022-09-30T18:00:10",
"cart_hash": "7c45d164e8db4f049f791a4cb6bfeded",
"number": "40",
"meta_data": [
{
"id": 645,
"key": "is_vat_exempt",
"value": "no"
},
{
"id": 646,
"key": "_payment_method_id",
"value": "pm_1LnldCFq94z7RR2dn0VFdrDP"
},
{
"id": 647,
"key": "_stripe_customer_id",
"value": "cus_MWiJXN4eXAa94X"
},
{
"id": 648,
"key": "_wcpay_mode",
"value": "test"
},
{
"id": 649,
"key": "_intent_id",
"value": "pi_3LnldEFq94z7RR2d10UTj3Te"
},
{
"id": 650,
"key": "_charge_id",
"value": "ch_3LnldEFq94z7RR2d1CxGKYWX"
},
{
"id": 651,
"key": "_intention_status",
"value": "succeeded"
},
{
"id": 652,
"key": "_wcpay_intent_currency",
"value": "EUR"
},
{
"id": 662,
"key": "lmfwc_order_complete",
"value": "1"
},
{
"id": 663,
"key": "_wcpdf_invoice_settings",
"value": {
"display_shipping_address": "",
"display_customer_notes": "1",
"display_date": "order_date",
"header_logo": "19",
"header_logo_height": "",
"shop_name": {
"default": "Outquest"
},
"shop_address": {
"default": "2 la bas\r\n35580 Paris"
},
"footer": {
"default": ""
},
"extra_1": {
"default": ""
},
"extra_2": {
"default": ""
},
"extra_3": {
"default": ""
}
}
},
{
"id": 664,
"key": "_wcpdf_invoice_date",
"value": "1664553607"
},
{
"id": 665,
"key": "_wcpdf_invoice_date_formatted",
"value": "2022-09-30 18:00:07"
},
{
"id": 666,
"key": "_wcpdf_invoice_number",
"value": "5"
},
{
"id": 667,
"key": "_wcpdf_invoice_number_data",
"value": {
"number": 5,
"formatted_number": "5",
"prefix": "",
"suffix": "",
"document_type": "invoice",
"order_id": 40,
"padding": ""
}
},
{
"id": 668,
"key": "_new_order_email_sent",
"value": "true"
}
],
"line_items": [
{
"id": 17,
"name": "Quest – Vallons de Vilaine 2",
"product_id": 29,
"variation_id": 0,
"quantity": 1,
"tax_class": "",
"subtotal": "0.83",
"subtotal_tax": "0.17",
"total": "0.83",
"total_tax": "0.17",
"taxes": [
{
"id": 1,
"total": "0.166667",
"subtotal": "0.166667"
}
],
"meta_data": [],
"sku": "",
"price": 0.833333,
"image": {
"id": "13",
"src": "https://shop.outquest.fr/wp-content/uploads/2022/09/Product-458x458-1.jpg"
},
"parent_name": null
}
],
"tax_lines": [
{
"id": 18,
"rate_code": "FR- TAX-1",
"rate_id": 1,
"label": "Tax",
"compound": false,
"tax_total": "0.17",
"shipping_tax_total": "0.00",
"rate_percent": 20,
"meta_data": []
}
],
"shipping_lines": [],
"fee_lines": [],
"coupon_lines": [],
"refunds": [],
"payment_url": "https://shop.outquest.fr/commander/order-pay/40/?pay_for_order=true&key=wc_order_Px8132TVZef0E",
"is_editable": false,
"needs_payment": false,
"needs_processing": false,
"date_created_gmt": "2022-09-30T16:00:07",
"date_modified_gmt": "2022-09-30T16:00:10",
"date_completed_gmt": "2022-09-30T16:00:10",
"date_paid_gmt": "2022-09-30T16:00:10",
"currency_symbol": "€",
"_links": {
"self": [
{
"href": "https://shop.outquest.fr/wp-json/wc/v2/orders/40"
}
],
"collection": [
{
"href": "https://shop.outquest.fr/wp-json/wc/v2/orders"
}
],
"customer": [
{
"href": "https://shop.outquest.fr/wp-json/wc/v2/customers/1"
}
]
}
}
Beaucoup d’information ici. On y retrouve les coordonnées de l’acheteur, ce qu’il a commandé.
Une autre requête sur le produit directement : https://shop.outquest.fr/wp-json/wc/v2/products/29
{
"id": 29,
"name": "Quest – Vallons de Vilaine 2",
"slug": "quest-vallons-de-vilaine",
"permalink": "https://shop.outquest.fr/produit/quest-vallons-de-vilaine/",
"date_created": "2022-09-30T11:09:23",
"date_created_gmt": "2022-09-30T09:09:23",
"date_modified": "2022-09-30T17:59:23",
"date_modified_gmt": "2022-09-30T15:59:23",
"type": "simple",
"status": "publish",
"featured": false,
"catalog_visibility": "visible",
"description": "<p>Explorez le sud Ille et Vilaine le long du fleuve et découvrez des lieux d’une beauté insoupsonnée. Partez à la découverte d’endroit insolite et mystérieux.</p>\n<p>Notre aventure commence avec Gwendal Morvan, contrebandier en 1605.</p>\n<p>— Histoire —</p>\n<p>Sous l’ancien régime (1589 – 1789), la gabelle, c’est-à-dire l’impôt sur le sel, est inéquitablement répartie sur le territoire français. Le commerce de sel est libre en Bretagne alors que dans les provinces voisines du Maine et de l’Anjou, les habitants sont contraints d’acheter aux greniers de la ferme générale (compagnie privée chargée de collecter les impôts indirects dont une somme forfaitaire est réservée au roi) .</p>\n<p>Le sel à cette époque est une denrée très précieuse, notamment dans la conservation des aliments. Donc on ne rigolait pas avec le sel ! C’est une vraie monnaie d’échange.</p>\n<p>Les marais salant de Guérande sont la principale source d’approvisionnement de la région et le transport de la marchandise se fait principalement via les réseaux fluviaux. La vilaine en fait partie. Le port de Guipry est au moyen age le terminus des bateaux remontant le sel. Plus tard, la Vilaine se dotera d’écluse et la navigation se fera jusqu’à Rennes.</p>\n<p>A Guipry, on trouve donc des entrepôts pour stocker le sel mais aussi une caserne de gabelous, chargé de veiller au sel.</p>\n<p>Cette denrée non imposée en Bretagne attise la convoitise de ses voisins qui eux se voient taxés au prix fort.</p>\n<p>Un ensemble de dépôts clandestins de forment alors aux portes de la Bretagne, et les faux sauniers (contrebandier de sel) pullulent dans la région.</p>\n<p>— Fiction —</p>\n<p>Richard Dax né à Langon en 1580 connaît bien la région où il a grandi. Au bord de la vilaine, enfant, il a vu passer de nombreux bateaux tractés à dos d’homme. Son père est un de ces hommes, un haleur, qui, à la force des bras, fait remonter les péniches chargées de sel de Langon à Guipry, ensuite c’est à une autre personne de prendre le relais vers Bourgs des comptes. Mais bien souvent le chargement de sel s’arrête à Guipry et repart par voie terrestre.</p>\n<p>Lassé de voir son père se tuer à la tâche le long du halage, Richard décide alors de lui acheter un cheval. Mais un cheval ça coûte cher. Alors Richard se lance dans la contrebande de sel. Il commence seul et petit à petit il crée son propre réseau.</p>\n<p>A Guipry, il a corrompu un gabelous qui l’informe non seulement du prix du sel dans toute la France, ce qui l’aide dans ses négociations, mais aussi des opérations anti contrebande, ce qui lui donne toujours un coup d’avance.</p>\n<p>Afin de répartir les risques d’une saisie ou d’un vol, Richard dispose de 7 caches le long de la Vilaine. Les revendeurs de sel du Maine et d’Anjou se déplacent alors dans l’une de ces caches pour y récupérer le sel et laissent sur place, en échange, des Louis d’or. Bien évidemment, les revendeurs peuvent partir avec le butin sans rien laisser en échange. Seulement, cela arrête net toutes transactions futures et la cache sera déplacée. Ils ont bien plus à gagner à coopérer dans la durée.</p>\n<p>De plus, chacune de ces caches est dissimulée dans la nature. Et on ne peut trouver son emplacement que si l’on possède un parchemin et que l’on sait le déchiffrer. La cache et son parchemin peuvent changer au besoin. Il a pensé à tout Richard. Et pour assurer tout oubli, Richard dispose d’une carte de collecte chiffrée qu’il met à jour si besoin pour se souvenir de l’emplacement des caches.</p>\n<p>Et ça fonctionne. Très bien même ! C’est ainsi que pendant plus de 12 ans ce trafic prospère en toute clandestinité. Mais en 1622 une épidémie de peste éclate à Rennes. Elle ne mettra pas longtemps à se répandre dans la région et Richard n’en fut pas épargné. Ceci arrête net toute cette entreprise, laissant en l’état le trafic, donc les caches et leur contenu.</p>\n<p>Nous avons récupéré ces 7 parchemins et le plan de Richard.</p>\n<p>Est-ce que ces caches existent encore ?</p>\n<p>A vous de les trouver !</p>\n",
"short_description": "<p>Explorez le sud Ille et Vilaine le long du fleuve et découvrez des lieux d’une beauté insoupsonnée. Partez à la découverte d’endroit insolite et mystérieux.Notre aventure commence avec Gwendal Morvan, contrebandier en 1605.</p>\n",
"sku": "",
"price": "1",
"regular_price": "1",
"sale_price": "",
"date_on_sale_from": null,
"date_on_sale_from_gmt": null,
"date_on_sale_to": null,
"date_on_sale_to_gmt": null,
"on_sale": false,
"purchasable": true,
"total_sales": 7,
"virtual": true,
"downloadable": true,
"downloads": [],
"download_limit": -1,
"download_expiry": -1,
"external_url": "",
"button_text": "",
"tax_status": "taxable",
"tax_class": "",
"manage_stock": false,
"stock_quantity": null,
"in_stock": true,
"backorders": "no",
"backorders_allowed": false,
"backordered": false,
"sold_individually": true,
"weight": "",
"dimensions": {
"length": "",
"width": "",
"height": ""
},
"shipping_required": false,
"shipping_taxable": false,
"shipping_class": "",
"shipping_class_id": 0,
"reviews_allowed": true,
"average_rating": "0.00",
"rating_count": 0,
"upsell_ids": [],
"cross_sell_ids": [],
"parent_id": 0,
"purchase_note": "",
"categories": [
{
"id": 15,
"name": "Non classé",
"slug": "non-classe"
}
],
"tags": [],
"images": [
{
"id": 13,
"date_created": "2022-09-26T17:47:16",
"date_created_gmt": "2022-09-26T13:47:16",
"date_modified": "2022-09-26T17:47:16",
"date_modified_gmt": "2022-09-26T13:47:16",
"src": "https://shop.outquest.fr/wp-content/uploads/2022/09/Product-458x458-1.jpg",
"name": "Product-458×458",
"alt": "",
"position": 0
}
],
"attributes": [],
"default_attributes": [],
"variations": [],
"grouped_products": [],
"menu_order": 0,
"price_html": "<span class=\"woocommerce-Price-amount amount\"><bdi>1,00 <span class=\"woocommerce-Price-currencySymbol\">€</span></bdi></span>",
"related_ids": [
12,
17,
14
],
"meta_data": [
{
"id": 167,
"key": "_last_editor_used_jetpack",
"value": "classic-editor"
},
{
"id": 310,
"key": "_coming_soon_wc_arrival",
"value": "2022-09-30 09:09:23"
},
{
"id": 311,
"key": "_coming_soon",
"value": "false"
},
{
"id": 425,
"key": "lmfwc_licensed_product",
"value": "1"
},
{
"id": 426,
"key": "lmfwc_licensed_product_delivered_quantity",
"value": "1"
},
{
"id": 427,
"key": "lmfwc_licensed_product_use_stock",
"value": "0"
},
{
"id": 428,
"key": "lmfwc_licensed_product_assigned_generator",
"value": "1"
},
{
"id": 429,
"key": "lmfwc_licensed_product_use_generator",
"value": "1"
}
],
"_links": {
"self": [
{
"href": "https://shop.outquest.fr/wp-json/wc/v2/products/29"
}
],
"collection": [
{
"href": "https://shop.outquest.fr/wp-json/wc/v2/products"
}
]
}
}
Re « Bingo ».
Grâce à ce deux API, je vais pouvoir coté application récupérer en toute sécurité ces données (gardez bien secrete les clé API, hein !)