Интеграция форм SagePay V3 с использованием CFML - шифрование AES
Я успешно прошел всю интеграцию с FORM, кроме шифрования.
Версия 3 требует шифрования AES, и я не понимаю, как реализовать этот этап.
Ранее скрипт CFML создавал поле crypt в конце, используя это:
//** call to include file to encrypt
crypt = base64Encode (SimpleXor(stuff,EncryptionPassword));
Это называется файл функций, который сделал фактическую работу.
Мне нужна помощь в создании нового скрипта в файле function.cfm, а также в том, каким должен быть вызов.
Может кто-нибудь помочь, пожалуйста?
ура
Вот фрагмент кода:
<cfscript>
ThisVendorTxCode = "#sfo_id#";
ThisVendorName = "pivotell";
stuff = "VendorTxCode=" & ThisVendorTxCode & "&";
stuff = stuff & "VendorName=" & ThisVendorName & "&";
</cfscript>
<cfset encryptionKey = generateSecretKey( "AES" ) />
//** call to include file to encrypt
<cfset crypt = encrypt(stuff,encryptionKey,"AES","hex") />
<cfoutput>
<form action="https://test.sagepay.com/gateway/service/vspform-register.vsp" method="post" id="form1" name="form1">
<input type="hidden" name="VPSProtocol" value="3.00">
<input type="hidden" name="TxType" value="PAYMENT">
<input type="hidden" name="Crypt" value="#crypt#">
</form>
</cfoutput>
Я обрезал все это для простоты.
1 ответ
Мне потребовалось 3 дня и 3 ночи, чтобы понять это. Пожалуйста, прочитайте страницу 37 Руководства по интеграции и протоколу формы Sage Pay 3.00.
А1.1 Поле склепа
Поле Crypt должно содержать всю другую информацию о транзакции в виде простого текста в виде полей Name=Value, разделенных символами "&". Убедитесь, что все обязательные поля присутствуют и что после символа "&" нет пробелов.
Затем эта строка должна быть зашифрована с использованием AES (размер блока 128 бит) в режиме CBC с заполнением PKCS#5 с использованием предоставленного пароля в качестве ключа и вектора инициализации и закодировать результат в шестнадцатеричном виде (убедившись, что буквы в верхнем регистре),
Добавьте знак "@" к началу закодированного результата.
Вместе с последним ответом на этот пост. Это должно сортировать это.
... Так как ваша строка пароля не закодирована в base64, полученная длина ключа слишком мала, т.е. (12) вместо (16) байтов.... Решение состоит в том, чтобы сначала кодировать base64... Кроме того, параметр iv должен быть двоичным
<cfset keyIVBytes = charsetDecode(yourKeyString, "utf-8")> <cfset base64Key = binaryEncode(keyIVBytes, "base64")> <cfset result = encrypt(plainString, base64Key,"AES/CBC/PKCS5Padding", "hex", keyIVBytes)>