Authorize.net Transaction Using PHP
Copy this script to a file authorizenet.class.php
Select all
fields["$field"] = urlencode($value); } function process() { // This function actually processes the payment. This function will // load the $response array with all the returned information. The return // values for the function are: // 1 - Approved // 2 - Declined // 3 - Error // construct the fields string to pass to authorize.net foreach( $this->fields as $key => $value ) $this->field_string .= "$key=" . urlencode( $value ) . "&"; // execute the HTTPS post via CURL $ch = curl_init($this->gateway_url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim( $this->field_string, "& " )); $this->response_string = urldecode(curl_exec($ch)); if (curl_errno($ch)) { $this->response['Response Reason Text'] = curl_error($ch); return 3; } else curl_close ($ch); // load a temporary array with the values returned from authorize.net $temp_values = explode('|', $this->response_string); // load a temporary array with the keys corresponding to the values // returned from authorize.net (taken from AIM documentation) $temp_keys= array ( "Response Code", "Response Subcode", "Response Reason Code", "Response Reason Text", "Approval Code", "AVS Result Code", "Transaction ID", "Invoice Number", "Description", "Amount", "Method", "Transaction Type", "Customer ID", "Cardholder First Name", "Cardholder Last Name", "Company", "Billing Address", "City", "State", "Zip", "Country", "Phone", "Fax", "Email", "Ship to First Name", "Ship to Last Name", "Ship to Company", "Ship to Address", "Ship to City", "Ship to State", "Ship to Zip", "Ship to Country", "Tax Amount", "Duty Amount", "Freight Amount", "Tax Exempt Flag", "PO Number", "MD5 Hash", "Card Code (CVV2/CVC2/CID) Response Code", "Cardholder Authentication Verification Value (CAVV) Response Code" ); // add additional keys for reserved fields and merchant defined fields for ($i=0; $i<=27; $i++) { array_push($temp_keys, 'Reserved Field '.$i); } $i=0; while (sizeof($temp_keys) < sizeof($temp_values)) { array_push($temp_keys, 'Merchant Defined Field '.$i); $i++; } // combine the keys and values arrays into the $response array. This // can be done with the array_combine() function instead if you are using // php 5. for ($i=0; $i
response["$temp_keys[$i]"] = $temp_values[$i]; } // Return the response code. return $this->response['Response Code']; } function get_response_reason_text() { return $this->response['Response Reason Text']; } function dump_fields() { // Used for debugging, this function will output all the field/value pairs // that are currently defined in the instance of the class using the // add_field() function. echo "
authorizenet_class->dump_fields() Output:
"; echo "
Field Name
Value
"; foreach ($this->fields as $key => $value) { echo "
$key
".urldecode($value)."
"; } echo "
"; } function dump_response() { // Used for debuggin, this function will output all the response field // names and the values returned for the payment submission. This should // be called AFTER the process() function has been called to view details // about authorize.net's response. echo "
authorizenet_class->dump_response() Output:
"; echo "
Index
Field Name
Value
"; $i = 0; foreach ($this->response as $key => $value) { echo "
$i
$key
$value
"; $i++; } echo "
"; } }
Copy this script to a file demo.php
Select all
add_field('x_login', 'CHANGE THIS TO YOUR LOGIN'); $a->add_field('x_tran_key', 'CHANGE THIS TO YOUR TRANSACTION KEY'); //$a->add_field('x_password', 'CHANGE THIS TO YOUR PASSWORD'); $a->add_field('x_version', '3.1'); $a->add_field('x_type', 'AUTH_CAPTURE'); $a->add_field('x_test_request', 'TRUE'); // Just a test transaction $a->add_field('x_relay_response', 'FALSE'); // You *MUST* specify '|' as the delim char due to the way I wrote the class. // I will change this in future versions should I have time. But for now, just // make sure you include the following 3 lines of code when using this class. $a->add_field('x_delim_data', 'TRUE'); $a->add_field('x_delim_char', '|'); $a->add_field('x_encap_char', ''); // Setup fields for customer information. This would typically come from an // array of POST values froma secure HTTPS form. $a->add_field('x_first_name', 'John'); $a->add_field('x_last_name', 'Smith'); $a->add_field('x_address', '1234 West Main St.'); $a->add_field('x_city', 'Some City'); $a->add_field('x_state', 'CA'); $a->add_field('x_zip', '12345'); $a->add_field('x_country', 'US'); $a->add_field('x_email', 'someone@somedomain.com'); $a->add_field('x_phone', '555-555-5555'); // Using credit card number '4007000000027' performs a successful test. This // allows you to test the behavior of your script should the transaction be // successful. If you want to test various failures, use '4222222222222' as // the credit card number and set the x_amount field to the value of the // Response Reason Code you want to test. // // For example, if you are checking for an invalid expiration date on the // card, you would have a condition such as: // if ($a->response['Response Reason Code'] == 7) ... (do something) // // Now, in order to cause the gateway to induce that error, you would have to // set x_card_num = '4222222222222' and x_amount = '7.00' // Setup fields for payment information $a->add_field('x_method', 'CC'); $a->add_field('x_card_num', '4007000000027'); // test successful visa //$a->add_field('x_card_num', '370000000000002'); // test successful american express //$a->add_field('x_card_num', '6011000000000012'); // test successful discover //$a->add_field('x_card_num', '5424000000000015'); // test successful mastercard // $a->add_field('x_card_num', '4222222222222'); // test failure card number $a->add_field('x_amount', '10.00'); $a->add_field('x_exp_date', '0308'); // march of 2008 $a->add_field('x_card_code', '123'); // Card CAVV Security code // Process the payment and output the results switch ($a->process()) { case 1: // Successs echo "
Success:
"; echo $a->get_response_reason_text(); echo "
Details of the transaction are shown below...
"; break; case 2: // Declined echo "
Payment Declined:
"; echo $a->get_response_reason_text(); echo "
Details of the transaction are shown below...
"; break; case 3: // Error echo "
Error with Transaction:
"; echo $a->get_response_reason_text(); echo "
Details of the transaction are shown below...
"; break; } // The following two functions are for debugging and learning the behavior // of authorize.net's response codes. They output nice tables containing // the data passed to and recieved from the gateway. $a->dump_fields(); // outputs all the fields that we set $a->dump_response(); // outputs the response from the payment gateway