2015-06-29 3 views
0

Я уже просмотрел ответы на другие вопросы по обновлению протокола Sagepay с 2.22 до 3.00, включая ответ на мой собственный предыдущий вопрос.Ошибка Sagepay 5068: метод шифрования не поддерживается (обновление с 2.22 до 3.00)

Я пытаюсь обновить метод шифрования от Xor до AES, поэтому протокол 3.00 будет работать, но до сих пор застрял на ошибке Sagepay 5068: этот метод шифрования не поддерживается. Три веб-сайта моей компании, которые необходимо обновить, основаны на платформе электронной коммерции JShop, которая очень устарела и больше не предлагает поддержки.

Я реализовал два решения, которые были даны как ответы, один из которых взят из документов Sagepay php, доступных на их веб-сайте, но я все еще получаю эту ошибку.

Буду признателен за ввод данных, где я ошибаюсь.

Свяжитесь с Sagepay, но они не очень помогают и ранее направили меня сюда или на страницу своих партнеров.

Protx файл (SagePay): файл

<?php 


    function startProcessor($orderNumber) { 

     global $dbA,$orderArray,$jssStoreWebDirHTTP,$jssStoreWebDirHTTPS,$cartMain; 



     $callBack = "$jssStoreWebDirHTTPS"."gateways/response/protx.php"; 



     $cDetails = returnCurrencyDetails($orderArray["currencyID"]); 



     $gatewayOptions = retrieveGatewayOptions("PROTX"); 

     switch ($gatewayOptions["testMode"]) { 

      case "S": 

       $myAction = "https://test.sagepay.com/Simulator/VSPFormGateway.asp"; 

       break; 

      case "Y": 

       $myAction = "https://test.sagepay.com/gateway/service/vspform-register.vsp"; 

       break; 

      case "N": 

       $myAction = "https://live.sagepay.com/gateway/service/vspform-register.vsp"; 

       break; 

     } 

     $myVendor = $gatewayOptions["vendor"]; 

     $myEncryptionPassword = $gatewayOptions["encryptionPassword"]; 



     $billingAddress = $orderArray["address1"]."\n"; 

     if ($orderArray["address2"] != "") { 

      $billingAddress .= $orderArray["address2"]."\n"; 

     } 

     $billingAddress .= $orderArray["town"]."\n"; 

     $billingAddress .= $orderArray["county"]."\n"; 

     $billingAddress .= $orderArray["country"]; 



     $deliveryAddress = $orderArray["deliveryAddress1"]."\n"; 

     if ($orderArray["deliveryAddress2"] != "") { 

      $deliveryAddress .= $orderArray["deliveryAddress2"]."\n"; 

     } 

     $deliveryAddress .= $orderArray["deliveryTown"]."\n"; 

     $deliveryAddress .= $orderArray["deliveryCounty"]."\n"; 

     $deliveryAddress .= $orderArray["deliveryCountry"]; 





     $crypt = "VendorTxCode=$orderNumber"; 

     $crypt .= "&Amount=".number_format($orderArray["orderTotal"],$cDetails["decimals"],'.',''); 

     $crypt .= "&Currency="[email protected]$cDetails["code"]; 

     $crypt .= "&Description=".$gatewayOptions["description"]; 

     $crypt .= "&SuccessURL=$callBack?xOid=$orderNumber&xRn=".$orderArray["randID"]; 

     $crypt .= "&FailureURL=$callBack?xOid=$orderNumber&xRn=".$orderArray["randID"]; 

     $crypt .= "&BillingSurname=".$orderArray["surname"]; 

     $crypt .= "&BillingFirstnames=".$orderArray["forename"]; 

     $crypt .= "&BillingAddress1=".$orderArray["address1"]; 

     $crypt .= "&BillingCity=".$orderArray["town"]; 

     $crypt .= "&BillingPostCode=".preg_replace("/[^\s\-a-zA-Z0-9]/", "", $orderArray["postcode"]); 

     $crypt .= "&BillingCountry=".$orderArray["country"]; 

     $crypt .= "&DeliverySurname=".$orderArray["surname"]; 

     $crypt .= "&DeliveryFirstnames=".$orderArray["forename"]; 

    if ($orderArray["deliveryPostcode"] != "") { 
     $crypt .= "&DeliveryAddress1=".$orderArray["deliveryAddress1"]; 

     $crypt .= "&DeliveryCity=".$orderArray["deliveryTown"]; 

     $crypt .= "&DeliveryPostCode=".preg_replace("/[^\s\-a-zA-Z0-9]/", "", $orderArray["deliveryPostcode"]); 

     $crypt .= "&DeliveryCountry=".$orderArray["deliveryCountry"]; } 

    else { 
     $crypt .= "&DeliveryAddress1=".$orderArray["address1"]; 

     $crypt .= "&DeliveryCity=".$orderArray["town"]; 

     $crypt .= "&DeliveryPostCode=".preg_replace("/[^\s\-a-zA-Z0-9]/", "", $orderArray["postcode"]); 

     $crypt .= "&DeliveryCountry=".$orderArray["country"]; } 

     $crypt .= "&BillingPhone=".preg_replace("/[^\sa-zA-Z0-9]/", "", $orderArray["telephone"]); 

     if ($gatewayOptions["sendEmail"] == 1) { 
     $crypt .= "&CustomerEmail=".$orderArray["email"]; } 


     $crypt .= "&VendorEmail=".$gatewayOptions["vendorEmail"]; 

     $crypt .= "&ApplyAVSCV2=".$gatewayOptions["cvvCheck"]; 
     $crypt .= "&Apply3dSecure=".$gatewayOptions["3DSecure"]; 




     $crypt = base64_encode(encryptAes($crypt, $myEncryptionPassword)); 

     $tpl = createTSysObject(templatesCreatePath($cartMain["templateSet"]),"gatewaytransfer.html",$requiredVars,0); 



     $gArray["method"] = "POST"; 

     $gArray["action"] = $myAction; 

     $gArray["fields"][] = array("name"=>"VPSProtocol","value"=>"3.00"); 

     $gArray["fields"][] = array("name"=>"Vendor","value"=>$myVendor); 

     $gArray["fields"][] = array("name"=>"TxType","value"=>$gatewayOptions["txType"]); 

     $gArray["fields"][] = array("name"=>"Crypt","value"=>$crypt); 



     $mArray = $gArray; 



     $gArray["process"] = "document.automaticForm.submit();"; 



     $tpl->addVariable("shop",templateVarsShopRetrieve()); 

     $tpl->addVariable("labels",templateVarsLabelsRetrieve()); 



     $tpl->addVariable("automaticForm",$gArray); 

     $tpl->addVariable("manualForm",$mArray); 

     $tpl->showPage(); 

    } 

    function addPKCS5Padding($input) 
    { 
     $blockSize = 16; 
     $padd = ""; 
     $length = $blockSize - (strlen($input) % $blockSize); 
     for ($i = 1; $i <= $length; $i++) 
    { 
     $padd .= chr($length); 
    } 
     return $input . $padd; 
    } 

    function removePKCS5Padding($input) 
    { 
     $blockSize = 16; 
     $padChar = ord($input[strlen($input) - 1]); 
     $unpadded = substr($input, 0, (-1) * $padChar); 
     return $unpadded; 
    } 


    function encryptAes($string, $key) 
    { 
     $string = addPKCS5Padding($string); 
     $crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key); 
     return strtoupper(bin2hex($crypt)); 
    } 


    function decryptAes($strIn, $myEncryptionPassword) 
    { 

    #Sagepay specific - remove the '@' 
    $strIn = substr($strIn,1); 

     $strInitVector = $myEncryptionPassword; 
     $strIn = pack('H*', $hex); 
     $string = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $myEncryptionPassword, $strIn, MCRYPT_MODE_CBC,$strInitVector); 
     return removePKCS5Padding($string); 
    } 

?> 

Ответ:

<?php 

    define("IN_JSHOP", TRUE); 

    include("../../static/config.php"); 

    include("../../routines/dbAccess_".$databaseType.".php"); 

    include("../../routines/tSys.php"); 

    include("../../routines/general.php"); 

    include("../../routines/stockControl.php"); 

    include("../../routines/emailOutput.php"); 

    require_once 'SagepayUtil.php'; 



    dbConnect($dbA); 



    $orderID = makeSafe(getFORM("xOid")); 

    $newOrderID = $orderID; 

    $randID = makeSafe(getFORM("xRn")); 

    $crypt = makeSafe(getFORM("crypt")); 



    $gatewayOptions = retrieveGatewayOptions("PROTX"); 



    $orderID = makeInteger($orderID) - retrieveOption("orderNumberOffset"); 



    $result = $dbA->query("select * from $tableOrdersHeaders where orderID=$orderID and randID='$randID'"); 

    if ($dbA->count($result) == 0 || $crypt=="") { 

     doRedirect_JavaScript($jssStoreWebDirHTTP."index.php"); 

     exit; 

    } 

    $orderArray = $dbA->fetch($result); 

    $ccResult = $dbA->query("select * from $tablePaymentOptions where paymentID=".$orderArray["paymentID"]); 

    $poRecord = $dbA->fetch($ccResult); 

    $paidStatus = $poRecord["statusID"]; 



    $crypt = str_replace(" ","+",$crypt); 

    //$crypt = protx_simpleXor(base64_decode($crypt),$gatewayOptions["encryptionPassword"]); 

    $crypt = decryptAes(base64_decode($crypt), $gatewayOptions["encryptionPassword"]); 



    $nameValues = explode("&",$crypt); 

    $resultCode = ""; 

    for ($f = 0; $f < count($nameValues); $f++) { 

     $thisCode = explode("=",$nameValues[$f]); 

     $resultCode[$thisCode[0]] = $thisCode[1]; 

    } 



    if ($resultCode["VendorTxCode"] != $newOrderID) { 

     doRedirect_JavaScript($jssStoreWebDirHTTP."index.php"); 

     exit; 

    } 



    $authResponse = "&Status Result=".$resultCode["Status"]."&AVS/CV2 Check="[email protected]$resultCode["AVSCV2"]."&Address Result="[email protected]$resultCode["AddressResult"]."&Postcode Result="[email protected]$resultCode["PostCodeResult"]."&CV2 Result="[email protected]$resultCode["CV2Result"]."&3d Secure Status="[email protected]$resultCode["3DSecureStatus"]; 



    $randID = $orderArray["randID"]; 

    if ($orderArray["status"] != $paidStatus) { 

      $dt=date("YmdHis",createOffsetTime()); 

      switch ($resultCode["Status"]) { 

       case "OK": 

       case "AUTHENTICATED": 

       case "REGISTERED": 

        $authResponse="Gateway=Sage Pay&Authorisation Code=".$resultCode["TxAuthNo"]."&Sage Pay Transaction ID=".$resultCode["VPSTxId"]."&Status=Payment Confirmed".$authResponse; 

        $dbA->query("update $tableOrdersHeaders set status=$paidStatus, authInfo=\"$authResponse\", paymentDate=\"$dt\" where orderID=$orderID"); 

        $orderArray["status"] = $paidStatus; 

        //ok, this is where we should do the stock control then. 

        include("process/paidProcessList.php"); 

        doRedirect_JavaScript($jssStoreWebDirHTTPS."process.php?xOid=$newOrderID&xRn=$randID"); 

        break; 

       case "REJECTED": 

        $authResponse="Gateway=Sage Pay&Status=Payment Rejected Due To Rules".$authResponse; 

        $dbA->query("update $tableOrdersHeaders set status=3, authInfo=\"$authResponse\", paymentDate=\"$dt\" where orderID=$orderID"); 

        include("process/failProcessList.php"); 

        doRedirect_JavaScript($jssStoreWebDirHTTPS."process.php?xOid=$newOrderID&xRn=$randID"); 

        break; 

       default: 

        if ($orderArray["status"] == 1) { 

         $authResponse="Gateway=Sage Pay&Status=Payment Failed".$authResponse; 

         $dbA->query("update $tableOrdersHeaders set status=3, authInfo=\"$authResponse\", paymentDate=\"$dt\" where orderID=$orderID"); 

         include("process/failProcessList.php"); 

       } 

        doRedirect_JavaScript($jssStoreWebDirHTTPS."process.php?xOid=$newOrderID&xRn=$randID"); 

        break; 

      } 

    } else { 

      doRedirect_JavaScript($jssStoreWebDirHTTPS."process.php?xOid=$newOrderID&xRn=$randID"); 

    } 



    function addPKCS5Padding($input) 
    { 
     $blockSize = 16; 
     $padd = ""; 
     $length = $blockSize - (strlen($input) % $blockSize); 
     for ($i = 1; $i <= $length; $i++) 
    { 
     $padd .= chr($length); 
    } 
     return $input . $padd; 
    } 

    function removePKCS5Padding($input) 
    { 
     $blockSize = 16; 
     $padChar = ord($input[strlen($input) - 1]); 
     $unpadded = substr($input, 0, (-1) * $padChar); 
     return $unpadded; 
    } 


    function encryptAes($string, $key) 
    { 
     $string = addPKCS5Padding($string); 
     $crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $string, MCRYPT_MODE_CBC, $key); 
     return strtoupper(bin2hex($crypt)); 
    } 


    function decryptAes($strIn, $myEncryptionPassword) 
    { 

    #Sagepay specific - remove the '@' 
    $strIn = substr($strIn,1); 

     $strInitVector = $myEncryptionPassword; 
     $strIn = pack('H*', $hex); 
     $string = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $myEncryptionPassword, $strIn, MCRYPT_MODE_CBC,$strInitVector); 
     return removePKCS5Padding($string); 
    } 

?> 

ответ

0

Убедитесь, что резервные копии файлов, а затем изменить эту строку:

$crypt =base64_encode(encryptAes($crypt, $myEncryptionPassword)); 

к

$crypt = "@".encryptAes($crypt, $myEncryptionPassword); 

И:

$crypt = decryptAes(base64_decode($crypt), $gatewayOptions["encryptionPassword"]); 

To:

$crypt = decryptAes($crypt, $gatewayOptions["encryptionPassword"]); 

Посмотрев на бит расшифровки, удаление «@» уже существует. Я не парень PHP, так что это может быть не идеально!

+0

Я думаю, что это сделано, Рик, спасибо. Ошибка шифрования больше не появляется, но ее заменяет одна из биллинговой страны, которую я должен буду изучить сейчас! :-) – Lauren

+0

@Lauren Я не знаю, помогает ли он, но я где-то читал, что иногда ошибка sagepay с биллинговой страной может быть вызвана плохим или отсутствующим статусом выставления счетов. Возможно, вам нужно будет установить его для пустой строки для адресов GB – Phil

+0

@ Phil_1984_ Спасибо за отзыв - я узнал, что сайт просто отправил страну выставления счетов как имя, а не код ISO, который требуется Sagepay, - удалось найти мой путь это сейчас! – Lauren

0

Дайте ему идти без шифрования base64, и убедитесь, что вы добавляете '@' в начале склепе при кодировании (и удалять его из склепа при расшифровке результата транзакции).

+0

Боюсь, я не уверен, как это сделать, они кажутся простыми! Как я могу удалить шифрование base64? Это так же просто, как удалить этот бит текста? Как добавить «@» в шифрование и удалить его в расшифровке? – Lauren

Смежные вопросы