1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 08:21:34 +02:00
invoiceninja/vendor/php-payments/lib/payment_request.php
2014-04-13 09:38:15 +03:00

194 lines
3.9 KiB
PHP
Executable File

<?php
class Payment_Request
{
public function __construct(){}
/**
* Returns an xml document
*
* @param array the structure for the xml
* @return string a well-formed XML string
*/
public static function build_xml_request($xml_version, $character_encoding, $xml_params, $parent = NULL, $xml_schema = NULL, $xml_extra = NULL)
{
$encoding = ($character_encoding !== null) ? ' encoding="'.$character_encoding.'"' : '';
$xml = '<?xml version="'.$xml_version.'"'.$encoding.'?>';
if(!is_null($xml_extra))
{
$xml .= '<?'.$xml_extra.'?>';
}
if(!is_null($parent) AND is_null($xml_schema))
{
$xml .= '<'.$parent.'>';
}
if(!is_null($parent) AND !is_null($xml_schema))
{
$xml .= '<'.$parent.' '.$xml_schema.'>';
}
//XML parsing at the server end will break if certain characters are not replaced
Payment_Utility::sanitize_xml_params($xml_params);
$xml .= self::build_nodes($xml_params);
if(!is_null($parent))
{
$xml .= '</'.$parent.'>';
}
return $xml;
}
/**
* Returns a well-formed string of XML nodes
*
* @param array associative array of values
* @return string well-formed XML string
*/
public static function build_nodes($params, $key_to_set = NULL)
{
$string = "";
$dont_wrap = FALSE;
foreach($params as $k=>$v)
{
if(is_bool($v) AND $v === TRUE)
{
$v = 'true';
}
if(is_bool($v) AND $v === FALSE)
{
$v = 'false';
}
if(empty($v) AND $v != '0')
{
unset($k);
continue;
}
if(is_array($v))
{
if($k === 'repeated_key')
{
if($v['wraps'] === FALSE)
{
$dont_wrap = TRUE;
}
$node_name = $v['name'];
$node_contents = self::build_nodes($v['values'], $v['name']);
}
else
{
$node_name = $k;
$node_contents = self::build_nodes($v);
}
}
if(!is_array($v))
{
$node_name = $k;
$node_contents = $v;
}
if($key_to_set !== NULL)
{
$node_name = $key_to_set;
}
if(!empty($node_contents) AND $dont_wrap === TRUE)
{
$string .= $node_contents;
}
if(!empty($node_contents) AND $dont_wrap === FALSE)
{
$string .= '<'.$node_name.'>';
$string .= $node_contents;
$string .= '</'.$node_name.'>';
}
if($node_contents === '0' AND $dont_wrap === TRUE)
{
$string .= $node_contents;
}
if($node_contents === '0' AND $dont_wrap === FALSE)
{
$string .= '<'.$node_name.'>';
$string .= $node_contents;
$string .= '</'.$node_name.'>';
}
}
return $string;
}
/**
* Makes the actual request to the gateway
*
* @param string This is the API endpoint currently being used
* @param string The data to be passed to the API
* @param string A specific content type to define for cURL request
* @return object response object
*/
public static function curl_request($query_string, $payload = NULL, $content_type = NULL, $custom_headers = NULL)
{
$headers = (is_null($custom_headers)) ? array() : $custom_headers;
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $query_string);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_HEADER, 0);
if(is_null($payload))
{
$request = curl_exec($curl);
if($request[0] == '<')
{
return Payment_Utility::parse_xml($request);
}
else
{
return $request;
}
}
else
{
if(is_null($content_type))
{
$xml = TRUE;
$headers[] = "Content-Type: text/xml";
}
else
{
if(strpos($content_type, 'xml') !== FALSE)
{
$xml = TRUE;
}
$headers[] = "Content-Type: $content_type";
}
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_POSTFIELDS, $payload);
$request = curl_exec($curl);
if(isset($xml) && $xml === TRUE)
{
return Payment_Utility::parse_xml($request);
}
else
{
return $request;
}
}
}
}