Ошибка первой интеграции шлюза оплаты данных ошибка soap


Привет, я пытаюсь интегрировать интеграцию первого платежного шлюза данных в метод запроса soap с использованием php. Я загрузил рабочий образец кода из первых данных, но когда я пытаюсь отправить платеж с помощью предоставленного ими образца кода, он выдает мне ошибку.

Весь php-код

<?php


class SoapClientHMAC extends SoapClient {
  public function __doRequest($request, $location, $action, $version, $one_way = NULL) {
    global $context;
    $hmackey = "***********************"; // <-- Insert your HMAC key here
    $keyid = "*****"; // <-- Insert the Key ID here
    $hashtime = date("c");
    $hashstr = "POST\ntext/xml; charset=utf-8\n" . sha1($request) . "\n" . $hashtime . "\n" . parse_url($location,PHP_URL_PATH);
    $authstr = base64_encode(hash_hmac("sha1",$hashstr,$hmackey,TRUE));
    if (version_compare(PHP_VERSION, '5.3.11') == -1) {
        ini_set("user_agent", "PHP-SOAP/" . PHP_VERSION . "\r\nAuthorization: GGE4_API " . $keyid . ":" . $authstr . "\r\nx-gge4-date: " . $hashtime . "\r\nx-gge4-content-sha1: " . sha1($request));
    } else {
        stream_context_set_option($context,array("http" => array("header" => "authorization: GGE4_API " . $keyid . ":" . $authstr . "\r\nx-gge4-date: " . $hashtime . "\r\nx-gge4-content-sha1: " . sha1($request))));
    }
    return parent::__doRequest($request, $location, $action, $version, $one_way);
  }

  public function SoapClientHMAC($wsdl, $options = NULL) {
    global $context;
    $context = stream_context_create();
    $options['stream_context'] = $context;
    return parent::SoapClient($wsdl, $options);
  }
}

$trxnProperties = array(
  "User_Name"=>"",
  "Secure_AuthResult"=>"",
  "Ecommerce_Flag"=>"",
  "XID"=>"",
  "ExactID"=>$_POST["ddlPOS_ExactID"],                  //Payment Gateway
  "CAVV"=>"",
  "Password"=>"********",                                   //Gateway Password
  "CAVV_Algorithm"=>"",
  "Transaction_Type"=>$_POST["ddlPOS_Transaction_Type"],//Transaction Code I.E. Purchase="00" Pre-Authorization="01" etc.
  "Reference_No"=>$_POST["tbPOS_Reference_No"],
  "Customer_Ref"=>$_POST["tbPOS_Customer_Ref"],
  "Reference_3"=>$_POST["tbPOS_Reference_3"],
  "Client_IP"=>"",                                      //This value is only used for fraud investigation.
  "Client_Email"=>$_POST["tb_Client_Email"],            //This value is only used for fraud investigation.
  "Language"=>$_POST["ddlPOS_Language"],                //English="en" French="fr"
  "Card_Number"=>$_POST["tbPOS_Card_Number"],           //For Testing, Use Test#s VISA="4111111111111111" MasterCard="5500000000000004" etc.
  "Expiry_Date"=>$_POST["ddlPOS_Expiry_Date_Month"] . $_POST["ddlPOS_Expiry_Date_Year"],//This value should be in the format MM/YY.
  "CardHoldersName"=>$_POST["tbPOS_CardHoldersName"],
  "Track1"=>"",
  "Track2"=>"",
  "Authorization_Num"=>$_POST["tbPOS_Authorization_Num"],
  "Transaction_Tag"=>$_POST["tbPOS_Transaction_Tag"],
  "DollarAmount"=>$_POST["tbPOS_DollarAmount"],
  "VerificationStr1"=>$_POST["tbPOS_VerificationStr1"],
  "VerificationStr2"=>"",
  "CVD_Presence_Ind"=>"",
  "Secure_AuthRequired"=>"",
  "Currency"=>"",
  "PartialRedemption"=>"",

  // Level 2 fields 
  "ZipCode"=>$_POST["tbPOS_ZipCode"],
  "Tax1Amount"=>$_POST["tbPOS_Tax1Amount"],
  "Tax1Number"=>$_POST["tbPOS_Tax1Number"],
  "Tax2Amount"=>$_POST["tbPOS_Tax2Amount"],
  "Tax2Number"=>$_POST["tbPOS_Tax2Number"],

  //"SurchargeAmount"=>$_POST["tbPOS_SurchargeAmount"], //Used for debit transactions only
  //"PAN"=>$_POST["tbPOS_PAN"]                          //Used for debit transactions only
  );


$client = new SoapClientHMAC("https://api.demo.globalgatewaye4.firstdata.com/transaction/v12/wsdl");
$trxnResult = $client->SendAndCommit($trxnProperties);


if(@$client->fault){
    // there was a fault, inform
    print "<B>FAULT:  Code: {$client->faultcode} <BR />";
    print "String: {$client->faultstring} </B>";
    $trxnResult["CTR"] = "There was an error while processing. No TRANSACTION DATA IN CTR!";
}
//Uncomment the following commented code to display the full results.

echo "<H3><U>Transaction Properties BEFORE Processing</U></H3>";
echo "<TABLE border='0'>\n";
echo " <TR><TD><B>Property</B></TD><TD><B>Value</B></TD></TR>\n";
foreach($trxnProperties as $key=>$value){
    echo " <TR><TD>$key</TD><TD>:$value</TD></TR>\n";
}
echo "</TABLE>\n";

echo "<H3><U>Transaction Properties AFTER Processing</U></H3>";
echo "<TABLE border='0'>\n";
echo " <TR><TD><B>Property</B></TD><TD><B>Value</B></TD></TR>\n";
foreach($trxnResult as $key=>$value){
    $value = nl2br($value);
    echo " <TR><TD valign='top'>$key</TD><TD>:$value</TD></TR>\n";
}
echo "</TABLE>\n";


// kill object
unset($client);
?>

Когда я отправляю платеж, на моей странице появляется этот конкретный код, и он выдает ошибку

 Fatal error: Uncaught SoapFault exception: [HTTP] in C:\wamp\www\Fd\php\process.php:49 Stack trace: #0 C:\wamp\www\Fd\php\process.php(49): SoapClient->__doRequest('<?xml version="...', 'https://api.dem...', 'http://secure2....', 1, 0) #1 [internal function]: SoapClientHMAC->__doRequest('<?xml version="...', 'https://api.dem...', 'http://secure2....', 1, 0) #2 C:\wamp\www\Fd\php\process.php(104): SoapClient->__call('SendAndCommit', Array) #3 C:\wamp\www\Fd\php\process.php(104): SoapClientHMAC->SendAndCommit(Array) #4 {main} thrown in C:\wamp\www\Fd\php\process.php on line 48.

А строка 48 - это

return parent::__doRequest($request, $location, $action, $version, $one_way);

Я действительно не мог понять выясните, в чем заключается эта ошибка. Гуглил и пробовал различные решения, но безуспешно.Кроме того, на моем php-сервере включены soap и openssl, если это может помочь.

Заранее спасибо за любую помощь.

Author: Syed Sehu Mujammil A, 2013-04-25

4 answers

Немного поздно, но в любом случае... просто сбросьте этот мусорный мыльный код, вот моя версия JSON и CURL на ранней стадии

<?php

class FirstData
{
        protected $host = "api.demo.globalgatewaye4.firstdata.com";
        protected $protocol = "https://";
        protected $uri = "/transaction/v12";

        /*Modify this acording to your firstdata api stuff*/
        protected $hmackey = "XXXXXXXXXXXXXXXXXXXXXXX";
        protected $keyid = "XXXXX";
        protected $gatewayid = "XX000-00";
        protected $password = "XXXXXXX";


        public function request()
        {
                $location = $this->protocol . $this->host . $this->uri;
                $request = array(
                        'transaction_type' => "00",
                        'amount' => 10.00,
                        'cc_expiry' => "0415",
                        'cc_number' => '4111111111111111',
                        'cardholder_name' => 'Test',
                        'reference_no' => '23',
                        'customer_ref' => '11',
                        'reference_3' => '234',
                        'gateway_id' => $this->gatewayid,
                        'password' => $this->password,
                );

                $content = json_encode($request);

                var_dump($content);

                $gge4Date = strftime("%Y-%m-%dT%H:%M:%S", time()) . 'Z';
                $contentType = "application/json";
                $contentDigest = sha1($content);
                $contentSize = sizeof($content);
                $method = "POST";

                $hashstr = "$method\n$contentType\n$contentDigest\n$gge4Date\n$this->uri";

                $authstr = 'GGE4_API ' . $this->keyid . ':' . base64_encode(hash_hmac("sha1", $hashstr, $this->hmackey, true));


                $headers = array( 
                        "Content-Type: $contentType",
                        "X-GGe4-Content-SHA1: $contentDigest",
                        "X-GGe4-Date: $gge4Date",
                        "Authorization: $authstr",
                        "Accept: $contentType"
                );

                //Print the headers we area sending
                var_dump($headers);


                //CURL stuff
                $ch = curl_init();
                curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                curl_setopt($ch, CURLOPT_URL, $location);

                //Warning ->>>>>>>>>>>>>>>>>>>>
                /*Hardcoded for easier implementation, DO NOT USE THIS ON PRODUCTION!!*/
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
                //Warning ->>>>>>>>>>>>>>>>>>>>

                curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
                curl_setopt($ch, CURLOPT_VERBOSE, 0);
                curl_setopt($ch, CURLOPT_HEADER, 1);

                curl_setopt($ch, CURLOPT_POST, 1);
                curl_setopt($ch, CURLOPT_POSTFIELDS, $content);

                //This guy does the job
                $output = curl_exec($ch);

                //echo curl_error($ch); 
                $header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
                $header = $this->parseHeader(substr($output, 0, $header_size));
                $body = substr($output, $header_size);

                curl_close($ch);
                //Print the response header
                var_dump($header);

                /* If we get any of this X-GGe4-Content-SHA1 X-GGe4-Date Authorization
                 * then the API call is valid */
                if (isset($header['authorization']))
                {
                        //Ovbiously before we do anything we should validate the hash
                        var_dump(json_decode($body));
                }
                //Otherwise just debug the error response, which is just plain text
                else
                {
                        echo $body;
                }
        }

        private function parseHeader($rawHeader)
        {
                $header = array();

                //http://blog.motane.lu/2009/02/16/exploding-new-lines-in-php/
                $lines = preg_split('/\r\n|\r|\n/', $rawHeader);

                foreach ($lines as $key => $line)
                {
                        $keyval = explode(': ', $line, 2);

                        if (isset($keyval[0]) && isset($keyval[1]))
                        {
                                $header[strtolower($keyval[0])] = $keyval[1];
                        }
                }

                return $header;
        }
}

$firstdata = new FirstData();

$firstdata->request();
 16
Author: KukoBits, 2013-05-15 03:40:00

Я безуспешно пробовал SOAP, в конце концов мне пришлось переключиться на JSON. Ответ @Kukobit сработал для меня. Единственной проблемой была строка даты, которая ожидается в GMT. Я решил эту проблему, вычислив дату следующим образом:

$gge4Date = strftime("%Y-%m-%dT%H:%M:%S", time() - (int) substr(date('O'), 0, 3)*60*60) . 'Z';

Надеюсь, это поможет.

Пс. Я знаю, что это должен быть комментарий, но из-за ограничений по очкам я не могу.

 5
Author: dhavald, 2013-07-15 22:22:58

Просто предупреждаю тех, кто продолжает получать "Несанкционированный запрос". Неверные или отсутствующие учетные данные.'.

УБЕДИТЕСЬ, что вы НЕ используете свои ПРОИЗВОДСТВЕННЫЕ учетные данные для ДЕМОНСТРАЦИОННОЙ среды. Они не будут работать. Перестань рвать на себе волосы:)
все, что вам нужно сделать, это перейти

Https://firstdata.zendesk.com/entries/21510561-first-data-global-gateway-e4sm-demo-accounts

Зарегистрируйтесь для бесплатной демо-версии. вы создадите свой hmac и получите другие свои данные там, просто как вы делаете на производстве.

 5
Author: Ven, 2015-01-24 00:16:29
$client = new SoapClientHMAC("https://api.demo.globalgatewaye4.firstdata.com/transaction/v12/wsdl");

Удалить ".демо" => "https://api.globalgatewaye4.firstdata.com/transaction/v12/wsdl"

Вы используете прямой доступ в первых данных api

 1
Author: Sergey Stepnev, 2013-04-25 12:08:47