• 14-02-2008, 11:30:20
    #1
    Kimlik doğrulama veya yönetimden onay bekliyor.
    Garanti Bankası sanal pos uygulamasını sitemize yerleştirmeye çalışıyorum. Verdikleri koddaki 3DSecure sistemimize biraz uyumsuz olduğundan XML kullanıyorum.

    Aşağıdaki gibi bir kod buldum. Kodda sadece test olması amacıyla <Mode>P</Mode> olan yeri <Mode>T</Mode> olarak değiştirdim.

    <?php include("bag.php");
    
    define ('CURL_METHOD', 'PHP');
    define ('TEST_ORTAMI', 'H');
    
    if (TEST_ORTAMI == 'H') {
    	$apiname = "xxx";
    	$apipass = "xxx";
    	$apiclient = "xxx";
    	$gateway = "https://ccpos.garanti.com.tr/servlet/cc5ApiServer";
    	$type = "Auth";
    	$oid = "";
    	$ip=$_SERVER['REMOTE_ADDR'];
    	$cardno = $_POST['cardno'];
    	$expmonth = $_POST['expmonth'];
    	$expyear = $_POST['expyear'];
    	$cv2 = $_POST['cv2'];
    	$total = $_POST['total'];
    	$taksit = "";
    }
    
    $request = "DATA=<?xml version=\"1.0\" encoding=\"ISO-8859-9\"?>
    <CC5Request>
    <Name>$apiname</Name>
    <Password>$apipass</Password>
    <ClientId>$apiclient</ClientId>
    <IPAddress>$ip</IPAddress>
    <Email></Email>
    <Mode>T</Mode>
    <OrderId>$oid</OrderId>
    <GroupId></GroupId>
    <TransId></TransId>
    <UserId></UserId>
    <Type>$type</Type>
    <Number>$cardno</Number>
    <Expires>$expmonth/$expyear</Expires>
    <Cvv2Val>$cv2</Cvv2Val>
    <Total>$total</Total>
    <Currency>949</Currency>
    <Taksit>$taksit</Taksit>
    <BillTo>
    <Name></Name>
    <Street1></Street1>
    <Street2></Street2>
    <Street3></Street3>
    <City></City>
    <StateProv></StateProv>
    <PostalCode></PostalCode>
    <Country></Country>
    <Company></Company>
    <TelVoice></TelVoice>
    </BillTo>
    <ShipTo>
    <Name></Name>
    <Street1></Street1>
    <Street2></Street2>
    <Street3></Street3>
    <City></City>
    <StateProv></StateProv>
    <PostalCode></PostalCode>
    <Country></Country>
    </ShipTo>
    <Extra></Extra>
    </CC5Request>
    ";
    
    if (CURL_METHOD == "LINUX") 
    {
    	$result = `curl -s -d '$request' $gateway`;
    	$sresult = explode("\n",$result);
    	
    	foreach ($sresult as $da)
    	{
    		$i=strpos($da,">");
    		$j=strrpos($da,"<");
    		$x=strpos($da,"<");
    		$key= substr($da,$x+1,$i-$x-1);
    		$val= substr($da,$i+1,$j-$i-1);
    		$ret[$key]=$val;
    		
    		if ($key == "ProcReturnCode") $ProcReturnCode = $val;
    		if ($key == "AuthCode") $AuthCode = $val;
    		if ($key == "ErrMsg") $ErrMsg = $val;
    		if ($key == "HOSTMSG") $HOSTMSG = $val;
    	}
    }
    else
    {
    	$ch = curl_init();
    	curl_setopt($ch, CURLOPT_URL,$gateway);
    	curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
    	curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    	curl_setopt($ch, CURLOPT_POSTFIELDS, $request);
    	curl_setopt($ch, CURLOPT_VERBOSE, 1);
    	curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    	$result = curl_exec($ch);
    	
    	if (curl_errno($ch)) print curl_error($ch);
    	else curl_close($ch);
    	
    	$response_tag="Response";
    	$posf = strpos ( $result, ("<" . $response_tag . ">") );
    	$posl = strpos ( $result, ("</" . $response_tag . ">") ) ;
    	$Response = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    	
    	$response_tag="OrderId";
    	$posf = strpos ( $result, ("<" . $response_tag . ">") );
    	$posl = strpos ( $result, ("</" . $response_tag . ">") ) ;
    	$OrderId = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    	
    	$response_tag="AuthCode";
    	$posf = strpos ( $result, "<" . $response_tag . ">" );
    	$posl = strpos ( $result, "</" . $response_tag . ">" ) ;
    	$AuthCode = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    	
    	$response_tag="ProcReturnCode";
    	$posf = strpos ( $result, "<" . $response_tag . ">" );
    	$posl = strpos ( $result, "</" . $response_tag . ">" ) ;
    	$ProcReturnCode = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    	
    	$response_tag="ErrMsg";
    	$posf = strpos ( $result, "<" . $response_tag . ">" );
    	$posl = strpos ( $result, "</" . $response_tag . ">" ) ;
    	$ErrMsg = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    	
    	$response_tag="HOSTMSG";
    	$posf = strpos ( $result, "<" . $response_tag . ">" );
    	$posl = strpos ( $result, "</" . $response_tag . ">" ) ;
    	$HOSTMSG = substr ( $result, $posf+strlen($response_tag)+2 , $posl - $posf - strlen($response_tag)-2 ) ;
    }
    
    if (TEST_ORTAMI == 'E')
    {	
    	echo $result; 
    	exit();
    }
    
    echo $ProcReturnCode;
    
    if ($ProcReturnCode == "00")
    {
    	if (!headers_sent($filename, $linenum)) 
    	{
    		header ("Location: odeme_sonuc.php?auth_code=$AuthCode");
    	}
    	else 
    	{
    		$isSSL = $_SERVER['SERVER_PORT'] == '443' ? 'https' : 'http';
    		$host = strlen($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:$_SERVER['SERVER_NAME'];
    		echo '<script LANGUAGE="JavaScript">';
    		echo 'window.location="'. $isSSL .'://'.$host. '/' . 'odeme_sonuc.php?auth_code='.$AuthCode.'";';
    		echo '// -->';
    		echo '</script>';
    	}
    }
    else 
    {
    	switch ($ProcReturnCode)
    	{
    		case "01": $msg = "Kredi kartınız için bankanız provizyon talep etmektedir. İşlem sonuçlanmamıştır."; break;
    		case "02": $msg = "Kredi kartınız için bankanız provizyon talep etmektedir. İşlem sonuçlanmamıştır."; break;
    		case "04": $msg = "Bu kredi kartı ile alışveriş yapamazsınız. Başka bir kartla tekrar deneyiniz."; break;
    		case "05": $msg = "İşlem onaylanmadı. Kredi kartınız ile işlem limitini aşmış olabilirsiniz. Bankanızı arayınız."; break;
    		case "09": $msg = "Kredi kartınız yenilenmiştir. Yenilenmiş kartınız ile tekrar deneyiniz."; break;
    		case "10": $msg = "İşlem onaylanmadı. Başka bir kredi kartı ile işlem yapmayı deneyiniz."; break;
    		case "14": $msg = "Kredi kart numaranız hatalıdır. Kart bilgilerinizi kontrol edip tekrar deneyiniz."; break;
    		case "16": $msg = "Kredi kartınızın bakiyesi yetersiz. Başka bir kredi kartı ile tekrar deneyiniz."; break;
    		case "30": $msg = "Bankanıza ulaşılamadı. Tekrar denemenizi tavsiye ediyoruz."; break;
    		case "36": $msg = "Kredi kartınız kayıp veya çalıntı olarak bildirilmiştir."; break;
    		case "41": $msg = "Kredi kartınız kayıp veya çalıntı olarak bildirilmiştir."; break;
    		case "43": $msg = "Kredi kartınız kayıp veya çalıntı olarak bildirilmiştir."; break;
    		case "51": $msg = "Kredi kartınızın bakiyesi yetersiz. Başka bir kredi kartı ile tekrar deneyiniz."; break;
    		case "54": $msg = "İşlem onaylanmadı. Kartınızı kontrol edip tekrar deneyiniz."; break;
    		case "57": $msg = "İşlem onaylanmadı. Başka bir kredi kartı ile işlem yapmayı deneyiniz."; break;
    		case "58": $msg = "Yetkisiz bir işlem yapıldı. Örn: Kredi kartınızın ait olduğu banka dışında bir bankadan taksitlendirme yapıyor olabilirsiniz. Başka bir kredi kartı ile işlem yapmayı deneyiniz."; break;
    		case "62": $msg = "İşlem onaylanmadı. Başka bir kredi kartı ile işlem yapmayı deneyiniz."; break;
    		case "65": $msg = "Kredi kartınızın günlük işlem limiti dolmuştur. Başka bir kredi kartı ile deneyiniz."; break;
    		case "77": $msg = "İşlem onaylanmadı. Başka bir kredi kartı ile işlem yapmayı deneyiniz."; break;
    		case "82": $msg = "İşlem onaylanmadı. Kart bilgilerinizi kontrol edip tekrar deneyiniz."; break;
    		case "91": $msg = "Bankanıza ulaşılamıyor. Başka bir kredi kartı ile tekrar deneyiniz."; break;
    		case "99": $msg = "Kredi kartı numarası geçersiz. Lütfen tekrar deneyiniz."; break;
    		default: $msg = 'Bir hata oluştu (Hata Kodu:'.$ProcReturnCode.') Tekrar deneyiniz. Sorun devam ederse lütfen bizimle temasa geçiniz.'; break;
    	}
    	if (!headers_sent($filename, $linenum))
    	{
    		header ("Location: odeme_sonuc.php?payment_error=creditcard&error=$ProcReturnCode");
    	}
    	else
    	{		
    		$isSSL = $_SERVER['SERVER_PORT'] == '443' ? 'https' : 'http';
    		$host = strlen($_SERVER['HTTP_HOST'])?$_SERVER['HTTP_HOST']:$_SERVER['SERVER_NAME'];
    		echo '<script LANGUAGE="JavaScript">';
    		echo 'window.location="'. $isSSL .'://'.$host. '/' . 'odeme_sonuc.php?payment_error=creditcard&error='.$ProcReturnCode.'";';
    		echo '// -->';
    		echo '</script>';
    		
    	}
    }
    ?>
    Kaynakta, kodun sorunsuz çalıştığı yazıyor ama ne hatası olursa olsun, $ProcReturnCode 99 veya boş dönüyor.

    Kredi kartı bilgileri girildikten sonra verileri bu sayfaya post ettiriyorum. Acaba yaptığım eksik birşey mi var?

    Düzenleme:
    Kaynak XML dosyasının kodlarına bakınca şöyle bir sonuç çıktı:
    <CC5Response>
      <OrderId>***</OrderId>
      <GroupId>***</GroupId>
      <Response>No Connection/Error Sending</Response>
      <AuthCode></AuthCode>
      <HostRefNum></HostRefNum>
      <ProcReturnCode></ProcReturnCode>
      <TransId>47b3f33b-4a56-3000-0029-00144f7c950d</TransId>
      <ErrMsg></ErrMsg>
      <Extra>
        <TRXDATE>20080214 10:16:54</TRXDATE>
        <NUMCODE>00000099999999</NUMCODE>
      </Extra>
    </CC5Response>
  • 14-02-2008, 13:43:38
    #2
    Değiştirdiğim <Mode>T</Mode> kısmını tekrar <Mode>P</Mode> yapınca sorun düzeldi. Ama nasıl test yapacağımı anlamadım..