Link to home
Start Free TrialLog in
Avatar of scrathcyboy
scrathcyboyFlag for United States of America

asked on

Simplified, minimal PHP for Authorize.net AIM transaction

Authorize.Net does NOT (nor it seems does anyone else) post a BASIC, SIMPLE script for their AIM transaction interface (advanced = just send transaction for approval).  What they provide is an overly complex HTML output script to provide everything imaginable and parse all results returned.

ALL I WANT IS THE BARE MINIMUM to send a transaction, and find out only if it was approved or not.

PLEASE, NO LINKS !!  I have read them all, they are too complex, no one has stripped it to the basics.

Please reply ONLY if you can strip their code to the BARE ESSENTIALS, nothing more.

This is what the Authorize.net REP said when I asked him as to the bare essentials --

"All you need to submit for authentication is the API login ID and transaction key. The only transaction values that need to be posted in order to process are the card number, expiration date and amount. All the other variables listed in the implementation guide are optional."

Keep that in mind when you reply -- 90% of what they provide is superfluous.  I have already stripped out over 100 lines of junk before posting this script -- the remaining HTML fragments also need to go -- I am outputting NOTHING at all to the screen, all I want is the YES/NO result.

I would appreciate someone helping me strip all the baggage out of this script, and be left with only 10-20 essential lines, that is all.  I can handle the rest in PHP.  
Avatar of scrathcyboy
scrathcyboy
Flag of United States of America image

ASKER

Here is the relevant segement of their script --

<?php


$DEBUGGING                              = 1;                        # Display additional information to track down problems
$TESTING                              = 1;                        # Set the testing flag so that transactions are not live
$ERROR_RETRIES                        = 2;                        # Number of transactions to post if soft errors occur

$auth_net_login_id                  = "CHANGE THIS";
$auth_net_tran_key                  = "CHANGE THIS";
$auth_net_url                        = "https://test.authorize.net/gateway/transact.dll";
#  Uncomment the line ABOVE for test accounts or BELOW for live merchant accounts
#  $auth_net_url                        = "https://secure.authorize.net/gateway/transact.dll";

$authnet_values                        = array
(
      "x_login"                        => $auth_net_login_id,
      "x_version"                        => "3.1",
      "x_delim_char"                  => "|",
      "x_delim_data"                  => "TRUE",
      "x_url"                              => "FALSE",
      "x_type"                        => "AUTH_CAPTURE",
      "x_method"                        => "CC",
       "x_tran_key"                  => $auth_net_tran_key,
       "x_relay_response"            => "FALSE",
      "x_card_num"                  => "4242424242424242",
      "x_exp_date"                  => "1209",
      "x_description"                  => "Recycled Toner Cartridges",
      "x_amount"                        => "12.23",
      "x_first_name"                  => "Charles D.",
      "x_last_name"                  => "Gaulle",
      "x_address"                        => "342 N. Main Street #150",
      "x_city"                        => "Ft. Worth",
      "x_state"                        => "TX",
      "x_zip"                              => "12345",
      "CustomerBirthMonth"      => "Customer Birth Month: 12",
      "CustomerBirthDay"            => "Customer Birth Day: 1",
      "CustomerBirthYear"            => "Customer Birth Year: 1959",
      "SpecialCode"                  => "Promotion: Spring Sale",
);

$fields = "";
foreach( $authnet_values as $key => $value ) $fields .= "$key=" . urlencode( $value ) . "&";


echo "<hr>";
///////////////////////////////////////////////////////////

echo "<b>01: Post the transaction (see the code for specific information):</b><br>";


$ch = curl_init("https://test.authorize.net/gateway/transact.dll");
###  Uncomment the line ABOVE for test accounts or BELOW for live merchant accounts
### $ch = curl_init("https://secure.authorize.net/gateway/transact.dll");
curl_setopt($ch, CURLOPT_HEADER, 0); // set to 0 to eliminate header info from response
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // Returns response data instead of TRUE(1)
curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim( $fields, "& " )); // use HTTP POST to send form data
### curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // uncomment this line if you get no gateway response. ###
$resp = curl_exec($ch); //execute post and get results
curl_close ($ch);


echo "<hr>";
///////////////////////////////////////////////////////////

echo "<b>02: Get post results:</b><br>";
echo $resp;
echo "<br>";

echo "<hr>";
///////////////////////////////////////////////////////////

echo "03: Parse post results (simple approach)<br>";

$text = $resp;

echo "<table cellpadding=\"5\" cellspacing=\"0\" border=\"1\">";
      echo "<tr>";
            echo "<td class=\"v\">";


$tok = strtok($text,"|");
while(!($tok === FALSE)){
//while ($tok) {
    echo "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$tok."<br>";
    $tok = strtok("|");
}


            echo "</td>";
      echo "</tr>";
echo "</table>";


echo "<hr>";
///////////////////////////////////////////////////////////

echo "<b>04: Parse the results string into individual, meaningful segments:</b><br>";


echo "<table cellpadding=\"5\" cellspacing=\"0\" border=\"1\">";

///////////////////////////////////////////////////////////
//  STATISTICAL USE ONLY:                                //
///////////////////////////////////////////////////////////

      echo "<tr>";
            echo "<td class=\"q\">";
            echo "Length of the returned string from Authorize.Net:";
            echo "</td>";

            echo "<td class=\"q\">";
            echo strlen($resp);
            echo "</td>";

      echo "</tr>";

$howMany = substr_count($resp, "|");

      echo "<tr>";
            echo "<td class=\"q\">";
            echo "Number of delimiter characters in the returned string:";
            echo "</td>";

            echo "<td class=\"q\">";
            echo $howMany;
            echo "</td>";

      echo "</tr>";
///////////////////////////////////////////////////////////



$text = $resp;
$h = substr_count($text, "|");
$h++;




      for($j=1; $j <= $h; $j++){

      $p = strpos($text, "|");

      if ($p === false) { // note: three equal signs

            echo "<tr>";
            echo "<td class=\"e\">";

                  //  x_delim_char is obviously not found in the last go-around

                  if($j>=69){

                        echo "Merchant-defined (".$j."): ";
                        echo ": ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $text;
                        echo "<br>";

                  } else {

                        echo $j;
                        echo ": ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $text;
                        echo "<br>";

                  }


            echo "</td>";
            echo "</tr>";

      }else{

            $p++;

            //  We found the x_delim_char and accounted for it . . . now do something with it

            //  get one portion of the response at a time
            $pstr = substr($text, 0, $p);

            //  this prepares the text and returns one value of the submitted
            //  and processed name/value pairs at a time
            //  for AIM-specific interpretations of the responses
            //  please consult the AIM Guide and look up
            //  the section called Gateway Response API
            $pstr_trimmed = substr($pstr, 0, -1); // removes "|" at the end

            if($pstr_trimmed==""){
                  $pstr_trimmed="NO VALUE RETURNED";
            }


            echo "<tr>";
            echo "<td class=\"e\">";

            switch($j){

                  case 1:
                        echo "Response Code: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        $fval="";
                        if($pstr_trimmed=="1"){
                              $fval="Approved";
                        }elseif($pstr_trimmed=="2"){
                              $fval="Declined";
                        }elseif($pstr_trimmed=="3"){
                              $fval="Error";
                        }

                        echo $fval;
                        echo "<br>";
                        break;

                  case 2:
                        echo "Response Subcode: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 3:
                        echo "Response Reason Code: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 4:
                        echo "Response Reason Text: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 5:
                        echo "Approval Code: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 6:
                        echo "AVS Result Code: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 7:
                        echo "Transaction ID: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 8:
                        echo "Invoice Number (x_invoice_num): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 9:
                        echo "Description (x_description): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 10:
                        echo "Amount (x_amount): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 11:
                        echo "Method (x_method): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 12:
                        echo "Transaction Type (x_type): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 13:
                        echo "Customer ID (x_cust_id): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 14:
                        echo "Cardholder First Name (x_first_name): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 15:
                        echo "Cardholder Last Name (x_last_name): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 16:
                        echo "Company (x_company): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 17:
                        echo "Billing Address (x_address): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 18:
                        echo "City (x_city): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 19:
                        echo "State (x_state): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 20:
                        echo "ZIP (x_zip): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 21:
                        echo "Country (x_country): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 22:
                        echo "Phone (x_phone): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 23:
                        echo "Fax (x_fax): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 24:
                        echo "E-Mail Address (x_email): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 25:
                        echo "Ship to First Name (x_ship_to_first_name): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 26:
                        echo "Ship to Last Name (x_ship_to_last_name): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 27:
                        echo "Ship to Company (x_ship_to_company): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 28:
                        echo "Ship to Address (x_ship_to_address): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 29:
                        echo "Ship to City (x_ship_to_city): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 30:
                        echo "Ship to State (x_ship_to_state): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 31:
                        echo "Ship to ZIP (x_ship_to_zip): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 32:
                        echo "Ship to Country (x_ship_to_country): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 33:
                        echo "Tax Amount (x_tax): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 34:
                        echo "Duty Amount (x_duty): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 35:
                        echo "Freight Amount (x_freight): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 36:
                        echo "Tax Exempt Flag (x_tax_exempt): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 37:
                        echo "PO Number (x_po_num): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 38:
                        echo "MD5 Hash: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  case 39:
                        echo "Card Code Response: ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        $fval="";
                        if($pstr_trimmed=="M"){
                              $fval="M = Match";
                        }elseif($pstr_trimmed=="N"){
                              $fval="N = No Match";
                        }elseif($pstr_trimmed=="P"){
                              $fval="P = Not Processed";
                        }elseif($pstr_trimmed=="S"){
                              $fval="S = Should have been present";
                        }elseif($pstr_trimmed=="U"){
                              $fval="U = Issuer unable to process request";
                        }else{
                              $fval="NO VALUE RETURNED";
                        }

                        echo $fval;
                        echo "<br>";
                        break;

                  case 40:
                  case 41:
                  case 42:
                  case 43:
                  case 44:
                  case 45:
                  case 46:
                  case 47:
                  case 48:
                  case 49:
                  case 50:
                  case 51:
                  case 52:
                  case 53:
                  case 54:
                  case 55:
                  case 55:
                  case 56:
                  case 57:
                  case 58:
                  case 59:
                  case 60:
                  case 61:
                  case 62:
                  case 63:
                  case 64:
                  case 65:
                  case 66:
                  case 67:
                  case 68:
                        echo "Reserved (".$j."): ";

                        echo "</td>";
                        echo "<td class=\"v\">";

                        echo $pstr_trimmed;
                        echo "<br>";
                        break;

                  default:

                        if($j>=69){

                              echo "Merchant-defined (".$j."): ";
                              echo ": ";

                              echo "</td>";
                              echo "<td class=\"v\">";

                              echo $pstr_trimmed;
                              echo "<br>";

                        } else {

                              echo $j;
                              echo ": ";

                              echo "</td>";
                              echo "<td class=\"v\">";

                              echo $pstr_trimmed;
                              echo "<br>";

                        }

                        break;

            }

            echo "</td>";
            echo "</tr>";

            // remove the part that we identified and work with the rest of the string
            $text = substr($text, $p);

      }

}

ASKER CERTIFIED SOLUTION
Avatar of arun80_inin
arun80_inin

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thank you - arun80_inin  - and thank you for simplifying how to test the success value.

What is the "curl_init" and other curl_ functions?  Is this something built into the transaction gateway, or do I have to install this "curl" package of functions on my web server?

Avatar of arun80_inin
arun80_inin

You have to install curl package in webserver
Thanks -- I am not sure about this value --

"For $test_request assign true if the request is test request otherwise false."

If you are sending to the test gateway ("https://test.authorize.net/....)
does it need to be = 1  ??

Or does it need to be = 1 if only sending to the real gateway (https://secure.authorize.net/ ...)
as a test ?  == otherwise, set = 0 to do a real transaction?
I solved that problem already.  The last one is --

"uncomment this line if you get no gateway response."

How can you test for no gateway response?
sorry i have no idea about that. I just found this when i am searching for one of my project 1 month back and found in authorize.net site itself and used. I didn't have more deep idea on this code. Just you have mentioned that you need the simplese code I have given for you. May be you can look in to authorize.net site for more information.

Thank you again arun80_inin -- your help has been MOST VALUABLE -- TERRIFIC.  I think I have it solved, thanks to your guidance.  And you get full points for this help.  I would give you more if I could.