<?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()) 
    { 
 
    } 
} 
 
 |