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.

...

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
languagexmlphp
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));
}

...

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

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

...

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
languagexmljava
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.

...

Exemple de script d’appel AJAX :

Bloc de code
languagexmljava
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>

...

Déchiffrer les données reçues :

 

Bloc de code
languagexmlphp
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);
}

...

Décompresser les données :

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

...

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

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

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

...

Déchiffrer les données reçues :

Bloc de code
languagexmljava
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;
 }

...

Décompresser les données :

Bloc de code
languagexmljava
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 :

Bloc de code
languagexmljava
themeEclipse
String[] paylineDataResponse = uncompressedData.split(";");

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