/**
* Perform an api request, return an array with result details
*
* @param string $endpoint
* @param array $params
* @throws Openbuildings\Emp\Exception If errors in request, api response or the card is declined
* @return array
*/
public function request($endpoint, array $params)
{
$params = array_merge($this->auth_params($endpoint), $params);
$url = $url = $this->_gateway_url . $endpoint;
$options = $this->_options;
if ($this->proxy()) {
$options[CURLOPT_PROXY] = $this->proxy();
}
$response = Remote::post($url, $params, $options);
$xml_response = new \SimpleXMLElement($response);
$trans_id = (string) ($xml_response->transaction->trans_id ?: $xml_response->trans_id);
$response_code = (string) ($xml_response->transaction->response ?: $xml_response->response);
if ($xml_response->errors and $error = $xml_response->errors[0]->error) {
throw new Exception(':error (:code)', array(':error' => (string) $error->text, ':code' => (string) $error->code));
} elseif ((string) $response_code === 'D') {
throw new Exception('Transaction declined: :errors', array(':errors' => (string) $xml_response->transaction->response_text));
}
return array('order_id' => (string) $xml_response->order_id, 'order_status' => (string) $xml_response->order_status, 'transaction_response' => $response_code, 'transaction_id' => $trans_id, 'raw' => json_decode(json_encode($xml_response), TRUE));
}