Skip to content

Instantly share code, notes, and snippets.

@refo
Created February 25, 2015 08:01
Show Gist options
  • Save refo/27fa6bcc9ed19c2ca64b to your computer and use it in GitHub Desktop.
Save refo/27fa6bcc9ed19c2ca64b to your computer and use it in GitHub Desktop.
<?php
/*
Refik ÖNAL
refikonal@gmail.com
20130308.0144
referans dosyalar:
classes/controller/page.php : action_siparis_kayit() - Yusuf Güzel
views/static/3d-test.php
views/static/3d-test2.php
*/
class Ykb {
private $mid = '6700000000';
private $tid = '67000000';
private $posnetid = '00000';
private $username = 'username';
private $password = 'password';
private $ip = '0.0.0.0';
private $id_prefix = 'prefix_';
/** 3D Secure return url
*
* Yeni Ykb instance'ı oluşturulduktan sonra Controller'da set edilebilir.
* Zaten Öylesi daha mantıklı zaten bence
*
* $ykb = new Ykb;
* $ykb->url = URL::site('...');
* $ykb->tds( $tahsilat_bilgileri )
*
*/
public $url = '';
/* Sandbox
private $xml_url = 'http://setmpos.ykb.com/PosnetWebService/XML';
private $tds_url = 'http://setmpos.ykb.com/3DSWebService/YKBPaymentService';
//*/
//* Production
private $xml_url = 'https://www.posnet.ykb.com/PosnetWebService/XML';
private $tds_url = 'https://www.posnet.ykb.com/3DSWebService/YKBPaymentService';
//*/
private $req;
private $xml;
private $xml_res;
private function _create_request()
{
$req = Request::factory($this->xml_url);
$client = $req->client();
$client->options(CURLOPT_SSL_VERIFYHOST, 0);
$client->options(CURLOPT_SSL_VERIFYPEER, 0);
$client->options(CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
$client->options(CURLOPT_INTERFACE, $this->ip);
$xml_root = '<?xml version="1.0" encoding="ISO-8859-9"?><posnetRequest/>';
$xml = new SimpleXMLElement($xml_root);
$xml->addChild('mid', $this->mid);
$xml->addChild('tid', $this->tid);
$xml->addChild('username', $this->username);
$xml->addChild('password', $this->password);
$this->xml = $xml;
return $req;
}
private function _create_xid($len = 20)
{
$uid = (string)uniqid();
if ($len < 14) return $uid;
$id = $this->id_prefix;
$id = substr($id, 0, $len - strlen($uid) - 1) . '_';
$id .= str_pad($uid, $len - strlen($id), '0', STR_PAD_LEFT);
return $id;
}
public function trans($arr)
{
/*
$arr = array(
'cc' => '5526599100034581',
'exp' =>'1402',
'cvc' => '000',
'name' => 'HAYDAR',
'amount' => '100',
);
*/
//..
$req = $this->_create_request();
$reqdata = array(
//'cardHolderName' => $arr['name'],
'ccno' => $arr['cc'],
'expDate' => $arr['exp'],
'cvc' => $arr['cvc'],
'amount' => $arr['amount'],
//'XID' => $this->_create_xid(20),
'orderID' => $this->_create_xid(24),
'currencyCode' => 'YT',
//'tranType' => 'Sale',
);
$this->xml->tranDateRequired = 1;
$xml_req = $this->xml->addChild('sale');
foreach($reqdata as $k => $v) $xml_req->addChild($k, $v);
$req->query('xmldata', $this->xml->asXML() );
$result = new stdClass();
$result->xid = $reqdata['orderID'];
try {
$res = $req->execute();
$xml = new SimpleXMLElement( $res->body() );
$result->xml = $xml;
$result->json = json_encode($xml);
} catch(Exception $e) {
// YKB'den XML dönmedi yada XML'de problem var
$result->ok = FALSE;
$result->error = 'Banka ile irtibata geçilemedi';
return $result;
}
if ( $xml->approved != 1 ) {
$result->ok = FALSE;
$result->error = 'Kart tahsil edilemedi';
return $result;
}
$result->ok = TRUE;
return $result;
}
public function tds_trans()
{
$post = & $_POST;
$xid = $post['Xid'];
/* ---------------------------------------
// Decrypt
// ---------------------------------------
$req = $this->_create_request();
$reqdata = array(
'bankData' => $post['BankPacket'],
'merchantData' => $post['MerchantPacket'],
'sign' => $post['Sign'],
);
$xml_req = $this->xml->addChild('oosResolveMerchantData');
foreach($reqdata as $k => $v) $xml_req->addChild($k, $v);
$req->query('xmldata', $this->xml->asXML() );
$res = $req->execute();
$xml = new SimpleXMLElement( $res->body() );
// ---------------------------------------*/
// ---------------------------------------
// Trans
// ---------------------------------------
$req = $this->_create_request();
$reqdata = array(
'bankData' => $post['BankPacket'],
'wpAmount' => '0', // Kaç puan kullanılsın
);
$xml_req = $this->xml->addChild('oosTranData');
foreach($reqdata as $k => $v) $xml_req->addChild($k, $v);
$req->query('xmldata', $this->xml->asXML() );
$result = new stdClass();
$result->xid = $xid;
try {
$res = $req->execute();
$xml = new SimpleXMLElement( $res->body() );
$result->xml = $xml;
$result->json = json_encode($xml);
} catch(Exception $e) {
// YKB'den XML dönmedi yada XML'de problem var
$result->ok = FALSE;
$result->error = 'Banka ile irtibata geçilemedi';
return $result;
}
if ( $xml->approved != 1 ) {
$result->ok = FALSE;
$result->error = 'Kart tahsil edilemedi';
return $result;
}
$result->ok = TRUE;
$result->xid = $xid;
return $result;
// ---------------------------------------
}
public function tds($arr)
{
/*
$arr = array(
'cc' => '5526599100034581',
'exp' =>'1402',
'cvc' => '000',
'name' => 'HAYDAR',
'amount' => '100',
);
*/
//..
$req = $this->_create_request();
$reqdata = array(
'cardHolderName' => $arr['name'],
'ccno' => $arr['cc'],
'expDate' => $arr['exp'],
'cvc' => $arr['cvc'],
'amount' => $arr['amount'],
'XID' => $this->_create_xid(20),
'posnetid' => $this->posnetid,
'currencyCode' => 'YT',
'installment' => '00',
'tranType' => 'Sale',
);
$xml_req = $this->xml->addChild('oosRequestData');
foreach($reqdata as $k => $v) $xml_req->addChild($k, $v);
$req->query('xmldata', $this->xml->asXML() );
$result = new stdClass();
$result->xid = $reqdata['XID'];
try {
$res = $req->execute();
$xml = new SimpleXMLElement( $res->body() );
$result->xml = $xml;
$result->json = json_encode($xml);
} catch(Exception $e) {
// YKB'den XML dönmedi yada XML'de problem var
$result->ok = FALSE;
$result->error = 'Banka ile irtibata geçilemedi';
return $result;
}
if ( $xml->approved != 1 ) {
$result->ok = FALSE;
$result->error = 'Kart bilgileri hatalı';
return $result;
}
$result->ok = TRUE;
$result->form = $this->_create_tds_form( $xml->oosRequestDataResponse );
return $result;
}
private function _create_tds_form($xml_resdata)
{
$formdata = array(
'mid' => $this->mid,
'posnetID' => $this->posnetid,
'posnetData' => $xml_resdata->data1,
'posnetData2' => $xml_resdata->data2,
'digest' => $xml_resdata->sign,
'vftCode' => '00',
'lang' => 'tr',
'url' => '',
'merchantReturnURL' => $this->url,
'openANewWindow' => '1',
);
$form = Form::open($this->tds_url, array('method'=>'POST', 'target'=>'YKBWindow', 'id'=>'ykb_tds') );
foreach($formdata as $k => $v) $form .= Form::hidden($k, $v);
$form .= Form::close();
$js = '(function(a){a(function(){var b=a("#ykb_tds"),d=a("#ykb_tds_open");b.find("[name=url]").val(location.href);var c=1*b.find("[name=openANewWindow]").val();window.name=c?"merchantWindow":"YKBWindow";d.click(function(){c&&(x=-5,y=-60,screen&&(y=(screen.availHeight-600-70)/2,x=(screen.availWidth-650)/2),window.open("","YKBWindow","width=650,height=600,screenX="+x+",screenY="+y+",top="+y+",left="+x+",status=yes,location=yes,resizable=no,scrollbars=yes"));b.submit()})})})(jQuery);';
$form .= '<script>' . $js . '</script>';
return $form;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment