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>