...
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 | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
<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 | ||||
|---|---|---|---|---|
| ||||
$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 | ||||
|---|---|---|---|---|
| ||||
$uncompressedData = gzdecode($zippedData); |
...
Découper le résultat pour récupérer le résultat de l’appel :
| Bloc de code | ||||
|---|---|---|---|---|
| ||||
$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 | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
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 | ||||
|---|---|---|---|---|
| ||||
String[] paylineDataResponse = uncompressedData.split(";");
String cardToken = paylineDataResponse[0];
String cardExpirationDate = paylineDataResponse[1];
String cardVirtualCVV = paylineDataResponse[2];
String orderReference = paylineDataResponse[3];
… |