2013-04-25 3 views
2

Привет. Я пытаюсь интегрировать интеграцию первого шлюза данных в метод запроса мыла с использованием 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); 

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

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

ответ

16

немного слишком поздно, но в любом случае ... просто сбросить этот код мусора SOAP, heres моя ранняя стадия 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(); 
+1

Не могли бы вы помочь мне рассказать, как/где получить $ hmack_key и $ key_id, пожалуйста? @KukoBits – Potheek

+0

Как вы узнали имя всех переменных JSON? Я не мог найти документацию для этого где угодно? –

+0

Нашел список переменных JSON для тех, кому это помогает! (https://firstdata.zendesk.com/entries/407571-First-Data-Global-Gateway-e4-Web-Service-API-Reference-Guide#4) –

5

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

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

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

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

+0

Вместо этого используйте gmdate(), который всегда будет возвращать время по Гринвичу (независимо от вашего текущего часового пояса). 'gmdate ('c')' – rocksfrow

5

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

УБЕДИТЕСЬ, что вы НЕ используете свои учетные данные ПРОДУКЦИИ для среды DEMO. Они не сработают. Стоп вытягивать ваши волосы :)
все, что вам нужно сделать, это Гото

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

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

+0

СПАСИБО - вау. – rocksfrow

+0

Ваш прогноз был таким же. Я использовал производственные учетные данные. работал как шарм. благодаря –

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