Pour commencer

Dans cette première étape, nous allons voir comment utiliser vos clés API pour pouvoir vous authentifier sur le serveur Cherry Checkout. Si ce n'est pas encore fait, connectez vous à votre dashboard et munissez vous de vos clés de test.


Authentification

Toutes les requètes que vous effectuerez vers les serveurs de Cherry Checkout doivent être authentifiées à l'aide d'un token. Ce token se construit à l'aide de votre clé publique, clé privée, et d'un timestamp qui doit s'incrémenter à chacun de vos appels. Par mesure de sécurité, ces informations doivent être cryptées de votre coté avant que vous effectuiez votre requète. Nous allons décrire ici, la procédure à appliquer pour obtenir ce token.

Générer un timestamp

Dans le but d'invalider les tokens après leur utilisation, vous devrez générer ces derniers à l'aide d'un timestamp. Ou bien n'importe quelle valeur qui s'incrémente avec le temps.

Générer un token crypté

La méthode pour générer votre token doit être employée de manière très précise. Elle consiste à crypter votre timestamp, avec votre jeu de clés. Le méthode varie en fonction des langages de programmation, mais reste accessible pour n'importe lequel d'entre eux.

  1. Concaténez votre clé publique avec le timestamp que vous avez généré, dans cet ordre.
  2. Appliquez une fonction HMAC-SHA-256 sur cette concaténation, avec comme clé de cryptage, votre clé privée.
  3. Encodez le résultat en Base64.

Voici comment appliquer cette procédure, dans différents langages de programmation :

// Our API keys
$publicKey = 'pk_test_abc';
$privateKey = 'sk_test_456';

// Generate a timestamp
$timestamp = time();

// 1. Concatenate publicKey with timestamp
$concatenation = $publicKey.$timestamp;

// 2. HMAC-256 the concatenation, with our privateKey as encryption key
$hmac = hash_hmac('sha256', $concatenation, $privateKey);

// 3. Base 64 the result
$base64 = base64_encode($hmac);

				
/*  Require crypto
 *  See: https://nodejs.org/api/crypto.html
 *  Or: `npm install crypto --save`
 */
var crypto = require('crypto');

// Our API Keys
var publicKey = 'pk_test_abc';
var privateKey = 'sk_test_456';

// Generate a timestamp
var timestamp = Math.floor(Date.now() / 1000);

// 1. Concatenate publicKey with timestamp
var concatenation = publicKey + '' + timestamp;

// 2. HMAC-256 the concatenation, with our privateKey as encryption key
var hmac = new Buffer(crypto.createHmac('sha256', privateKey).update(concatenation).digest('hex'));

// 3. Base 64 the result
var base64 = hmac.toString('base64');
				
// Requirements
using System;
using System.Text;
using System.Security.Cryptography;
using System.IO;

// Our API keys
string publicKey = 'pk_test_abc';
string privateKey = 'sk_test_456';

// Generate a timestamp
int timestamp = (int)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;

// 1. Concatenate publicKey with timestamp in a byte array
byte[] concatenation = Encoding.ASCII.GetBytes(publicKey + timestamp);

// 2. HMAC-256 the concatenation, with our privateKey as encryption key
HMACSHA256 fncHmac256 = new HMACSHA256(Encoding.ASCII.GetBytes(privateKey));
string hash = string.Join("", Array.ConvertAll(fncHmac256.ComputeHash(new MemoryStream(concatenation)), b => b.ToString("x2")));

// 3. Base 64 the result
string base64 = System.Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(hash));
				

Pour vérifier que votre méthode fonctionne, vous pouvez utiliser l'outil ci-dessous, et comparer avec vos résultats :

Mode détaillé

Configurer les Headers de la requète

Maintenant que vous avez crypté votre token, vous êtes prêt à configurer les headers de votre requète.
Si vous utilisez l'outil ci-dessus, vous pourrez voir des exemples de headers.

authorization {PUBLIC_KEY}:{GENERATED_TOKEN}
timestamp {TIMESTAMP}
content-type application/json

Première requète

Avec vos headers, vous êtes maintenant prêt à effectuer votre première requète. Vous pouvez utilisez la méthode que vous souhaitez ( curl, Postman ou autre).

Faites un appel à la route suivante, en renseignant les headers ci-dessus.

Requète :

Réponse :

			{
  "contract": {
    "name": "pragmatic",
    "charityOrderPercentage": 50,
    "gameOrderPercentage": 50,
    "nbOrderToDraw": 300,
    "priceScale": [
      {
        "from": 0,
        "to": 60,
        "amount": 1
      },
      {
        "from": 60,
        "to": 140,
        "amount": 2
      },
      {
        "from": 140,
        "to": 220,
        "amount": 3
      },
      {
        "from": 220,
        "to": 300,
        "amount": 4
      },
      {
        "from": 300,
        "to": 999999,
        "amount": 5
      }
    ]
  },
  "plugin": {
     "fr": "<html>...</html>",
     "en": "<html>...</html>",
     "de": "<html>...</html>"
  },
  "pdfContractLink": "",
  "pdfTermsAndConditionsLink": "",
  "charities": [
    {
      "id": "5981e3ba116c24173362b357",
      "description": {
        "fr": "Description de l'œuvre caritative.",
        "en": "Description of the charity.",
        "de": "Beschreibung Liebe.",
        "es": "Descripción caridad.",
        "it": "Descrizione carità."
      },
      "logo": {
        "fr": "https://cdn.cherrycheckout.com/charities/5981e3ba116c24173362b357/logo_fr.png",
        "en": "https://cdn.cherrycheckout.com/charities/5981e3ba116c24173362b357/logo_en.png",
        "de": "https://cdn.cherrycheckout.com/charities/5981e3ba116c24173362b357/logo_de.png",
        "es": "https://cdn.cherrycheckout.com/charities/5981e3ba116c24173362b357/logo_es.png",
        "it": "https://cdn.cherrycheckout.com/charities/5981e3ba116c24173362b357/logo_it.png"
      },
      "name": {
        "fr": "Action Contre la Faim",
        "en": "Action Against Hunger",
        "de": "Aktion Gege, den Hunger",
        "es": "Acción Contra el Hambre",
        "it": "Azione Contro la Fame"
      },
      "website": {
        "fr": "www.actioncontrelafaim.org",
        "en": "www.actionagainsthunger.org",
        "de": "www.aktiongegendenhunger.de",
        "es": "www.accioncontraelhambre.org",
        "it": "www.azionecontrolafame.it"
      }
    }
  ],
  "mode": "test"
}
		
200 - Success
contract Contract Les modalités de votre contrat avec Cherry Checkout
plugin object Un code html internationalisé qui vous permet d'afficher la bannière Cherry Checkout. Mais vous pouvez également gérer vous-même l'affichage de cette bannière, et donc ignorer ce champ.
pdfContractLink string Le lien vers votre contrat.
pdfTermsAndConditionsLink string Le lien vers les Termes et Conditions de jeu, que vous devez fournir à vos client.
charities array of Charity La liste des œuvres caritatives qui vous sont liées.
mode string Le mode de votre requète ('test' si vous utilisez vos clés de test, 'prod' sinon).
Contract
name string Le type de contrat que vous avez avec Cherry Checkout.
charityOrderPercentage integer Pour une participation, la part (sur 100) reversée à l'association.
gameOrderPercentage integer Pour une participation, la part (sur 100) qui couvre le jeu-concours.
nbOrderToDraw integer Nombre nécessaire de participations pour effectuer un tirage au sort.
priceScale PriceScale Le montant de la cerise par défaut, en fonction du montant du panier. (Facultatif)
Charity
id string ID de l'œuvre caritative
name object Nom de l'œuvre caritative (internationalisé)
logo object Lien vers le logo de l'œuvre caritative (internationalisé)
description object Description de l'œuvre caritative (internationalisé)
website object URL du site web de l'œuvre caritative (internationalisé)
403 - Forbidden
missing authorization params 3401 Le header 'authorization' est manquant.
missing timestamp 3402 Le header 'timestamp' est manquant.
wrong authorization params 3403 Le header 'authorization' est mal formaté. Il doit contenir votre clé publique et votre token, séparés par le caractère 'deux points'.
invalid public key 3410 Votre clé publique n'est pas bonne.
invalid token 3411 Votre token n'est pas bon.
invalid timestamp 3412 Le timestamp que vous avez fourni est expiré.
invalid private key 3413 Votre clé privée n'est pas bonne.
no contract 3420 Aucun contrat n'a été paramétré pour votre compte. Si cette erreur se produit, contactez-nous.
restricted to test mode 3421 Votre contrat n'a pas encore été validé, vous ne pouvez pas effectuer de requète en mode 'prod'.

Conclusion

Si vous réussissez à obtenir une réponse semblable à celle décrite ci-dessus, alors vous êtes prêt à passer à la suite. L'authentification qu'on a décrite fonctionne de la même manière pour n'importe quelle requète que vous aurez à effectuer.
Concernant cette première requète, elle est facultative pour la suite. Mais si vous l'effectuez, nous vous conseillons de garder la réponse en cache, étant donné qu'elle ne sera pas amenée à changer souvent.

Besoin d'aide ?

N'hésitez pas à contacter notre support technique si vous rencontrez des difficultés.