Webhooks : taxes
Snipcart dispose d'un système de gestion des taxes intégré dans le tableau de bord du marchand. Si vous avez besoin d'un contrôle total sur la façon dont les taxes sont calculées, le webhook de taxes vous permet de retourner par programmation les taxes applicables à chaque panier.
Pendant le paiement, Snipcart envoie le panier en cours à votre point de terminaison, et votre application est responsable de retourner les taxes à appliquer. Configurez votre point de terminaison dans votre tableau de bord sous Configurations de la boutique → Taxes → Fournisseurs → Webhooks.
Requête
Snipcart fait une requête HTTP POST avec un corps JSON. L'enveloppe de premier niveau est la même que pour tous les webhooks de Snipcart :
| Field | Type | Notes |
|---|---|---|
eventName |
string | Toujours taxes.calculate. |
mode |
string | Live ou Test. |
createdOn |
datetime | Le moment où la requête a été émise. |
content |
object | Le panier en cours - voir ci-dessous. |
Le contenu
Contrairement aux webhooks d'événements de commande et de livraison - qui envoient tous deux un objet de forme Order - le webhook de taxes envoie le panier en cours. À noter au sujet de ce payload : les dates qu'il contient (creationDate, modificationDate, addedOn des articles, …) sont des horodatages Unix, et non des chaînes ISO, et paymentMethod est sérialisé comme un nombre. Champs les plus utilisés :
| Field | Type | Notes |
|---|---|---|
token |
string | Identifiant du panier. |
email |
string | Courriel du client. |
currency |
string | Code de devise ISO. |
lang |
string | Langue du panier. |
status |
string | Généralement InProgress pendant le paiement. |
shipToBillingAddress |
boolean | Si la livraison utilise l'adresse de facturation. |
billingAddress |
object | name, company, address1, address2, city, province, country, postalCode, phone. |
shippingAddress |
object | Même structure que billingAddress. |
shippingInformation |
object | fees et method de l'option de livraison choisie. |
items |
object[] | Les articles du panier. Chacun porte quantity, unitPrice, totalPrice, totalPriceWithoutTaxes et taxable. |
discounts |
object[] | Les rabais appliqués. |
customFields |
object[] | Les champs personnalisés du panier. |
metadata |
object | Métadonnées du marchand. |
itemsTotal |
number | Total des articles. |
totalWeight |
number | Poids total du panier. |
total |
number | Total du panier. |
taxesTotal |
number | Somme des taxes déjà appliquées. |
Exemple
{
"eventName": "taxes.calculate",
"mode": "Test",
"createdOn": "2017-05-01T19:05:18.1321539Z",
"content": {
"ipAddress": "127.0.0.1",
"lang": "en",
"token": "5af47604-61ef-454b-92c9-37f64684e5e5",
"email": "geeks@snipcart.com",
"mode": "Test",
"status": "InProgress",
"shipToBillingAddress": true,
"billingAddress": {
"name": "Geeks at Snipcart",
"company": "Snipcart",
"address1": "226 rue St-Joseph E",
"address2": "",
"city": "Québec",
"country": "CA",
"postalCode": "G1K3A9",
"province": "QC",
"phone": ""
},
"shippingAddress": {
"name": "Geeks at Snipcart",
"company": "Snipcart",
"address1": "226 rue St-Joseph E",
"address2": "",
"city": "Québec",
"country": "CA",
"postalCode": "G1K3A9",
"province": "QC",
"phone": ""
},
"completionDate": null,
"invoiceNumber": "",
"shippingInformation": {
"fees": 10,
"method": "Shipping"
},
"paymentMethod": 0,
"metadata": {},
"items": [
{
"uniqueId": "abb5bd38-ae77-4feb-8d05-c674e302f986",
"token": "",
"id": "1",
"name": "An item",
"price": 300,
"description": "Item description",
"url": "/",
"image": "http://placehold.it/50/50",
"quantity": 1,
"minQuantity": null,
"maxQuantity": null,
"stackable": true,
"shippable": true,
"taxable": true,
"taxes": [],
"customFields": [],
"duplicatable": false,
"metadata": null,
"unitPrice": 300,
"totalPrice": 300,
"totalPriceWithoutTaxes": 300,
"addedOn": 1493665299,
"initialData": "",
"modificationDate": 1493665299
}
],
"discounts": [],
"customFields": [],
"refunds": [],
"taxes": [],
"currency": "usd",
"totalWeight": 3000,
"total": 310,
"discountsTotal": 0,
"itemsTotal": 300,
"taxesTotal": 0,
"taxProvider": null,
"modificationDate": 1493665318,
"creationDate": 1493665299
}
}Réponse
Répondez avec un code d'état 2XX et un corps JSON contenant un tableau taxes. Le Content-Type doit être application/json.
| Field | Type | Requis | Notes |
|---|---|---|---|
name |
string | oui | Nom de la taxe, affiché au client et sur la facture. |
amount |
decimal | oui | Le montant de la taxe, dans la devise du panier (arrondi à 2 décimales). Pas en cents. |
rate |
decimal | non | Le taux de taxe, sous forme de fraction (0.05) ou de pourcentage (5) - les deux sont interprétés comme 5 %. |
numberForInvoice |
string | non | Numéro de taxe ou d'enregistrement affiché sur la facture. |
includedInPrice |
boolean | non | Voir Taxes incluses dans le prix. |
appliesOnShipping |
boolean | non | Voir Taxes sur la livraison. |
{
"taxes": [
{
"name": "Tax1",
"amount": 10.00,
"rate": 0.05,
"numberForInvoice": "TAX-001"
},
{
"name": "Tax2",
"amount": 20.00,
"rate": 0.10,
"numberForInvoice": "TAX-002"
}
]
}Taxes incluses dans le prix
Si vos taxes sont déjà incluses dans vos prix, définissez includedInPrice à true. Le client voit toujours les taxes dans le sommaire de la commande, mais elles ne seront pas ajoutées au total du panier.
{
"taxes": [
{
"name": "Tax1",
"amount": 10.00,
"rate": 0.05,
"numberForInvoice": "TAX-001",
"includedInPrice": true
},
{
"name": "Tax2",
"amount": 20.00,
"rate": 0.10,
"numberForInvoice": "TAX-002",
"includedInPrice": true
}
]
}Taxes sur la livraison
Lorsqu'une taxe est incluse dans le prix, vous pouvez aussi indiquer si elle s'applique aux frais de livraison avec appliesOnShipping.
{
"taxes": [
{
"name": "Tax1",
"amount": 10.00,
"rate": 0.05,
"numberForInvoice": "TAX-001",
"includedInPrice": true,
"appliesOnShipping": true
},
{
"name": "Tax2",
"amount": 20.00,
"rate": 0.10,
"numberForInvoice": "TAX-002",
"includedInPrice": true,
"appliesOnShipping": false
}
]
}