...
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]; … |