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.
- Concaténez votre clé publique avec le timestamp que vous avez généré, dans cet ordre.
- Appliquez une fonction HMAC-SHA-256 sur cette concaténation, avec comme clé de cryptage, votre clé privée.
- 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 :
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.