Need help with skipjack API

2 replies
Hello all,

Am running out of options here.

I had integrated this api some 2+ years ago but blocked how to do it out of my mind because the client never paid for the job... Just took it and ran.

So my current problem is that one of my supposed "best developers" took on the project and has now just disappeared leaving me with a ticked off client and an unfinished site :'(

I have found some casses on php classes and neither have worked. I have searched high and low for any examples to no avail. If anyone has suggestions I would be willing to hear you out.

Heres the class file and the last file in the sequence of steps for this site.

PHP Code:
<?php
/**
 * 2008-24-01 11:28:17est
 * 
 * Skipjack
 * 
 * <usage>
 *     $sj = new Skipjack();
 *     $sj->setDeveloper(true); // use the development server address
 * 
 *     $sj->addFields(array(
 *         'OrderNumber' => '5',
 *         'ItemNumber' => 'i5',
 *         'ItemDescription' => 'Test Item',
 *         'ItemCost' => '5.50',
 *         'Quantity' => '1',
 *         'Taxable' => '0',
 *         'AccountNumber' => '4445999922225',
 *         'Month' => '12',
 *         'Year' => '2010',
 *         'TransactionAmount' => '200.00'
 *     ));
 *  
 *     if($sj->process() && $sj->isApproved()) {
 *         echo "Transaction approved!";
 *     } else {
 *         echo "Transaction declined!\n";
 *         echo $sj->getErrors();
 *     }
 * </usage>
 * 
 * Used to connect to the Skipjack API and submit credit card orders that need
 * to be authorized.
 * 
 * @author    Steven Vondruska, Bret Kuhns
 * @link    http://imgserver.skipjack.com/imgServer/5293710/skipjack_integration_guide.pdf
 * @license http://www.opensource.org/licenses/mit-license.php MIT License
 * @access    public
 */
class Skipjack {
    var 
$fields = array();        // Fields to be posted to the API
    
var $response = array();    // Reponse array returned after query
    
var $errors = array();        // Any errors that might have populated
    
    // REPLACE THESE VALUES WITH YOUR OWN GIVEN BY SKIPJACK
    
var $serialNumber    '001099855086';
    var 
$devSerialNumber '002806107202';
    
    var 
$DEVELOPER false;
    
    
// Required fields from pages 49-50 in API manual
    
var $requiredFields = array(
            
'SerialNumber''DeveloperSerialNumber''OrderNumber''ItemNumber',
            
'ItemDescription''ItemCost''Quantity''Taxable''SJName',
            
'Email''StreetAddress''City''State''ZipCode'
            
'ShipToPhone''OrderString''AccountNumber''Month''Year',
            
'TransactionAmount'
        
);
    
// recommended dummy values from page 50 in API manual
    
var $dummyVals = array(
            
'SJName' => 'NA',
            
'Email'  => 'None',
            
'StreetAddress' => 'None',
            
'City' => 'None',
            
'State' => 'XX',
            
'ZipCode' => '00000',
            
'ShipToPhone' => '0000000000',
            
'OrderString' => '1~None~0.00~0~N~||'
        
);
    var 
$authCodes = array(
            
=> 'Source Unknown',
            
=> 'STIP, Timeout Response',
            
=> 'LCS Response',
            
=> 'STIP, Issuer in Suppression',
            
=> 'STIP Reponse, Issuer Unavailable',
            
=> 'Issuer Aproval',
            
=> 'Aquirer Approval, Base 1 Down',
            
=> 'Aquirer Approval of Referral'
        
);
    var 
$errorCodes = array(
            
"1"      => "Success (Valid Data)",
            
"-35" => "Invalid credit card number",
            
"-37" => "Error failed communication",
            
"-39" => "Error length serial number",
            
"-51" => "Invalid Billing Zip Code",
            
"-52" => "Invalid Shipto zip code",
            
"-53" => "Invalid expiration date",
            
"-54" => "Error length account number date",
            
"-55" => "Invalid Billing Street Address",
            
"-56" => "Invalid Shipto Street Address",
            
"-57" => "Error length transaction amount",
            
"-58" => "Invalid Name",
            
"-59" => "Error length location",
            
"-60" => "Invalid Billing State",
            
"-61" => "Invalid Shipto State",
            
"-62" => "Error length order string",
            
"-64" => "Invalid Phone Number",
            
"-65" => "Empty name",
            
"-66" => "Empty email",
            
"-67" => "Empty street address",
            
"-68" => "Empty city",
            
"-69" => "Empty state",
            
"-79" => "Error length customer name",
            
"-80" => "Error length shipto customer name",
            
"-81" => "Error length customer location",
            
"-82" => "Error length customer state",
            
"-83" => "Invalid Phone Number",
            
"-84" => "Pos error duplicate ordernumber",
            
"-91" => "Pos_error_CVV2",
            
"-92" => "Pos_error_Error_Approval_Code",
            
"-93" => "Pos_error_Blind_Credits_Not_Allowed",
            
"-94" => "Pos_error_Blind_Credits_Failed",
            
"-95" => "Pos_error_Voice_Authorizations_Not_Allowed"
        
);
    
    
    
/**
     * Constructor
     *
     * @param    String    $serial
     * @param    String    $developer
     * @return    Skipjack
     */
    
function Skipjack($serial null$developer null) {
        if(
$serial != null) {
            
$this->addField('SerialNumber'$serial);
        } else {
            
$this->addField('SerialNumber'$this->serialNumber);
        }
        
        if(
$developer != null) {
            
$this->addField('DeveloperSerialNumber'$developer);
        } else {
            
$this->addfield('DeveloperSerialNumber'$this->devSerialNumber);
        }
    }
    
    
    
/**
     * Add field to request, required field are:
     *   SJName (Billing Name), Email, StreetAddress, City, State, ZipCode, 
     *   ShipToPhone, AccountNumber (CC#), Month, Year, TransactionAmount, 
     *   OrderNumber, OrderString
     *
     * @param    String    $key
     * @param    String    $value
     * @return    void
     */
    
function addField($key$value) {
        if(
$value !== "" && $value !== "Submit") {
            
$this->fields[$key] = $value;
        }
    }
    
    
    
/**
     * Allow array to be sent to object at once
     *
     * @param    Array(String => String)    $array
     * @return    void
     */
    
function addFields($array) {
        foreach(
$array as $key => $value) {
            
$this->addField($key$value);
        }
    }
    
    
    
/**
     * Determines if all required fields are in the fields array before
     * attempting to post to Skipjack. If a dummy value is found for a field,
     * then it used as a default and no error is thrown for that field. Returns
     * false if any errors are encountered.
     *
     * @access    private
     * @return    boolean
     */
    
function __canPost() {
        
$return true;
        
        foreach(
$this->requiredFields as $field) {
            if(!isset(
$this->fields[$field])) {
                if(
array_key_exists($field$this->dummyVals)) {
                    
$this->addField($field$this->dummyVals[$field]);
                } else {
                    
$return false;
                    
$this->errors[] = 'Required field not found: '.$field;
                }
            }
        }
        
        return 
$return;
    }
    
    
    
/**
     * Process the order using information in Skipjack::fields. Returns false
     * when an error is encountered.
     *
     * @return    boolean
     */
    
function process() {
        
$post '';
        
$return true;
        
        if(
$this->__canPost()) {
            foreach(
$this->fields as $key=>$value) {
                
$post .= "$key=" urlencode($value) . "&";
            }

         if(
$this->DEVELOPER) {
                
$url "https://developer.skipjackic.com/scripts/evolvcc.dll?Authorize";
            } else {
                
$url "https://www.skipjackic.com/scripts/evolvcc.dll?Authorize";
            }
            
$ch curl_init();
            
$curl1=curl_setopt($chCURLOPT_HEADER1);
            
curl_setopt($chCURLOPT_URL$url);
            
curl_setopt($chCURLOPT_RETURNTRANSFER1);
            
curl_setopt($chCURLOPT_POSTFIELDSrtrim($post"&"));
            
$response curl_exec($ch);
            if(
curl_errno($ch) > 0) {
                
$this->errors[] = "Encountered Curl error number: ".curl_errno($ch);
                
$return false;
            }
            
curl_close($ch);
            
            
$response explode("\r"$response);
            
$header explode('","'$response[0]);
            
$data explode('","'$response[1]);
            foreach(
$header as $i => $array) {
                
$this->response[str_replace(array("\r",'"'), ""$array)] = str_replace(array("\r",'"'), ""$data[$i]);
            }
        } else {
            
$return false;
        }
        
        return 
$return;
    }
    
    
/**
     * Check the response for errors, returns false if errors found.
     *
     * @return    boolean
     */
    
function checkForErrors() {
        
$return true;
        
        if(!
$this->isApproved()) {
            if(
$this->isCardDeclined()) {
                
$this->errors[] = $this->response['szAuthorizationDeclinedMessage'];
                
$return false;
            } else {
                
// this will run if there is an error with the information that you have provided to skipjack
                
$this->errors[] = $errorCodes[$this->response['szReturnCode']];
                
$return false;
            }
        }
        
        return 
$return;
    }
    
    
    
/**
     * @return    boolean
     */
    
function isApproved() {
        return (
$this->response['szIsApproved'] == 1);
    }
    
    
    
/**
     * @return    boolean
     */
    
function isCardDeclined() {
        return !empty(
$this->response['szAuthorizationDeclinedMessage']);
    }
    
    
    
/**
     * Returns the response auth code and associated string
     *
     * @return    Array(int => String)
     */
    
function getAuthCode() {
        return array((int)
$this->response['AUTHCODE'] => $this->authCodes[(int)$this->response['AUTHCODE']]);
    }
    
    
    
/**
     * Set the developer variable. If set to true, development server is used.
     *
     * @param    boolean    $val
     * @return    void
     */
    
function setDeveloper($value) {
        
$this->DEVELOPER = (bool)$value;
    }
    
    
    
/**
     * @return    boolean
     */
    
function errorsExist() {
        return (
count($this->errors) > 0);
    }
    
    
    
/**
     * @return    Array(String)
     */
    
function getErrors() {
        return 
$this->errors;
    }
    
    
    
/**
     * Reset the object's properties so multiple instantiations aren't required
     * for batch processing.
     *
     * @return    void
     */
    
function reset() {
        
$this->fields = array();
        
$this->response = array();
        
$this->errors = array();
    }
    
    
}
?>
skipjack.php - class

PHP Code:
require_once("skipjack.php");
$sj = new skipjack('001099855086''002806107202');
$sj->setDeveloper(true);
$sj->addFields(array('OrderNumber' => rand(09999999999),
'ItemDescription' => 'Ts League Order',
'ItemCost' => $_SESSION['form_1_Data']['totalPrice'].'.00',
'TransactionAmount' => $_SESSION['form_1_Data']['totalPrice'].'.00',
'SJName' => $_SESSION['form_3_Data']['s_up_bill_name'],
'StreetAddress' => $_SESSION['form_3_Data']['s_up_bill_address'],
'City' => $_SESSION['form_3_Data']['s_up_bill_city'],
'State' => $_SESSION['form_3_Data']['s_up_bill_state'],
'ZipCode' => $_SESSION['form_3_Data']['s_up_bill_zip'],
'ShipToPhone' => $_SESSION['form_3_Data']['s_up_bill_phone1'].$_SESSION['form_3_Data']['s_up_bill_phone2'].$_SESSION['form_3_Data']['s_up_bill_phone3'],
'Email' => $_SESSION['form_3_Data']['s_up_bill_email'],
'OrderString' => 'Ts League Order',
'ItemNumber' => rand(09999999999),  
'Quantity' => '1',
'Taxable' => FALSE,
'AccountNumber' => $_SESSION['form_3_Data']['s_up_card_num'],
'Month' => $_SESSION['form_3_Data']['s_up_valid_month'],
'Year' => $_SESSION['form_3_Data']['s_up_valid_year']));
// see lines 202 - 235 in skipjack.php

//print_r( $sj->process()->errors[] );
echo $sj->process()->$ch;
die();
// /transaction
/*if($sj->process()==1 && $sj->isApproved()==1 && $sj->getAuthCode()==5){ echo "Transaction successful";
}else{$sj->getErrors();
    $_SESSION['paymentFailResults']=$sj->getErrors();
   // header('Location: /signup/step3/');
   // die('U ****ED UP!');
}*/
exit; 
Your help is greatly appreciated.

Thank you in advance for any assistance.
#api #skipjack
  • Profile picture of the author KirkMcD
    What isn't working and have you tried the example they give in their code?
    {{ DiscussionBoard.errors[3418018].message }}
    • Profile picture of the author phpbbxpert
      Whats with the $ch ?
      echo $sj->process()->$ch;

      There is no $ch object or property.

      Try just

      echo $sj->process();

      You should be using the condition like the example

      if($sj->process() && $sj->isApproved()) {
      echo "Transaction approved!";
      } else {
      echo "Transaction declined!\n";
      echo $sj->getErrors();
      }
      {{ DiscussionBoard.errors[3418413].message }}

Trending Topics