Projekt

Obecné

Profil

« Předchozí | Další » 

Revize 1276

Přidáno uživatelem Ondřej Fibich před asi 13 roky(ů)

Novinky:

- funguje logovani vsech chyb, vyjimek, warningu a debugu (podle nastaveni promenne 'log_threshold' jejiz hodnot 0 => nic, 1 => jen chyby a vyjimky, 2 => debugovaci symboly, 3 => informacni zpravy)

-- NAVOD NA ZPROVOZNENI: do config.php dejte radek: '$config['log_threshold'] = 1;' a pak už jen spustte: 'mkdir -m 0777 /var/www/freenetis/logs' a nebo znovu nainstalujte FreeNetIS, v instalaci se to dela defaultne

- PHP fatal errory jsou jiz odchytavany stejne jako vyjimky (odesilacim formularem na chyby)

Upravy:

- upraven trida Confid
- odstraneni nepotrebnych souboru

Zobrazit rozdíly:

freenetis/branches/testing/system/libraries/drivers/Payment/Yourpay.php
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Yourpay Payment Driver
*
* $Id: Yourpay.php 1938 2008-02-05 23:47:53Z zombor $
*
* @package Payment
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Payment_Yourpay_Driver implements Payment_Driver
{
// Fields required to do a transaction
private $required_fields = array
(
'card_num' => FALSE,
'expiration_date' => FALSE,
'amount' => FALSE,
'tax' => FALSE,
'shipping' => FALSE,
'cvm_value' => FALSE
);
// Default required values
private $fields = array
(
'card_num' => '',
'expiration_date' => '',
'cvm_value' => '',
'amount' => 0,
'tax' => 0,
'shipping' => 0,
'billing_name' => '',
'billing_address' => '',
'billing_city' => '',
'billing_state' => '',
'billing_zip' => '',
'shipping_name' => '',
'shipping_address' => '',
'shipping_city' => '',
'shipping_state' => '',
'shipping_zip' => ''
);
// The location of the certficate file. Set from the config
private $certificate = './path/to/certificate';
private $test_mode = TRUE;
/**
* Sets the config for the class.
*
* @param array config passed from the library
*/
public function __construct($config)
{
// Check to make sure the certificate is valid
$this->certificate = (file_exists($config['certificate'])) ? $config['certificate'] : FALSE;
if (!$this->certificate)
throw new Kohana_Exception('payment.invalid_certificate', $config['certificate']);
$this->curl_config = $config['curl_config'];
$this->test_mode = $config['test_mode'];
Log::add('debug', 'YourPay.net Payment Driver Initialized');
}
public function set_fields($fields)
{
foreach ((array) $fields as $key => $value)
{
// Do variable translation
switch($key)
{
case 'exp_date':
$key = 'expiration_date';
break;
default:
break;
}
$this->fields[$key] = $value;
if (array_key_exists($key, $this->required_fields) and !empty($value)) $this->required_fields[$key] = TRUE;
}
}
public function process()
{
// Check for required fields
if (in_array(FALSE, $this->required_fields))
{
$fields = array();
foreach ($this->required_fields as $key => $field)
{
if (!$field) $fields[] = $key;
}
throw new Kohana_Exception('payment.required', implode(', ', $fields));
}
$xml ='<order>
<orderoptions>
<ordertype>SALE</ordertype>
<result>'.($this->test_mode) ? 'GOOD' : 'LIVE'.'</result>
</orderoptions>
<merchantinfo>
<configfile>'.$this->config['merchant_id'].'</configfile>
</merchantinfo>
<creditcard>
<cardnumber>'.$this->fields['card_num'].'</cardnumber>
<cardexpmonth>'.substr($this->fields['expiration_date'], 0, 2).'</cardexpmonth>
<cardexpyear>'.substr($this->fields['expiration_date'], 2, 2).'</cardexpyear>
<cvmvalue>'.$this->fields['cvm_value'].'</cvmvalue>
</creditcard>
<payment>
<subtotal>'.$this->fields['amount'].'</subtotal>
<tax>'.$this->fields['tax'].'</tax>
<shipping>'.$this->fields['shipping'].'</shipping>
<chargetotal>'.($this->fields['amount'] + $this->fields['tax'] + $this->fields['shipping']).'</chargetotal>
</payment>
<billing>
<name>'.$this->fields['billing_name'].'</name>
<address1>'.$this->fields['billing_address'].'</address1>
<city>'.$this->fields['billing_city'].'</city>
<state>'.$this->fields['billing_state'].'</state>
<zip>'.$this->fields['billing_zip'].'</zip>
<email>'.$this->fields['email'].'</email>
</billing>
<shipping>
<name>'.$this->fields['shipping_name'].'</name>
<address1>'.$this->fields['shipping_address'].'</address1>
<city>'.$this->fields['shipping_city'].'</city>
<state>'.$this->fields['shipping_state'].'</state>
<zip>'.$this->fields['shipping_zip'].'</zip>
</shipping>
</order>';
$post_url = 'https://secure.linkpt.net:1129/LSGSXML';
$ch = curl_init($post_url);
// Set custom curl options
curl_setopt_array($ch, $this->curl_config);
curl_setopt ($ch, CURLOPT_SSLCERT, $this->certificate);
// Set the curl POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
if ($result = curl_exec ($ch))
{
if (strlen($result) < 2) # no response
throw new Kohana_Exception('payment.gateway_connection_error');
// Convert the XML response to an array
preg_match_all ("/<(.*?)>(.*?)\</", $result, $outarr, PREG_SET_ORDER);
$n = 0;
while (isset($outarr[$n]))
{
$retarr[$outarr[$n][1]] = strip_tags($outarr[$n][0]);
$n++;
}
if ($retarr['r_approved'] == "APPROVED") // SUCCESS
{
return true;
}
else // FAILURE... =(
{
$error = explode(":", $retarr['r_error']);
return $error[1];
}
}
else
throw new Kohana_Exception('payment.gateway_connection_error');
}
} // End Payment_Yourpay_Driver Class
freenetis/branches/testing/system/libraries/drivers/Payment/Authorize.php
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Authorize.net Payment Driver
*
* $Id: Authorize.php 1938 2008-02-05 23:47:53Z zombor $
*
* @package Payment
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Payment_Authorize_Driver implements Payment_Driver
{
// Fields required to do a transaction
private $required_fields = array
(
'x_login' => FALSE,
'x_version' => TRUE,
'x_delim_char' => TRUE,
'x_url' => TRUE,
'x_type' => TRUE,
'x_method' => TRUE,
'x_tran_key' => FALSE,
'x_relay_response' => TRUE,
'x_card_num' => FALSE,
'x_expiration_date' => FALSE,
'x_amount' => FALSE,
);
// Default required values
private $authnet_values = array
(
'x_version' => '3.1',
'x_delim_char' => '|',
'x_delim_data' => 'TRUE',
'x_url' => 'FALSE',
'x_type' => 'AUTH_CAPTURE',
'x_method' => 'CC',
'x_relay_response' => 'FALSE',
);
private $test_mode = TRUE;
/**
* Sets the config for the class.
*
* @param array config passed from the library
*/
public function __construct($config)
{
$this->authnet_values['x_login'] = $config['auth_net_login_id'];
$this->authnet_values['x_tran_key'] = $config['auth_net_tran_key'];
$this->required_fields['x_login'] = !empty($config['auth_net_login_id']);
$this->required_fields['x_tran_key'] = !empty($config['auth_net_tran_key']);
$this->curl_config = $config['curl_config'];
$this->test_mode = $config['test_mode'];
Log::add('debug', 'Authorize.net Payment Driver Initialized');
}
public function set_fields($fields)
{
foreach ((array) $fields as $key => $value)
{
// Do variable translation
switch($key)
{
case 'exp_date':
$key = 'expiration_date';
break;
default:
break;
}
$this->authnet_values['x_'.$key] = $value;
if (array_key_exists('x_'.$key, $this->required_fields) and !empty($value)) $this->required_fields['x_'.$key] = TRUE;
}
}
public function process()
{
// Check for required fields
if (in_array(FALSE, $this->required_fields))
{
$fields = array();
foreach ($this->required_fields as $key => $field)
{
if (!$field) $fields[] = $key;
}
throw new Kohana_Exception('payment.required', implode(', ', $fields));
}
$fields = '';
foreach( $this->authnet_values as $key => $value )
{
$fields .= $key.'='.urlencode($value).'&';
}
$post_url = ($this->test_mode) ?
'https://certification.authorize.net/gateway/transact.dll' : // Test mode URL
'https://secure.authorize.net/gateway/transact.dll'; // Live URL
$ch = curl_init($post_url);
// Set custom curl options
curl_setopt_array($ch, $this->curl_config);
// Set the curl POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim($fields, '& '));
//execute post and get results
$resp = curl_exec($ch);
curl_close ($ch);
if (!$resp)
throw new Kohana_Exception('payment.gateway_connection_error');
// This could probably be done better, but it's taken right from the Authorize.net manual
// Need testing to opimize probably
$h = substr_count($resp, '|');
for($j=1; $j <= $h; $j++)
{
$p = strpos($resp, '|');
if ($p !== FALSE)
{
$pstr = substr($text, 0, $p);
$pstr_trimmed = substr($pstr, 0, -1); // removes "|" at the end
if($pstr_trimmed=='')
{
throw new Kohana_Exception('payment.gateway_connection_error');
}
switch($j)
{
case 1:
if($pstr_trimmed=='1') // Approved
return TRUE;
else
return FALSE;
default:
return FALSE;
}
}
}
}
} // End Payment_Authorize_Driver Class
freenetis/branches/testing/system/libraries/drivers/Payment/Paypal.php
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Paypal Payment Driver
*
* You have to set payerid after authorizing with paypal:
* $this->paypment->payerid = $this->input->get('payerid');
*
* $Id: Paypal.php 1938 2008-02-05 23:47:53Z zombor $
*
* @package Payment
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Payment_Paypal_Driver implements Payment_Driver {
private $required_fields = array
(
'API_UserName' => FALSE,
'API_Password' => FALSE,
'API_Signature' => FALSE,
'API_Endpoint' => TRUE,
'version' => TRUE,
'Amt' => FALSE,
'PAYMENTACTION' => TRUE,
'ReturnUrl' => FALSE,
'CANCELURL' => FALSE,
'CURRENCYCODE' => TRUE
);
private $paypal_values = array
(
'API_UserName' => '',
'API_Password' => '',
'API_Signature' => '',
'API_Endpoint' => 'https://api-3t.paypal.com/nvp',
'version' => '3.0',
'Amt' => 0,
'PAYMENTACTION' => 'Sale',
'ReturnUrl' => '',
'CANCELURL' => '',
'error_url' => '',
'CURRENCYCODE' => 'USD',
'payerid' => ''
);
private $paypal_url = '';
/**
* Sets the config for the class.
*
* @param array config passed from the library
*/
public function __construct($config)
{
$this->paypal_values['API_UserName'] = $config['API_UserName'];
$this->paypal_values['API_Password'] = $config['API_Password'];
$this->paypal_values['API_Signature'] = $config['API_Signature'];
$this->paypal_values['ReturnUrl'] = $config['ReturnUrl'];
$this->paypal_values['CANCELURL'] = $config['CANCELURL'];
$this->paypal_values['CURRENCYCODE'] = $config['CURRENCYCODE'];
$this->paypal_values['API_Endpoint'] = ($config['test_mode']) ? 'https://api.sandbox.paypal.com/nvp' : 'https://api-3t.paypal.com/nvp';
$this->paypal_url = ($config['test_mode'])
? 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token='
: 'https://www.paypal.com/webscr&cmd=_express-checkout&token=';
$this->required_fields['API_UserName'] = !empty($config['API_UserName']);
$this->required_fields['API_Password'] = !empty($config['API_Password']);
$this->required_fields['API_Signature'] = !empty($config['API_Signature']);
$this->required_fields['ReturnUrl'] = !empty($config['ReturnUrl']);
$this->required_fields['CANCELURL'] = !empty($config['CANCELURL']);
$this->required_fields['CURRENCYCODE'] = !empty($config['CURRENCYCODE']);
$this->curl_config = $config['curl_config'];
$this->session = new Session();
$this->input = new Input();
Log::add('debug', 'PayPal Payment Driver Initialized');
}
public function set_fields($fields)
{
foreach ((array) $fields as $key => $value)
{
// Do variable translation
switch($key)
{
case 'amount':
$key = 'Amt';
break;
default:
break;
}
$this->paypal_values[$key] = $value;
if (array_key_exists($key, $this->required_fields) AND !empty($value))
{
$this->required_fields[$key] = TRUE;
}
}
}
public function process()
{
// Make sure the payer ID is set. We do it here because it's not required the first time around.
if ($this->session->get('paypal_token') AND isset($this->paypal_values['payerid']))
{
$this->required_fields['payerid'] = TRUE;
}
elseif ($this->session->get('paypal_token'))
{
$this->required_fields['payerid'] = FALSE;
}
// Check for required fields
if (in_array(FALSE, $this->required_fields))
{
$fields = array();
foreach ($this->required_fields as $key => $field)
{
if ( ! $field)
{
$fields[] = $key;
}
}
throw new Kohana_Exception('payment.required', implode(', ', $fields));
}
if ( ! $this->session->get('paypal_token'))
{
$this->paypal_login();
return FALSE;
}
// Post data for submitting to server
$data = '&TOKEN='.$this->session->get('paypal_token').
'&PAYERID='.$this->paypal_values['payerid'].
'&IPADDRESS='.urlencode($_SERVER['SERVER_NAME']).
'&Amt='.$this->paypal_values['Amt'].
'&PAYMENTACTION='.$this->paypal_values['PAYMENTACTION'].
'&ReturnUrl='.$this->paypal_values['ReturnUrl'].
'&CANCELURL='.$this->paypal_values['CANCELURL'] .
'&CURRENCYCODE='.$this->paypal_values['CURRENCYCODE'].'&COUNTRYCODE=US';
$response = $this->contact_paypal('DoExpressCheckoutPayment', $data);
$nvpResArray = $this->deformatNVP($response);
return ($nvpResArray['ACK'] == TRUE);
}
/**
* Runs paypal authentication.
*/
protected function paypal_login()
{
$data = '&Amt='.$this->paypal_values['Amt'].
'&PAYMENTACTION='.$this->paypal_values['PAYMENTACTION'].
'&ReturnURL='.$this->paypal_values['ReturnUrl'].
'&CancelURL='.$this->paypal_values['CANCELURL'];
$reply = $this->contact_paypal('SetExpressCheckout', $data);
$this->session->set(array('reshash' => $reply));
$reply = $this->deformatNVP($reply);
$ack = strtoupper($reply['ACK']);
if ($ack == 'SUCCESS')
{
$paypal_token = urldecode($reply['TOKEN']);
// Redirect to paypal.com here
$this->session->set(array('paypal_token' => $paypal_token));
// We are off to paypal to login!
url::redirect($this->paypal_url.$paypal_token);
}
else // Something went terribly wrong...
{
Log::add('error', Kohana::debug($reply));
url::redirect($this->paypal_values['error_url']);
}
}
/**
* Runs the CURL methods to communicate with paypal.
*
* @param string paypal API call to run
* @param string any additional query string data to send to paypal
* @return mixed
*/
protected function contact_paypal($method, $data)
{
$final_data = 'METHOD='.urlencode($method).
'&VERSION='.urlencode($this->paypal_values['version']).
'&PWD='.urlencode($this->paypal_values['API_Password']).
'&USER='.urlencode($this->paypal_values['API_UserName']).
'SIGNATURE='.urlencode($this->paypal_values['API_Signature']).$data;
Log::add('debug', 'Connecting to '.$this->paypal_values['API_Endpoint']);
$ch = curl_init($this->paypal_values['API_Endpoint']);
// Set custom curl options
curl_setopt_array($ch, $this->curl_config);
curl_setopt($ch, CURLOPT_POST, 1);
// Setting the nvpreq as POST FIELD to curl
curl_setopt($ch, CURLOPT_POSTFIELDS, $final_data);
// Getting response from server
$response = curl_exec($ch);
if (curl_errno($ch))
{
// Moving to error page to display curl errors
$this->session->set_flash(array('curl_error_no' => curl_errno($ch), 'curl_error_msg' => curl_error($ch)));
url::redirect($this->error_url);
}
else
{
curl_close($ch);
}
return $response;
}
/**
* This is from paypal. It decodes their return string and converts it into an array.
* We can probably rewrite this better, but it works, so its going in for now.
*
* @param string query string
* @return array
*/
protected function deformatNVP($nvpstr)
{
$intial = 0;
$nvpArray = array();
while (strlen($nvpstr))
{
// Postion of Key
$keypos = strpos($nvpstr, '=');
// Position of value
$valuepos = strpos($nvpstr, '&') ? strpos($nvpstr, '&') : strlen($nvpstr);
// Getting the Key and Value values and storing in a Associative Array
$keyval = substr($nvpstr, $intial, $keypos);
$valval = substr($nvpstr, $keypos + 1, $valuepos - $keypos - 1);
// Decoding the respose
$nvpArray[urldecode($keyval)] = urldecode( $valval);
$nvpstr = substr($nvpstr, $valuepos + 1, strlen($nvpstr));
}
return $nvpArray;
}
} // End Payment_Paypal_Driver Class
freenetis/branches/testing/system/libraries/drivers/Payment/Trustcommerce.php
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Trustcommerce Payment Driver
*
* $Id: Trustcommerce.php 1938 2008-02-05 23:47:53Z zombor $
*
* @package Payment
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Payment_Trustcommerce_Driver implements Payment_Driver
{
// Fields required to do a transaction
private $required_fields = array
(
'custid' => TRUE,
'password' => TRUE,
'action' => TRUE,
'media' => TRUE,
'cc' => FALSE,
'exp' => FALSE,
'amount' => FALSE
);
private $tclink_library = './path/to/library';
private $test_mode = TRUE;
private $fields = array('demo' => 'n');
/**
* Sets the config for the class.
*
* @param array config passed from the library
*/
public function __construct($config)
{
$this->test_mode = $config['test_mode'];
$this->tclink_library = $config['tclink_library'];
$this->fields['ip'] = $_SERVER['REMOTE_ADDR'];
$this->fields['custid'] = $config['custid'];
$this->fields['password'] = $config['password'];
$this->fields['action'] = 'sale';
$this->fields['media'] = $config['media'];
if (!extension_loaded('tclink'))
{
if (!dl($this->tclink_library))
{
throw new Kohana_Exception('payment.no_dlib', $this->tclink_library);
}
}
Log::add('debug', 'TrustCommerce Payment Driver Initialized');
}
public function set_fields($fields)
{
foreach ((array) $fields as $key => $value)
{
// Do variable translation
switch($key)
{
case 'card_num':
$key = 'cc';
break;
case 'exp_date':
$key = 'exp';
if (strlen($value) == 3) $value = '0'.$value;
break;
case 'amount':
$value = $value * 100;
break;
case 'address':
$key = 'address1';
break;
case 'ship_to_address':
$key = 'shipto_address1';
break;
case 'ship_to_city':
$key = 'shipto_city';
break;
case 'ship_to_state':
$key = 'shipto_state';
break;
case 'ship_to_zip':
$key = 'shipto_zip';
break;
case 'cvv':
$value = (int) $value;
break;
default:
break;
}
$this->fields[$key] = $value;
if (array_key_exists($key, $this->required_fields) and !empty($value))
{
$this->required_fields[$key] = TRUE;
}
}
}
public function process()
{
if ($this->test_mode)
$this->fields['demo'] = 'y';
$this->fields['name'] = $this->fields['first_name'].' '.$this->fields['last_name'];
$this->fields['shipto_name'] = $this->fields['ship_to_first_name'].' '.$this->fields['ship_to_last_name'];
unset($this->fields['first_name'], $this->fields['last_name'],$this->fields['ship_to_first_name'],$this->fields['ship_to_last_name']);
// Check for required fields
if (in_array(FALSE, $this->required_fields))
{
$fields = array();
foreach ($this->required_fields as $key => $field)
{
if ( ! $field)
{
$fields[] = $key;
}
}
throw new Kohana_Exception('payment.required', implode(', ', $fields));
}
$result = tclink_send($this->fields);
// Report status
if ($result['status'] == 'approved')
return TRUE;
elseif ($result['status'] == 'decline')
return Kohana::lang('payment.error', 'payment_Trustcommerce.decline.'.$result[$result['status'].'type']);
else
return Kohana::lang('payment.error', Kohana::lang('payment_Trustcommerce.'.$result['status'].'.'.$result['error']));
}
} // End Payment_Trustcommerce_Driver Class
freenetis/branches/testing/system/libraries/drivers/Payment/Trident.php
<?php defined('SYSPATH') or die('No direct script access.');
/**
* Trident Payment Driver
*
* $Id: Trident.php 1938 2008-02-05 23:47:53Z zombor $
*
* @package Payment
* @author Kohana Team
* @copyright (c) 2007-2008 Kohana Team
* @license http://kohanaphp.com/license.html
*/
class Payment_Trident_Driver implements Payment_Driver
{
// Fields required to do a transaction
private $required_fields = array
(
'profile_id' => FALSE,
'profile_key' => FALSE,
'card_number' => FALSE,
'card_exp_date' => FALSE,
'transaction_amount' => FALSE,
'transaction_type' => FALSE
);
private $fields = array
(
'profile_id' => '',
'profile_key' => '',
'card_number' => '',
'card_exp_date' => '',
'transaction_amount' => '',
'transaction_type' => ''
);
private $test_mode = TRUE;
/**
* Sets the config for the class.
*
* @param array config passed from the library
*/
public function __construct($config)
{
$this->fields['profile_id'] = $config['profile_id'];
$this->fields['profile_key'] = $config['profile_key'];
$this->fields['transaction_type'] = $config['transaction_type'];
$this->required_fields['profile_id'] = !empty($config['profile_id']);
$this->required_fields['profile_key'] = !empty($config['profile_key']);
$this->required_fields['transaction_type'] = !empty($config['transaction_type']);
$this->curl_config = $config['curl_config'];
$this->test_mode = $config['test_mode'];
Log::add('debug', 'Trident Payment Driver Initialized');
}
public function set_fields($fields)
{
foreach ((array) $fields as $key => $value)
{
// Do variable translation
switch($key)
{
case 'card_num':
$key = 'card_number';
break;
case 'exp_date':
$key = 'card_exp_date';
break;
case 'amount':
$key = 'transaction_amount';
break;
case 'tax':
$key = 'tax_amount';
break;
case 'cvv':
$key = 'cvv2';
break;
default:
break;
}
$this->fields[$key] = $value;
if (array_key_exists($key, $this->required_fields) and !empty($value)) $this->required_fields[$key] = TRUE;
}
}
public function process()
{
// Check for required fields
if (in_array(FALSE, $this->required_fields))
{
$fields = array();
foreach ($this->required_fields as $key => $field)
{
if (!$field) $fields[] = $key;
}
throw new Kohana_Exception('payment.required', implode(', ', $fields));
}
$fields = '';
foreach( $this->fields as $key => $value )
{
$fields .= $key.'='.urlencode($value).'&';
}
$post_url = ($this->test_mode)
? 'https://test.merchante-solutions.com/mes-api/tridentApi' // Test mode URL
: 'https://api.merchante-solutions.com/mes-api/tridentApi'; // Live URL
$ch = curl_init($post_url);
// Set custom curl options
curl_setopt_array($ch, $this->curl_config);
// Set the curl POST fields
curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim( $fields, "& " ));
// Execute post and get results
$response = curl_exec($ch);
curl_close ($ch);
if (!$response)
throw new Kohana_Exception('payment.gateway_connection_error');
$response = explode('&', $response);
foreach ($response as $code)
{
$temp = explode('=', $code);
$response[$temp[0]] = $temp[1];
}
return ($response['error_code'] == '000') ? TRUE : Kohana::lang('payment.error', Kohana::lang('payment_Trident.'.$response['error_code']));
}
} // End Payment_Trident_Driver Class

Také k dispozici: Unified diff