Cette page vous aidera à démarrer avec PayTech. Vous serez opérationnel en un tour main!
Vous pouvez telecharger la version PDF resumé avec des example en Java ici
Notre page de documentation vous donne toutes les informations dont vous pourriez avoir besoin pour utiliser nos API.
Les SDK pour chaque plateforme sont ajoutés progressivement et mis à jour régulièrement. Ils sont repartis en deux catégories:
Tous les fichiers sont disponibles dans les liens suivant:
L'URL de base de l'API est:
URL_BASE : "https://paytech.sn/api"
Une clé d'interface de programmation d'applications (clé API) est un code utilisé par les programmes informatiques qui utilisent nos API.
Pour utiliser l'API de PayTech API, vous devez vous inscrire sur la plateforme. Une fois dans le Dashbord, cliquer sur le menu Paramètres, puis sur API pour récupérer vos clés. Vous avez aussi la possibilité de les régénérer.
Toutes les requêtes envoyées par le site marchand vers notre API doivent comporter obligatoirement la clé API et la clé secrète dans les headers de la requête :
SHELL # you can pass the correct header for each request in this way curl "api_endpoint_here" -H "API_KEY: 1afac858d4fa5ec74e3e3734c3829793eb6bd5f4602c84ac4a5069369812915e" -H "API_SECRET: 96bc36c11560f2151c4b43eee310cefabc2e9e9000f7e315c3ca3d279e3f98ac"
Le Paiement avec Redirection vous permet de rediriger votre client vers notre plateforme afin qu'il puisse achever le processus de paiement.
Le traitement avec redirection est idéal pour les marchands qui désirent déléguer l’hébergement de la page de paiement
à PayTech. Lors du processus de paiement, le client est redirigé vers une page de PayTech pour saisir les informations de paiement.
Les clients peuvent choisir de payer à partir d'une variété d'options de paiement disponibles sur notre plateforme.
La demande de paiement définit une expérience utilisateur cohérente entre les méthodes de paiement, les systèmes de paiement, les plateformes et les commerçants.
Pour que le client puisse faire un paiement, le site marchand doit d'abord adresser une demande de paiement à notre API. Celui-ci va lui envoyer un token de 20 octets qui sera l'identifiant de la demande.
POST "/payment/request-payment"
Paramètres | Défaut | Obligatoire | Description |
---|---|---|---|
item_name | NULL | OUI | Nom du produit |
item_price | NULL | OUI | Prix de la commande |
ref_command | NULL | OUI | Une référence de commande générée par le site marchand doit être unique pour chaque demande de paiement. |
command_name | "" | OUI | Description de la commande |
currency | XOF | NON | L'une de ses devises: ['XOF', 'EUR', 'USD', 'CAD','GBP','MAD'] |
env | prod | NON | Environnement ['test', 'prod'] |
ipn_url | Paramètre global compte | NON | URL IPN (voir section IPN pour plus de détails). Si elle n'est pas fournie, on utilisera la valeur définie dans les paramètres globaux du site marchand. Seules les URL en HTTPS sont acceptées. |
success_url | Paramètre global compte | NON | URL vers laquelle le client est redirigé après le paiement. Si elle n'est pas fournie, on utilisera la valeur définie dans les paramètres globaux du site marchand. |
cancel_url | Paramètre global compte | NON | URL vers laquelle le client est redirigé quand il annule le paiement. Si elle n'est pas fournie, on utilisera la valeur définie dans les paramètres globaux du site marchand. |
custom_field | NULL | NON | Donnée additionnelle qui sera envoyée au client vers l'URL IPN. Elle doit être une chaine de caractères encodés en JSON. |
CORS n'est pas activé dans les serveurs PayTech, et vos clés API doivent rester confidentielles, d’où la nécessité de passer par un Controller coté serveur pour faire une demande de token.
Votre application devrait disposer d'un Controller Web qui se chargera de faire la demande de token aux serveurs de PayTech.
let paymentRequestUrl = "https://paytech.sn/api/payment/request-payment"; let fetch = require('node-fetch');// http client let params = { item_name:"Iphone 7", item_price:"560000", currency:"XOF", ref_command:"HBZZYZVUZZZV", command_name:"Paiement Iphone 7 Gold via PayTech", env:"test", ipn_url:"https://domaine.com/ipn", success_url:"https://domaine.com/success", cancel_url:"https://domaine.com/cancel", custom_field:JSON.stringify({ custom_fiel1:"value_1", custom_fiel2:"value_2", }) }; let headers = { Accept: "application/json", 'Content-Type': "application/json", API_KEY:"1afac858d4fa5ec74e3e3734c3829793eb6bd5f4602c84ac4a5069369812915e", API_SECRET:"96bc36c11560f2151c4b43eee310cefabc2e9e9000f7e315c3ca3d279e3f98ac", }; fetch(paymentRequestUrl, { method:'POST', body:JSON.stringify(params), headers: headers }) .then(function (response) { return response.json() }) .then(function (jsonResponse) { console.log(jsonResponse) /* { "success":1, "redirect_url":"https://paytech.sn/payment/checkout/98b1c97af00c8b2a92f2", token:"98b1c97af00c8b2a92f2"} */ })
function post($url, $data = [], $header = []) { $strPostField = http_build_query($data); $ch = curl_init($url); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST"); curl_setopt($ch, CURLOPT_POSTFIELDS, $strPostField); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); curl_setopt($ch, CURLOPT_HTTPHEADER, array_merge($header, [ 'Content-Type: application/x-www-form-urlencoded;charset=utf-8', 'Content-Length: ' . mb_strlen($strPostField) ])); return curl_exec($ch); } $postFields = array( "item_name" =>$res['name'], "item_price" => $total, "currency" => "xof", "ref_command" => $ref_commande, "command_name" => $commande, "env" => $environnement, "success_url" => $success_url, "ipn_url" => $ipn_url, "cancel_url" => $success_url, "custom_field" => $customfield ); $jsonResponse = post('https://paytech.sn/api/payment/request-payment', $postfields, [ "API_KEY: ".$api_key, "API_SECRET: ".$api_secret ]); die($jsonResponse);
require 'PayTech.php'; $item = ....;//object const BASE_URL = 'https://sample.domaine.com'; $jsonResponse = (new PayTech($apiKey, $apiSecret))->setQuery([ 'item_name' => $item->name, 'item_price' => $item->price, 'command_name' => "Paiement {$item->name} Gold via PayTech", ])->setCustomeField([ 'item_id' => $id, 'time_command' => time(), 'ip_user' => $_SERVER['REMOTE_ADDR'], 'lang' => $_SERVER['HTTP_ACCEPT_LANGUAGE'] ]) ->setTestMode(true) ->setCurrency($item->currency) ->setRefCommand(uniqid()) ->setNotificationUrl([ 'ipn_url' => BASE_URL.'/ipn.php', //only https 'success_url' => BASE_URL.'/index.php?state=success&id='.$id, 'cancel_url' => BASE_URL.'/index.php?state=cancel&id='.$id ])->send(); die($jsonResponse);
Si tous les paramètres ont été correctement fournis, l'API PayTech renverra la réponse suivante :
{ "success": 1, "token": "XJJDKS8S8SHNS2", "redirect_url": "https://paytech.sn/payment/checkout/XJJDKS8S8SHNS2", }
Présentation Mode |
---|
PayTech.OPEN_IN_POPUP |
PayTech.OPEN_IN_NEW_TAB |
PayTech.OPEN_IN_SAME_TAB |
PayTech.DO_NOTHING |
Vous devez tout d'abord inclure la librairie PayTech disponible sous format .aar dans votre projet.
La librairie est disponible ici :
LINK : "https://doc.paytech.sn/downloads/sdk/paytech_android/paytech-sdk/build/outputs/aar/paytech-sdk-release.aar"https://doc.paytech.sn/downloads/sdk/paytech_android/paytech-sdk/build/outputs/aar/paytech-sdk-release.aar
Ensuite vous devez importer ces deux classes dans votre activité.
import sdk.paytech.sn.PCallback; import sdk.paytech.sn.PayTech;
Ensuite, il reste plus qu’à invoquer la classe.
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.i("click", "click on button"); HashMapparams = new HashMap<>(); params.put("item_id", 2); new PayTech(MainActivity.this) .setRequestTokenUrl("https://sample.paytech.sn/paiement.php") .setParams(params) .setPresentationMode(PayTech.FLOATING_VIEW ) // optional default to FULL_SCREEN .setFloatTopMargin(25) // optional default to 25 .setLoadingDialogText("Chargement") //optional Chargement .setCallback(new PCallback() { @Override public void onResult(Result result) { if(result == Result.SUCCESS) { Toast.makeText(MainActivity.this, "Paiement Effectuer", Toast.LENGTH_SHORT).show(); } else if(result == Result.CANCEL) { Toast.makeText(MainActivity.this, "Vous avez annulez le paiement", Toast.LENGTH_SHORT).show(); } else if(result == Result.ERROR) { Toast.makeText(MainActivity.this, "Erreur lors du paiement", Toast.LENGTH_SHORT).show(); } } }) .send(); } });
Cette section est relative à tout ce qui concerne les notifications de paiement.
Lorsqu'un client finalise un paiement ou qu'un paiement est annulé, PayTech envoie une notification à votre serveur à l'URL IPN que vous avez indiquée.
Cette notification comporte toutes les informations pertinentes de paiement de votre client que vous avez transmises lors de la demande de token de paiement ainsi que le type d'évènement.
À la réception d’une notification, votre serveur devra vérifier si la requête provient bien de PayTech en comparant le hash en sha256 de sa clé API et clé secrète avec les deux clés que nous lui avons envoyées dans la requête.
Voici la liste des paramètres de la notification :
Paramètres | Description |
---|---|
type_event | Le type d'évènement qui a déclenché la requête vers l'URL IPN. L'une de ses valeurs possible. ['sale_complete', 'sale_canceled'] |
client_phone | Le numéro de téléphone du client |
payment_method | La méthode de paiement ['Carte Bancaire', 'PayPal', 'Orange Money', 'Joni Joni', 'Wari','Poste Cash'] |
item_name | Nom du produit |
item_price | Prix de la commande |
ref_command | La référence de commande générée par le site marchand. |
command_name | Description de la commande |
currency | L'une de ses devises: ['XOF', 'EUR', 'USD', 'CAD','GBP','MAD'] |
env | Environnement ['test', 'prod'] |
custom_field | Donnée additionnelle envoyée aux serveurs de PayTech lors de la demande de token |
token | Le token de paiement |
api_key_sha256 | La clé API du site marchand hachée avec l'algorithme sha256 |
api_secret_sha256 | La clé secrète du site marchand hachée avec l'algorithme sha256 |
function SHA256Encrypt(password) { let crypto = require('crypto'); let sha256 = crypto.createHash('sha256'); sha256.update(password); return sha256.digest('hex'); } app.post('/my-ipn', (req, res) => { let type_event = req.body.type_event; let custom_field = JSON.parse(req.body.custom_field); let ref_command = req.body.ref_command; let item_name = req.body.item_name; let item_price = req.body.item_price; let devise = req.body.devise; let command_name = req.body.command_name; let env = req.body.env; let token = req.body.token; let api_key_sha256 = req.body.api_key_sha256; let api_secret_sha256 = req.body.api_secret_sha256; let my_api_key = process.env['API_KEY']; let my_api_secret = process.env['API_SECRET']; if(SHA256Encrypt(my_api_secret) === api_secret_sha256 && SHA256Encrypt(my_api_key) === api_key_sha256) { //from PayTech } else{ //not from PayTech } });
Route::post('/my-ipn', function () { $type_event = Input::get('type_event'); $custom_field = json_decode(Input::get('custom_field'), true); $ref_command = Input::get('ref_command'); $item_name = Input::get('item_name'); $item_price = Input::get('item_price'); $devise = Input::get('devise'); $command_name = Input::get('command_name'); $env = Input::get('env'); $token = Input::get('token'); $api_key_sha256 = Input::get('api_key_sha256'); $api_secret_sha256 = Input::get('api_secret_sha256'); $my_api_key = env('API_KEY'); $my_api_secret = env('API_SECRET'); if(hash('sha256', $my_api_secret) === $api_secret_sha256 && hash('sha256', $my_api_key) === $api_key_sha256) { //from PayTech } else{ //not from PayTech } });
import hashlib def ipn(request): if request.method == "POST": inputtxt = request.POST['getrow'] api_key_sha256 = request.POST['api_key_sha256']; api_secret_sha256 = request.POST['api_secret_sha256'] my_api_secret_sha256 = hashlib.sha256(b'here my api secret').hexdigest() my_api_key_sha256 = hashlib.sha256(b'here my api key').hexdigest() if my_api_key_sha256 == api_key_sha256 and my_api_secret_sha256 == api_secret_sha256: # from paytech return HttpResponse(...)
function get($name) { return !empty($_POST[$name]) ? $_POST[$name] : ''; } $type_event = get('type_event'); $custom_field = json_decode(get('custom_field'), true); $ref_command = get('ref_command'); $item_name = get('item_name'); $item_price = get('item_price'); $devise = get('devise'); $command_name = get('command_name'); $env = get('env'); $token = get('token'); $api_key_sha256 = get('api_key_sha256'); $api_secret_sha256 = get('api_secret_sha256'); $my_api_key = env('API_KEY'); $my_api_secret = env('API_SECRET'); if (hash('sha256', $my_api_secret) === $api_secret_sha256 && hash('sha256', $my_api_key) === $api_key_sha256) { //from PayTech}else{ //not from PayTech} }