1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-11 13:42:49 +01:00
invoiceninja/vendor/php-payments/lib/payment_drivers/braintree_driver.php
2014-04-13 09:38:15 +03:00

311 lines
7.4 KiB
PHP
Executable File

<?php
class Braintree_Driver extends Payment_Driver
{
/**
* URL to Use
*/
private $_api_url;
/**
* Endpoint to Send the Query To
*/
private $_endpoint;
/**
* The particular API which is being used
*/
private $_api;
/**
* The particular API method which is being used
*/
private $_api_method;
/**
* The PHP Payments library method
*/
private $_lib_method;
/**
* Stores Settings for the Transaction
*/
private $_settings;
/**
* The Constructor Function
*/
public function __construct($config)
{
Payment_Utility::load('file', 'vendor/braintree/lib/Braintree');
$bt_mode = ($config['mode'] == 'test') ? 'sandbox' : 'production';
Braintree_Configuration::environment($bt_mode);
unset($config['mode']);
foreach($config as $k=>$v)
{
//merchantId, publicKey, privateKey need to be set
Braintree_Configuration::$k($v);
}
}
/**
* Call Magic Method
*/
public function __call($method, $params)
{
$args = $params[0];
$method_map = $this->method_map();
$this->_api = $method_map[$method]['api'];
$this->_api_method = (isset($method_map[$method]['method'])) ? $method_map[$method]['method'] : '';
$this->_lib_method = $method;
list($api, $api_method, $params_ready) = $this->_build_request($args);
try {
//If the only param is an id, just use that as a string instead of sending an array
if(count($params_ready) == 1 && isset($params_ready['id']))
{
$response_raw = $api::$api_method($param_ready['id']);
}
else if(count($params_ready) == 2 && isset($params_ready['id']) && isset($params_ready['amount']))
{
$response_raw = $api::$api_method($params_ready['id'], $params_ready['amount']);
}
else
{
$response_raw = $api::$api_method($params_ready);
}
}
catch (Exception $e) {
if(get_class($e) == 'Braintree_Exception_Authentication') $message = "Authentication failed.";
return Payment_Response::instance()->gateway_response(
'failure',
$method.'_gateway_failure',
(isset($message)) ? $message : $e->getMessage()
);
}
return $this->_parse_response($response_raw);
}
/**
* Maps PHP-Payments Methods to Details Particular to Each Request for that Method
*/
public function method_map()
{
$map = array(
'oneoff_payment' => array(
'api' => 'Braintree_Transaction',
'method' => 'sale',
'required' => array(
'cc_number',
'cc_exp',
'amt',
),
'keymatch' => array(
'amt' => 'amount',
'identifier' => 'orderId',
'cc_number' => 'creditCard["number"]',
'cc_exp' => 'creditCard["expirationDate"]',
'cc_code' => 'creditCard["cvv"]',
'first_name' => 'billing["firstName"]',
'last_name' => 'billing["lastName"]',
'street' => 'billing["streetAddress"]',
'street2' => 'billing["extendedAddress"]',
'postal_code' => 'billing["postalCode"]',
'state' => 'billing["region"]',
'country' => 'billing["countryCodeAlpha2"]',
'city' => 'billing["locality"]',
'ship_to_first_name' => 'shipping["firstName"]',
'ship_to_last_name' => 'shipping["lastName"]',
'ship_to_company' => 'shipping["company"]',
'ship_to_street' => 'shipping["streetAddress"]',
'ship_to_city' => 'shipping["locality"]',
'ship_to_state' => 'shipping["state"]',
'ship_to_postal_code' => 'shipping["postalCode"]',
'ship_to_country' => 'shipping["countryCodeAlpha2"]'
),
'static' => array(
'options' => array(
'submitForSettlement' => true
)
)
),
'authorize_payment' => array(
'api' => 'Braintree_Transaction',
'method' => 'sale',
'required' => array(
'cc_number',
'cc_exp',
'amt',
),
'keymatch' => array(
'amt' => 'amount',
'identifier' => 'orderId',
'cc_number' => 'creditCard["number"]',
'cc_exp' => 'creditCard["expirationDate"]',
'cc_code' => 'creditCard["cvv"]',
'first_name' => 'billing["firstName"]',
'last_name' => 'billing["lastName"]',
'street' => 'billing["streetAddress"]',
'street2' => 'billing["extendedAddress"]',
'postal_code' => 'billing["postalCode"]',
'state' => 'billing["region"]',
'country' => 'billing["countryCodeAlpha2"]',
'city' => 'billing["locality"]',
'ship_to_first_name' => 'shipping["firstName"]',
'ship_to_last_name' => 'shipping["lastName"]',
'ship_to_company' => 'shipping["company"]',
'ship_to_street' => 'shipping["streetAddress"]',
'ship_to_city' => 'shipping["locality"]',
'ship_to_state' => 'shipping["state"]',
'ship_to_postal_code' => 'shipping["postalCode"]',
'ship_to_country' => 'shipping["countryCodeAlpha2"]'
),
'static' => array(
'options' => array(
'submitForSettlement' => false
)
)
),
'capture_payment' => array(
'api' => 'Braintree_Transaction',
'method' => 'submitForSettlement',
'required' => array(
'identifier'
),
'keymatch' => array(
'identifier' => 'id'
)
),
'get_transaction_details' => array(
'api' => 'Braintree_Transaction',
'method' => 'find',
'required' => array(
'identifier'
),
'keymatch' => array(
'identifier' => 'id'
)
),
'refund_payment' => array(
'api' => 'Braintree_Transaction',
'method' => 'refund',
'required' => array(
'identifier'
),
'keymatch' => array(
'identifier' => 'id',
'amt' => 'amount'
)
),
);
return $map;
}
/**
* Builds the Request
*/
protected function _build_request($params)
{
$api = $this->_api;
$method = $this->_api_method;
$params_ready = $this->_match_params($params);
//Now we have what we need to build the request
return array($api, $method, $params_ready);
}
/**
* Match the Params
*/
private function _match_params($params)
{
$map = $this->method_map();
$l = $this->_lib_method;
$params_ready = array();
$matcher = $map[$l]['keymatch'];
foreach($params as $k=>$v)
{
if(isset($matcher[$k]))
{
if(strpos($matcher[$k], '["') !== false)
{
$ex = explode('["', $matcher[$k]);
$arr = $ex[0];
$arrk = str_replace('"]', '', $ex[1]);
if(!isset($params_ready[$arr])) $params_ready[$arr] = array();
if($k === 'cc_exp')
{
$d_mm = substr($v, 0, 2);
$d_yyyy = substr($v, 2, 4);
$params_ready[$arr][$arrk] = $d_mm.'/'.$d_yyyy; //set the date
}
else
{
$params_ready[$arr][$arrk] = $v;
}
}
else
{
$key = $matcher[$k];
$val = $v;
$params_ready[$key] = $val;
}
}
else
{
error_log("$k is not a valid param for this method in this driver");
}
}
if(isset($map[$l]['static']))
{
$static = $map[$l]['static'];
foreach($static as $k=>$v)
{
$params_ready[$k] = $v;
}
}
return $params_ready;
}
/**
* Parse the response from the server
*
* @param array
* @return object
*/
protected function _parse_response($response)
{
$details = (object) array();
if(isset($response->transaction->id)) $details->identifier = $response->transaction->id;
$details->timestamp = $response->created;
$details->gateway_response = $response;
if(isset($response->transaction->processorResponseText)) $details->reason = $response->transaction->processorResponseText;
$indicator = ($response->success === true) ? 'success' : 'failure';
return Payment_Response::instance()->gateway_response(
$indicator,
$this->_lib_method.'_'.$indicator,
$details
);
}
}