| 
<?php
 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 
 namespace AktiveMerchant\Billing\Gateways;
 
 use AktiveMerchant\Billing\Interfaces as Interfaces;
 use AktiveMerchant\Billing\Gateway;
 use AktiveMerchant\Billing\CreditCard;
 use AktiveMerchant\Billing\Response;
 
 /**
 * Integration of Example gateway
 *
 * @author   Your name <[email protected]>
 * @license  MIT License http://www.opensource.org/licenses/mit-license.php
 */
 class Example extends Gateway implements
 Interfaces\Charge,
 Interfaces\Credit,
 Interfaces\Store
 {
 const TEST_URL = 'https://example.com/test';
 const LIVE_URL = 'https://example.com/live';
 
 /**
 * {@inheritdoc}
 */
 public static $money_format = 'dollars';
 
 /**
 * {@inheritdoc}
 */
 public static $supported_countries = array();
 
 /**
 * {@inheritdoc}
 */
 public static $supported_cardtypes = array(
 'visa',
 'master',
 'american_express',
 'switch',
 'solo',
 'maestro'
 );
 
 /**
 * {@inheritdoc}
 */
 public static $homepage_url = 'http://www.example.net';
 
 /**
 * {@inheritdoc}
 */
 public static $display_name = 'New Gateway';
 
 /**
 * {@inheritdoc}
 */
 public static $default_currency = 'USD';
 
 /**
 * Additional options needed by gateway
 *
 * @var array
 */
 private $options;
 
 /**
 * Contains the main body of the request.
 *
 * @var array
 */
 private $post;
 
 /**
 * Creates gateway instance from given options.
 *
 * @param array $options An array contains login parameters of merchant
 *                       and optional currency.
 */
 public function __construct($options = array())
 {
 $this->required_options('login, password', $options);
 
 if (isset($options['currency'])) {
 self::$default_currency = $options['currency'];
 }
 
 $this->options = $options;
 }
 
 /**
 * {@inheritdoc}
 */
 public function authorize($money, CreditCard $creditcard, $options = array())
 {
 $this->addInvoice($options);
 $this->addCreditCard($creditcard);
 $this->addAddress($options);
 $this->addCustomerData($options);
 
 return $this->commit('authonly', $money);
 }
 
 /**
 * {@inheritdoc}
 */
 public function purchase($money, CreditCard $creditcard, $options = array())
 {
 $this->addInvoice($options);
 $this->addCreditcard($creditcard);
 $this->addAddress($options);
 $this->addCustomerData($options);
 
 return $this->commit('sale', $money);
 }
 
 /**
 * {@inheritdoc}
 */
 public function capture($money, $authorization, $options = array())
 {
 $this->post = array('authorization_id' => $authorization);
 $this->addCustomerData($options);
 
 return $this->commit('capture', $money);
 }
 
 /**
 * {@inheritdoc}
 */
 public function void($authorization, $options = array())
 {
 $this->post = array('authorization' => $authorization);
 return $this->commit('void', null);
 }
 
 /**
 * {@inheritdoc}
 */
 public function credit($money, $identification, $options = array())
 {
 $this->post = array('authorization' => $identification);
 
 $this->addInvoice($options);
 return $this->commit('credit', $money);
 }
 
 /**
 * Customer data like e-mail, ip, web browser used for transaction etc
 *
 * @param array $options
 */
 private function addCustomerData($options)
 {
 
 }
 
 /**
 * Options key can be 'shipping address' and 'billing_address' or 'address'
 *
 * Each of these keys must have an address array like:
 * <code>
 *      $address['name']
 *      $address['company']
 *      $address['address1']
 *      $address['address2']
 *      $address['city']
 *      $address['state']
 *      $address['country']
 *      $address['zip']
 *      $address['phone']
 * </code>
 * common pattern for address is
 * <code>
 * $billing_address = isset($options['billing_address'])
 *      ? $options['billing_address']
 *      : $options['address'];
 * $shipping_address = $options['shipping_address'];
 * </code>
 *
 * @param array $options
 *
 * @return void
 */
 private function addAddress($options)
 {
 
 }
 
 /**
 * Adds invoice info if exist.
 *
 * @param array $options
 */
 private function addInvoice($options)
 {
 
 }
 
 /**
 * Adds a CreditCard object
 *
 * @param CreditCard $creditcard
 */
 private function addCreditcard(CreditCard $creditcard)
 {
 
 }
 
 /**
 * Parse the raw data response from gateway
 *
 * @param string $body
 *
 * @return array|stdClass The parsed response data.
 */
 private function parse($body)
 {
 
 }
 
 /**
 *
 * @param string $action
 * @param number $money
 * @param array  $parameters
 *
 * @return Response
 */
 private function commit($action, $money, $parameters = array())
 {
 $url = $this->isTest() ? self::TEST_URL : self::LIVE_URL;
 
 $data = $this->ssl_post($url, $this->post_data($action, $parameters));
 
 $response = $this->parse($data);
 
 $test_mode = $this->isTest();
 
 return new Response(
 $this->successFrom($response),
 $this->messageFrom($response),
 $response,
 array(
 'test' => $test_mode,
 'authorization' => $response['authorization_id'],
 'fraud_review' => $this->fraudReviewFrom($response),
 'avs_result' => $this->avsResultFrom($response),
 'cvv_result' => $response['card_code']
 )
 );
 }
 
 /**
 * Returns success flag from gateway response
 *
 * @param array $response
 *
 * @return string
 */
 private function successFrom($response)
 {
 return $response['success_code_from_gateway'];
 }
 
 /**
 * Returns message (error explanation  or success) from gateway response
 *
 * @param array $response
 *
 * @return string
 */
 private function messageFrom($response)
 {
 return $response['message_from_gateway'];
 }
 
 /**
 * Returns fraud review from gateway response
 *
 * @param array $response
 *
 * @return string
 */
 private function fraudReviewFrom($response)
 {
 
 }
 
 /**
 *
 * Returns avs result from gateway response
 *
 * @param array $response
 *
 * @return string
 */
 private function avsResultFrom($response)
 {
 return array('code' => $response['avs_result_code']);
 }
 
 /**
 * Adds final parameters to post data and
 * build $this->post to the format that your payment gateway understands
 *
 * @param  string $action
 * @param  array  $parameters
 *
 * @return void
 */
 private function postData($action, $parameters = array())
 {
 
 }
 }
 
 |