Arborescence des pages

Comparaison des versions

Légende

  • Ces lignes ont été ajoutées. Ce mot a été ajouté.
  • Ces lignes ont été supprimées. Ce mot a été supprimé.
  • La mise en forme a été modifiée.

 

Extrait
hiddentrue

 todo :

refaire les schema

ref cmd en api direct ?

prerequis et secu ?

wallet api direct ?
 

Sommaire
maxLevel2
stylenone

...

  • doAuthorization
  • createWallet
  • updateWallet
  • verifyAuthentication
  • verifyEnrollment
  • doCredit
  • doDebit

 

Exemples d’implémentation

Trois étapes sont nécessaires :

  1. Préparation de la page de collecte des données carte
  2. Page de paiement

  3. Traitement de la réponse

...

Préparation de la page de collecte des données carte

Avant de présenter la page à ses acheteurs, le commerçant doit préparer les éléments qui serviront à envoyer la demande de token à Payline :

  1. Préparer un hash de sa clé d’accès Payline (méthode SHA-256) ;
  2. Affecter une référence de commande unique au panier de l’acheteur ;
  3. Récupérer les informations de son compte Payline : identifiant commerçant et numéro de contrat sur lequel va porter le paiement ;
  4. Chiffrer ces données ;
  5. Générer le formulaire de paiement présenté à l’acheteur en incluant les données chiffrées à l’étape précédente.

À noter que la chaîne de caractères chiffrée (obtenue à l’étape 5) doit être encodée en base64url (cf. https://fr.wikipedia.org/wiki/Base64#base64url).

 

Code serveur PHP

Préparer un hash de la clé d’accès :

Bloc de code
languagexml
themeEclipse
$aes256Key = hash("SHA256", $accessKey, true);

La donnée accessKey représente la clé d’accès du commerçant 

 

Pour chiffrer les données, il faut d’abord concaténer les données avant de chiffrer la chaine de caractères obtenue :

Bloc de code
languagephp
themeEclipse
messageUtf8 = utf8_encode($merchantId.";".$orderRef.";".$contractNumber);
$crypted crypted = getEncrypt($messageUtf8, $aes256Key);

function getEncrypt($message, $key){
     $block = mcrypt_get_block_size('rijndael_128', 'ecb');
     $pad = $block - (strlen($message) % $block);
     $message .= str_repeat(chr($pad), $pad);
     return base64_url_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $message, MCRYPT_MODE_ECB));
}

Avec :
merchantId : identifiant Payline du commerçant
orderRef : référence unique de la commande en cours
contractNumber : numéro de contrat Payline sur lequel va porter le paiement.

 

Code serveur J2E

Préparer un hash de la clé d’accès :

Bloc de code
languagejava
themeEclipse
MessageDigest sha = MessageDigest.getInstance("SHA-256");
aes256Key = sha.digest(accessKey.getBytes("UTF-8"));

La donnée accessKey représente la clé d’accès du commerçant.

 

Chiffrer les données. Il faut d’abord concaténer les données avant de chiffrer la chaîne de caractères obtenue :

 

Bloc de code
languagejava
themeEclipse
byte[] msgUtf8 = (merchantId+orderRef+ContractNumber).getBytes("UTF-8");

SecretKeySpec secretKeySpec = new SecretKeySpec(accessKeyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
byte[] ciphered = cipher.doFinal(msgUtf8);

String crypted = Base64.encodeBase64URLSafeString(ciphered);

Avec :
merchantId : identifiant Payline du commerçant ;
orderRef : référence unique de la commande en cours ;
contractNumber : numéro de contrat Payline sur lequel va porter le paiement.

...

Page de paiement

La page de paiement doit implémenter un fonctionnement qui garantit que le numéro de carte saisit par l’acheteur ne sera jamais stocké (ni par le navigateur de l’acheteur, ni par le serveur web du commerçant).

L’appel à la fonction getToken() peut se faire en mode AJAX cross-domain ou via une requête http post (fournir une URL de retour dans ce cas).

En retour un traitement côté serveur web commerçant doit être appelé afin de prendre en compte la réponse et retourner la page adéquate à l’acheteur (ticket/confirmation de paiement ou page d’erreur selon les cas).

 

Exemple de script d’appel AJAX :

Bloc de code
languagejava
themeEclipse
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script>
  // Requête AJAX pour appeler la fonction getToken de Payline
  $(document).ready( function () {
    $("#paymentForm").submit( function() {  // à la soumission du formulaire
      jQuery.support.cors = true;  // activer les requêtes ajax cross-domain
      $.ajax( {
        type: "POST",
        url: "https://homologation-webpayment.payline.com/webpayment/getToken",
        data: "data="+$("#data").val() + "&accessKeyRef=" + 
$("#accessKeyRef").val() + "&cardNumber=" + $("#cardNumber").val() +
 "&cardExpirationDate=" + $("#cardExpirationDate").val() + 
"&cardCvx=" + $("#cardCvx").val(),
        success: function(msg){ // si l'appel a bien fonctionné
          $.ajax({  // fonction permettant de faire de l'ajax
            type: "POST", // methode de transmission au site marchand
            url: "paymentAjax.php",  // traitement serveur (appel local)
            data: "resultPayline="
            success: function(result){  // si l'appel a bien fonctionné
     // traitement du résultat OK (afficher les parametres dans cet exemple)
              var divMsg = $(result);
              divMsg.hide();
              $("#result").append(divMsg);
              divMsg.slideDown();
            }
          });
        },
        error:function (xhr, status, error){
          console.log("Erreur lors de l'appel de Payline : " + xhr.responseText + " (" + status + " - " + error + ")");
        }
      });
      return false; // pour rester sur la même page à la soumission du formulaire
    });
  });
</script>

Exemple utilisable dans un formulaire du type :

...

languagexml
themeEclipse

...

Avec :
crypted : données chiffrées préparées à l’étape précédente
accessKeyRef : référence de la clé d’accès commerçant

...

Traitement de la réponse

La réponse contient des données qu’il faut déchiffrer et décompresser, le tout étant codé en base64url.

La chaine peut ensuite être découpée pour récupérer les valeurs séparées par les points-virgules.

Une fois cette étape effectuée, il est possible de procéder à toute opération sur la carte au travers de l’API Webservice Payline.

Généralement le marchand va effectuer une demande d’autorisation à Payline (avec token carte, date d’expiration et CVV virtuel) ou bien une vérification d’enrôlement 3DSecure.

Pour plus d’information sur l’API webservice, vous pouvez consulter la documentation associée.

 

Serveur PHP

Déchiffrer les données reçues :

 

Bloc de code
languagephp
themeEclipse
$zippedData = getDecrypt($data, $aes256Key);

function getDecrypt($message, $key){
     $message = base64_url_decode($message);
     $message = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $message, MCRYPT_MODE_ECB);
     $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
     $len = strlen($message);
     $pad = ord($message[$len-1]);
     return substr($message, 0, $len-$pad);
}

 

La donnée data représente la valeur du paramètre ($_POST['data']) reçu en retour (cas où l’appel ne retourne pas une erreur).

Décompresser les données :

Bloc de code
languagephp
themeEclipse
$uncompressedData = gzdecode($zippedData);

 

Découper le résultat pour récupérer le résultat de l’appel :

Bloc de code
languagephp
themeEclipse
$paylineDataResponse=explode(';', $uncompressedData);

$cardToken = $paylineDataResponse[0];
$cardExpirationDate = $paylineDataResponse[1];
$cardVirtualCVV = $paylineDataResponse[2];
$orderReference = $paylineDataResponse[3];
…

 

Serveur J2E

Déchiffrer les données reçues :

Bloc de code
languagejava
themeEclipse
byte[] decryptedMessage = new byte[0];
zippedData = AESEncryption.decrypt(aes256Key, data);

public static final byte[] decrypt(final String key, final String message) {
  byte[] decrypt = new byte[0];
  MessageDigest sha = MessageDigest.getInstance("SHA-256");
  keyBytes = sha.digest(key.getBytes("UTF-8"));
  SecretKeySpec secretKeySpec = new SecretKeySpec(keyBytes, "AES");
  Cipher cipher = Cipher.getInstance("AES");
  cipher.init(Cipher.DECRYPT_MODE, secretKeySpec);
  decrypt = cipher.doFinal(Base64.decodeBase64(message.getBytes("UTF-8")));
  return finalDecrypt;
 }

 

La donnée data représente la valeur du paramètre (request.getParameter("data")) reçu en retour (cas où l’appel ne retourne pas une erreur).

 

Décompresser les données :

Bloc de code
languagejava
themeEclipse
final StringBuffer outStr = new StringBuffer();
final ByteArrayInputStream gzipedStr = new ByteArrayInputStream(zippedData);
final GZIPInputStream gis = new GZIPInputStream(gzipedStr);
final BufferedReader bf = new BufferedReader(new InputStreamReader(gis));
String line;
while ((line = bf.readLine()) != null) {
  outStr.append(line);
}
gis.close();
String uncompressedData = outStr.toString();

 

Découper le résultat pour récupérer le résultat de l’appel :

...

languagejava
themeEclipse

...