?
Solved

Simplified, minimal PHP for Authorize.net AIM transaction

Posted on 2006-07-12
8
Medium Priority
?
446 Views
Last Modified: 2013-11-29
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.  
0
Comment
Question by:scrathcyboy
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
8 Comments
 
LVL 44

Author Comment

by:scrathcyboy
ID: 17095549
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);

      }

}

0
 
LVL 2

Accepted Solution

by:
arun80_inin earned 2000 total points
ID: 17098593
This is very simplest one. you can non manditory parameters if you need.

In the below code
Assign appropriate values for the following variables $auth_net_login_id,$test_request,$auth_net_tran_key,$credit_card_number,$expiration_month,$expiration_year,$amount,$first_name,$last_name,$address,$city,$state,$zipcode.

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

$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_test_request"            => $test_request,
                  "x_method"                        => "CC",
                  "x_tran_key"                  => $auth_net_tran_key,
                  "x_relay_response"            => "FALSE",
                  "x_card_num"                  => $credit_card_number,
                  "x_exp_date"                  => $expiration_month.$expiration_year,
                  "x_description"                  => "",
                  "x_amount"                        => $amount,
                  "x_first_name"                  => $first_name,
                  "x_last_name"                  => $last_name,
                  "x_address"                        => $address,
                  "x_city"                        => $city,
                  "x_state"                        => $state,
                  "x_zip"                              => $zipcode,
                  
            );
            
            $fields = "";
            foreach( $authnet_values as $key => $value ) $fields .= "$key=" . urlencode( $value ) . "&";


            //$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 $credit_card_number;
            //echo $resp;
            //exit;
            $text = explode("|",$resp);


            if ($text[0]=="1")  then success

            else you can get the error message from $text[3]
0
 
LVL 44

Author Comment

by:scrathcyboy
ID: 17102160
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?

0
Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

 
LVL 2

Expert Comment

by:arun80_inin
ID: 17106487
You have to install curl package in webserver
0
 
LVL 44

Author Comment

by:scrathcyboy
ID: 17111295
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?
0
 
LVL 44

Author Comment

by:scrathcyboy
ID: 17111740
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?
0
 
LVL 2

Expert Comment

by:arun80_inin
ID: 17113707
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.

0
 
LVL 44

Author Comment

by:scrathcyboy
ID: 17116343
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.
0

Featured Post

Survive A High-Traffic Event with Percona

Your application or website rely on your database to deliver information about products and services to your customers. You can’t afford to have your database lose performance, lose availability or become unresponsive – even for just a few minutes.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Learn about the eCommerce marketing trends for the year ahead.
This article discusses how to implement server side field validation and display customized error messages to the client.
Viewers will get an overview of the benefits and risks of using Bitcoin to accept payments. What Bitcoin is: Legality: Risks: Benefits: Which businesses are best suited?: Other things you should know: How to get started:
You have products, that come in variants and want to set different prices for them? Watch this micro tutorial that describes how to configure prices for Magento super attributes. Assigning simple products to configurable: We assigned simple products…
Suggested Courses

718 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question