The technical implementation boils down to 3 steps:
Before integrating our APIs, you must:
www.cinetpay.com
Pour utiliser pleinement le sdk, insérer vos informations dans le ficher marchand.php
<?php
$marchand = array(
"apikey" => "", // Enrer votre apikey
"site_id" => "", //Entrer votre site_ID
"secret_key" => "" //Entrer votre clé secret
);
{warning.fa-close} Make sure you have some money in your Mobile Money as you will need it throughout your integration.
For those who have services that do not require processing of payment notifications from CinetPay, you can proceed directly to the next phase, for example donation services.
With each payment, CinetPay notifies you via a notification link.
NB :
Example :
if (isset($_POST['cpm_trans_id'])) {
try {
require_once __DIR__ . '/../src/new-guichet.php';
require_once __DIR__ . '/../commande.php';
require_once __DIR__ . '/../marchand.php';
//Création d'un fichier log pour s'assurer que les éléments sont bien exécuté
$log = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
"TransId:".$_POST['cpm_trans_id'].PHP_EOL.
"SiteId: ".$_POST['cpm_site_id'].PHP_EOL.
"-------------------------".PHP_EOL;
//Save string to log, use FILE_APPEND to append.
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);
//La classe commande correspond à votre colonne qui gère les transactions dans votre base de données
$commande = new Commande();
// Initialisation de CinetPay et Identification du paiement
$id_transaction = $_POST['cpm_trans_id'];
// apiKey
$apikey = $marchand["apikey"];
// siteId
$site_id = $_POST['cpm_site_id'];
$CinetPay = new CinetPay($site_id, $apikey);
//On recupère le statut de la transaction dans la base de donnée
/* $commande->set_transactionId($id_transaction);
//Il faut s'assurer que la transaction existe dans notre base de donnée
* $commande->getCommandeByTransId();
*/
// On verifie que la commande n'a pas encore été traité
$VerifyStatusCmd = "1"; // valeur du statut à recupérer dans votre base de donnée
if ($VerifyStatusCmd == '00') {
// La commande a été déjà traité
// Arret du script
die();
}
// Dans le cas contrait, on verifie l'état de la transaction en cas de tentative de paiement sur CinetPay
$CinetPay->getPayStatus($id_transaction, $site_id);
$amount = $CinetPay->chk_amount;
$currency = $CinetPay->chk_currency;
$message = $CinetPay->chk_message;
$code = $CinetPay->chk_code;
$metadata = $CinetPay->chk_metadata;
//Something to write to txt log
$log = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
"Code:".$code.PHP_EOL.
"Message: ".$message.PHP_EOL.
"Amount: ".$amount.PHP_EOL.
"currency: ".$currency.PHP_EOL.
"-------------------------".PHP_EOL;
//Save string to log, use FILE_APPEND to append.
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);
// On verifie que le montant payé chez CinetPay correspond à notre montant en base de données pour cette transaction
if ($code == '00') {
// correct, on delivre le service
echo 'Felicitation, votre paiement a été effectué avec succès';
die();
} else {
// transaction n'est pas valide
echo 'Echec, votre paiement a échoué pour cause : ' .$message;
die();
}
// mise à jour des transactions dans la base de donnée
/* $commande->update(); */
} catch (Exception $e) {
echo "Erreur :" . $e->getMessage();
}
} else {
// direct acces on IPN
echo "cpm_trans_id non fourni";
}
You can use the HMAC on your notification url
<?php
if (isset($_POST['cpm_trans_id'])) {
try {
require_once __DIR__ . '/../src/new-guichet.php';
require_once __DIR__ . '/../commande.php';
require_once __DIR__ . '/../marchand.php';
/* Implementer le HMAC pour une vérification supplémentaire .*/
//Etape 1 : Concatenation des informations posté
$data_post = implode('',$_POST);
//Etape 2 : Créer le token suivant la technique HMAC en appliquant l'algorithme SHA256 avec la clé secrète
$generated_token = hash_hmac('SHA256', $data_post, $marchand["secret_key"]);
if ($_SERVER["HTTP_X_TOKEN"])
{
$xtoken = $_SERVER["HTTP_X_TOKEN"];
}
else{
$xtoken = "indisponible";
}
//Etape 3: Verifier que le token reçu dans l’en-tête correspond à celui que vous aurez généré.
if(hash_equals($xtoken, $generated_token))
{
// Valid Token
$validtoken = True;
//Création d'un fichier log pour s'assurer que les éléments sont bien exécuté
$log = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
"TransId:".$_POST['cpm_trans_id'].PHP_EOL.
"SiteId: ".$_POST['cpm_site_id'].PHP_EOL.
"HMAC RECU: ".$xtoken.PHP_EOL.
"HMAC GENERATE: ".$generated_token.PHP_EOL.
"VALID-TOKEN: ".$validtoken.PHP_EOL.
"-------------------------".PHP_EOL;
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);
//La classe commande correspond à votre colonne qui gère les transactions dans votre base de données
$commande = new Commande();
// Initialisation de CinetPay et Identification du paiement
$id_transaction = $_POST['cpm_trans_id'];
// apiKey
$apikey = $marchand["apikey"];
// siteId
$site_id = $_POST['cpm_site_id'];
$CinetPay = new CinetPay($site_id, $apikey);
//On recupère le statut de la transaction dans la base de donnée
/* $commande->set_transactionId($id_transaction);
//Il faut s'assurer que la transaction existe dans notre base de donnée
* $commande->getCommandeByTransId();
*/
// On verifie que la commande n'a pas encore été traité
$VerifyStatusCmd = "1"; // valeur du statut à recupérer dans votre base de donnée
if ($VerifyStatusCmd == '00') {
// La commande a été déjà traité
// Arret du script
die();
}
// Dans le cas contrait, on verifie l'état de la transaction en cas de tentative de paiement sur CinetPay
$CinetPay->getPayStatus($id_transaction, $site_id);
$payment_date = $CinetPay->chk_payment_date;
$amount = $CinetPay->chk_amount;
$currency = $CinetPay->chk_currency;
$message = $CinetPay->chk_message;
$code = $CinetPay->chk_code;
$metadata = $CinetPay->chk_metadata;
//Enregistrement du statut dans le fichier log
$log = "User: ".$_SERVER['REMOTE_ADDR'].' - '.date("F j, Y, g:i a").PHP_EOL.
"Code:".$code.PHP_EOL.
"Message: ".$message.PHP_EOL.
"Amount: ".$amount.PHP_EOL.
"currency: ".$currency.PHP_EOL.
"-------------------------".PHP_EOL;
//Save string to log, use FILE_APPEND to append.
file_put_contents('./log_'.date("j.n.Y").'.log', $log, FILE_APPEND);
// On verifie que le montant payé chez CinetPay correspond à notre montant en base de données pour cette transaction
if ($code == '00') {
// correct, on delivre le service
echo 'Felicitation, votre paiement a été effectué avec succès';
die();
} else {
// transaction n'est pas valide
echo 'Echec, votre paiement a échoué pour cause : ' .$message;
die();
}
// mise à jour des transactions dans la base de donnée
/* $commande->update(); */
}
else{
echo "HMAC non-conforme";
die();
}
} catch (Exception $e) {
echo "Erreur :" . $e->getMessage();
}
} else {
// direct acces on IPN
echo "cpm_trans_id non fourni";
}
The return page is the page to which the customer is redirected after a transaction on CinetPay (whatever the status of the transaction). No database update should be processed on this page
Example of return page :
<?php
require_once __DIR__ . '/../src/new-guichet.php';
require_once __DIR__ . '/../commande.php';
include('../marchand.php');
if (isset($_POST['transaction_id']) || isset($_POST['token'])) {
$commande = new Commande();
$id_transaction = $_POST['transaction_id'];
try {
// Verification d'etat de transaction chez CinetPay
$CinetPay = new CinetPay($marchand["site_id"], $marchand["apikey"]);
$CinetPay->getPayStatus($id_transaction, $marchand["site_id"]);
$message = $CinetPay->chk_message;
$code = $CinetPay->chk_code;
//recuperer les info du clients pour personnaliser les reponses.
/* $commande->getUserByPayment(); */
// redirection vers une page en fonction de l'état de la transaction
if ($code == '00') {
echo 'Felicitation, votre paiement a été effectué avec succès';
die();
}
else {
// header('Location: '.$commande->getCurrentUrl().'/');
echo 'Echec, votre paiement a échoué';
die();
}
} catch (Exception $e) {
echo "Erreur :" . $e->getMessage();
}
} else {
echo 'transaction_id non transmis';
die();
}
To initiate a payment you must generate a payment link by sending the following information in JSON.
To display the payment by credit card option, you must add this optional information to the previous information:
After having obtained the payment url from the previous request, you just have to launch this url in a web browser to find yourself on the payment counter.
{info.fa-info} For more security, it is necessary to record the information on the payment in the database before displaying the counter.
The data sent via email are processed in the action.php file
Exemple:
<?php
/*Commenter ses deux lines si vous êtes en production
error_reporting(E_ALL);
ini_set('display_errors', 1);*/
// required libs
require_once __DIR__ . '/src/new-guichet.php';
include('marchand.php');
include('commande.php');
// La class gère la table "Commande"( A titre d'exemple)
$commande = new Commande();
try {
if(isset($_POST['valider']))
{
$customer_name = $_POST['customer_name'];
$customer_surname = $_POST['customer_surname'];
$description = $_POST['description'];
$amount = $_POST['amount'];
$currency = $_POST['currency'];
}
else{
echo "Veuillez passer par le formulaire";
}
//transaction id
$id_transaction = date("YmdHis"); // or $id_transaction = Cinetpay::generateTransId()
//Veuillez entrer votre apiKey
$apikey = $marchand["apikey"];
//Veuillez entrer votre siteId
$site_id = $marchand["site_id"];
//notify url
$notify_url = $commande->getCurrentUrl().'cinetpay-sdk-php/notify/notify.php';
//return url
$return_url = $commande->getCurrentUrl().'cinetpay-sdk-php/return/return.php';
$channels = "ALL";
//
$formData = array(
"transaction_id"=> $id_transaction,
"amount"=> $amount,
"currency"=> $currency,
"customer_surname"=> $customer_name,
"customer_name"=> $customer_surname,
"description"=> $description,
"notify_url" => $notify_url,
"return_url" => $return_url,
"channels" => $channels,
"metadata" => "", // utiliser cette variable pour recevoir des informations personnalisés.
"alternative_currency" => "",//Valeur de la transaction dans une devise alternative
//pour afficher le paiement par carte de credit
"customer_email" => "", //l'email du client
"customer_phone_number" => "", //Le numéro de téléphone du client
"customer_address" => "", //l'adresse du client
"customer_city" => "", // ville du client
"customer_country" => "",//Le pays du client, la valeur à envoyer est le code ISO du pays (code à deux chiffre) ex : CI, BF, US, CA, FR
"customer_state" => "", //L’état dans de la quel se trouve le client. Cette valeur est obligatoire si le client se trouve au États Unis d’Amérique (US) ou au Canada (CA)
"customer_zip_code" => "" //Le code postal du client
);
// enregistrer la transaction dans votre base de donnée
/* $commande->create(); */
$CinetPay = new CinetPay($site_id, $apikey);
$result = $CinetPay->generatePaymentLink($formData);
if ($result["code"] == '201')
{
$url = $result["data"]["payment_url"];
// ajouter le token à la transaction enregistré
/* $commande->update(); */
//redirection vers l'url de paiement
header('Location:'.$url);
}
} catch (Exception $e) {
echo $e->getMessage();
}
To activate the credit card payment universe, you need to provide some information about your customer in the $formData
table
<?php
$formData = array(
...
...
//These variables must be provided for credit card payments
"customer_email" => "",
"customer_phone_number" => "",
"customer_address" => "",
"customer_city" => "",
"customer_country" => "",
"customer_state" => "", //Usa (US) or Canada (CA)
"customer_zip_code" => ""
);