Solved

Simplified, minimal PHP for Authorize.net AIM transaction

Posted on 2006-07-12
8
435 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
  • 5
  • 3
8 Comments
 
LVL 44

Author Comment

by:scrathcyboy
Comment Utility
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 500 total points
Comment Utility
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
Comment Utility
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
 
LVL 2

Expert Comment

by:arun80_inin
Comment Utility
You have to install curl package in webserver
0
How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

 
LVL 44

Author Comment

by:scrathcyboy
Comment Utility
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
Comment Utility
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
Comment Utility
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
Comment Utility
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

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Author Note: Since this E-E article was originally written, years ago, formal testing has come into common use in the world of PHP.  PHPUnit (http://en.wikipedia.org/wiki/PHPUnit) and similar technologies have enjoyed wide adoption, making it possib…
I imagine that there are some, like me, who require a way of getting currency exchange rates for implementation in web project from time to time, so I thought I would share a solution that I have developed for this purpose. It turns out that Yaho…
The viewer will learn how to look for a specific file type in a local or remote server directory using PHP.
The viewer will learn how to create a basic form using some HTML5 and PHP for later processing. Set up your basic HTML file. Open your form tag and set the method and action attributes.: (CODE) Set up your first few inputs one for the name and …

771 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

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now