Tuesday, July 10, 2012

Authorize.Net CIM integration with PHP

 here is the class code to go along with the above code.. if you really need it:

class AuthnetCIMException extends Exception {}

class AuthnetCIM
{
    const USE_PRODUCTION_SERVER  = 0;
    const USE_DEVELOPMENT_SERVER = 1;

    const EXCEPTION_CURL = 10;

    private $params  = array();
    private $items   = array();
    private $success = false;
    private $error   = true;

    private $login;
    private $transkey;
    private $xml;
    private $ch;
    private $response;
    private $url;
    private $resultCode;
    private $code;
    private $text;
    private $profileId;
    private $validation;
    private $paymentProfileId;
    private $results;

    public function __construct($login, $transkey, $test = self::USE_PRODUCTION_SERVER)
    {
        $this->login    = trim($login);
        $this->transkey = trim($transkey);
        if (empty($this->login) || empty($this->transkey))
        {
            trigger_error('You have not configured your ' . __CLASS__ . '() login credentials properly.', E_USER_ERROR);
        }

        $this->test = (bool) $test;
        $subdomain  = ($this->test) ? 'apitest' : 'api';
        $this->url = 'https://' . $subdomain . '.authorize.net/xml/v1/request.api';

        $this->params['customerType']     = 'individual';
        $this->params['validationMode']   = 'liveMode';
        $this->params['taxExempt']        = 'false';
        $this->params['recurringBilling'] = 'false';
    }

    public function __destruct()
    {
        if (isset($this->ch))
        {
            curl_close($this->ch);
        }
    }

    public function __toString()
    {
        if (!$this->params)
        {
            return (string) $this;
        }
        $output  = '<table summary="Authnet Results" id="authnet">' . "\n";
        $output .= '<tr>' . "\n\t\t" . '<th colspan="2"><b>Outgoing Parameters</b></th>' . "\n" . '</tr>' . "\n";
        foreach ($this->params as $key => $value)
        {
            $output .= "\t" . '<tr>' . "\n\t\t" . '<td><b>' . $key . '</b></td>';
            $output .= '<td>' . $value . '</td>' . "\n" . '</tr>' . "\n";
        }

        $output .= '</table>' . "\n";
        if (!empty($this->xml))
        {
            $output .= 'XML: ';
            $output .= htmlentities($this->xml);
        }
        return $output;
    }

    private function process()
    {
        $this->ch = curl_init();
        curl_setopt($this->ch, CURLOPT_URL, $this->url);
     curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, 1);
     curl_setopt($this->ch, CURLOPT_HTTPHEADER, Array("Content-Type: text/xml"));
     curl_setopt($this->ch, CURLOPT_HEADER, 0);
     curl_setopt($this->ch, CURLOPT_POSTFIELDS, $this->xml);
     curl_setopt($this->ch, CURLOPT_POST, 1);
     curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
        $this->response = curl_exec($this->ch);
        if($this->response)
        {
            $this->parseResults();
            if ($this->resultCode === 'Ok')
            {
                $this->success = true;
                $this->error   = false;
            }
            else
            {
                $this->success = false;
                $this->error   = true;
            }
            curl_close($this->ch);
            unset($this->ch);
        }
        else
        {
            throw new AuthnetCIMException('Connection error: ' . curl_error($this->ch) . ' (' . curl_errno($this->ch) . ')', self::EXCEPTION_CURL);
        }
    }
 
 $cim = new AuthnetCIM('api-id', 'api-key', 
                                       AuthnetCIM::USE_DEVELOPMENT_SERVER);
 
 
 
// Process the transaction
  $cim->setParameter('amount', $amount);
  $cim->setParameter('customerProfileId', $customerProfileId);
  $cim->setParameter('customerPaymentProfileId', $customerPaymentProfileId);
  //$cim->setParameter('customerShippingAddressId', $shipping_profile_id);
  $cim->setParameter('cardCode', $cvv);
  $cim->setLineItem('1', 'xxxx', 'xxxxxx', '1', '9.95');
  $cim->createCustomerProfileTransaction();
  
  //test if transaction went through 
  if ($cim->isSuccessful())
  {
  //should we store this approval code??----------------------
   $approval_code = $cim->getAuthCode();
                } 


 
 
 
 
public function createCustomerProfileTransaction($type = 'profileTransAuthCapture')
    {
        $types = array('profileTransAuthCapture', 'profileTransCaptureOnly','profileTransAuthOnly');
        if (!in_array($type, $types))
        {
            trigger_error('createCustomerProfileTransaction() parameter must be"profileTransAuthCapture", "profileTransCaptureOnly", "profileTransAuthOnly", or empty', E_USER_ERROR);
        }

        $this->xml = '<?xml version="1.0" encoding="utf-8"?>
                      <createCustomerProfileTransactionRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">
                          <merchantAuthentication>
                              <name>' . $this->login . '</name>
                              <transactionKey>' . $this->transkey . '</transactionKey>
                          </merchantAuthentication>
                          <refId>'. $this->params['refId'] .'</refId>
                          <transaction>
                              <' . $type . '>
                                  <amount>'. $this->params['amount'] .'</amount>';
        if (isset($this->params['taxAmount']))
        {
            $this->xml .= '
                                  <tax>
                                       <amount>'. $this->params['taxAmount'].'</amount>
                                       <name>'. $this->params['taxName'] .'</name>
                                       <description>'.$this->params['taxDescription'].'</
description>
                                  </tax>';
        }
        if (isset($this->params['shipAmount']))
        {
            $this->xml .= '
                                  <shipping>
                                       <amount>'. $this->params['shipAmount'].'</amount>
                                       <name>'. $this->params['shipName'] .'</name>
                                       <description>'.$this->params['shipDescription'].'</description>
                                  </shipping>';
        }
        if (isset($this->params['dutyAmount']))
        {
            $this->xml .= '
                                  <duty>
                                       <amount>'. $this->params['dutyAmount'].'</amount>
                                       <name>'. $this->params['dutyName'] .'</name>
                                       <description>'.$this->params['dutyDescription'].'</description>
                                  </duty>';
        }
        $this->xml .= '
                                  <lineItems>' . $this->getLineItems() . '</lineItems>
                                  <customerProfileId>'.$this->params['customerProfileId'].'</customerProfileId>
                                  <customerPaymentProfileId>'.$this->params['customerPaymentProfileId'].'</customerPaymentProfileId>
                                  <customerShippingAddressId>'.$this->params['customerShippingAddressId'].'</customerShippingAddressId>';
        if (isset($this->params['orderInvoiceNumber']))
        {
            $this->xml .= '
                                  <order>
                                       <invoiceNumber>'.$this->params['invoiceNumber'].'</orderInvoiceNumber>
                                       <description>'.$this->params['description'].'</orderDescription>
                                       <purchaseOrderNumber>'.$this->params['purchaseOrderNumber'].'</orderPurchaseOrderNumber>
                                  </order>';
        }
        $this->xml .= '
                                  <taxExempt>'. $this->params['taxExempt'].'</taxExempt>
                                  <recurringBilling>'.$this->params['recurringBilling'].'</recurringBilling>
                                  <cardCode>'. $this->params['cardCode'].'</cardCode>';
        if (isset($this->params['orderInvoiceNumber']))
        {
            $this->xml .= '
                                  <approvalCode>'. $this->params['approvalCode'].'</approvalCode>';
        }
        $this->xml .= '
                              </' . $type . '>
                          </transaction>
                      </createCustomerProfileTransactionRequest>';
        $this->process();
    }
 
 
 

No comments:

Post a Comment