authorizenet.cpp
Back to Rude Socket Tutorials
// ProcessAuthorizeNet.cpp
// Example program to process Authorize.net credit card
// transaction using Rude Socket library
// COPYRIGHT 2007 Matt Flood
// All Rights Reserved
#include <rude/socket.h>
#include <string>
#include <iostream>
using namespace std;
using namespace rude;
int main(void)
{
// 1. Configure the data we need to form the request
// In real-world applications, you will want to untaint and url-encode
// this information if it is obtained from another source (eg. from a CGI application)
//
/////////////////////////
// Order information
//
string track = "1000"; // Internal tracking number eg. the invoice number
string ordertotal = "6.34"; // Total to charge the credit card
// Credit Card information
//
string cardnumber = "5123456789012346"; // Credit Card Number
string cardexpires = "0307"; // Credit Card Expiration Date (MMYY)
string card_securitycode="123"; // Credit Card CVV2 Code
string card_holder_firstname="Buck"; //
string card_holder_lastname="Rogers";
// You Authorize.net account information
//
string authnet_login="SOMELOGIN"; // Your Authorize.net login information
string authnet_passwd="SOMEPASSWD"; // Your Authorize.net password
// Authorize.net Test Mode
// Set to uppercase TRUE for test mode
// Set to uppercase FALSE to go live
//
string testmode="TRUE";
// Address/path of the authorize.net services
//
string authnet_server="secure.authorize.net";
string authnet_path="/gateway/transact.dll";
// 2. Build the query String
// In real-world app, you should url-encode anything that is not hard coded
////////////////////////////
string querystring = "x_version=3.1";
querystring += "&x_delim_data=True";
querystring += "&x_login=";
querystring += authnet_login;
querystring += "&x_password=";
querystring += authnet_passwd;
querystring += "&x_type=AUTH_CAPTURE";
querystring += "&X_TEST_REQUEST=TRUE";
querystring += "&x_exp_date=";
querystring += cardexpires;
querystring += "&x_card_num=";
querystring += cardnumber;
querystring += "&x_cust_id=";
querystring += track;
querystring += "&x_amount=";
querystring += ordertotal;
querystring += "&x_first_name=";
querystring += card_holder_firstname;
querystring += "&x_last_name=";
querystring += card_holder_lastname;
querystring += "&x_card_code=";
querystring += card_securitycode;
// We will need the size of the querystring as a string (not an int)
// when building the HTTP request
//
char querystring_length[20];
sprintf(querystring_length, "%d", querystring.size());
// 3. Use the Rude Socket Object to send the secure request and receive the response
//////////////////////////
// Create socket object
//
Socket socket;
// Connect to remote server using SSL
//
if(!socket.connectSSL(authnet_server.c_str(), 443))
{
cerr << socket.getError() << "\n";
return 1;
}
// Send the HTTP request
//
socket.sends("POST ");
socket.sends(authnet_path.c_str());
socket.sends(" HTTP/1.0\n");
socket.sends("Host: ");
socket.sends(authnet_server.c_str());
socket.sends("\n");
socket.sends("Content-Type: application/x-www-form-urlencoded\n");
socket.sends("Content-Length: ");
socket.sends(querystring_length);
socket.sends("\n\n");
socket.sends(querystring.c_str());
// Read the Response
//
const char *result = socket.reads();
// NOTE: The response includes the HTTP response header
if(result)
{
// convert result to a string so we can use c++ string functions to parse it
//
string str_result = result;
// close the socket
//
socket.close();
// The existance of the following substring indicates that the card was accepted
//
int position = str_result.find("1,1,1",0);
if(position >= 0)
{
cout << "Transaction was successful\n";
return 0;
}
else
{
// We need to get to the end of the headers,
// Content-Length is usually the last one, so we look for it
//
position = str_result.find("Content-Length:", 0);
if(position < 0)
{
// We received an unexpected response
//
cerr << "Server Response did not include Content-Length field:\n";
cerr << result;
cerr << "\n";
}
// Reason for failure is in position 4 of a comma separated list
// Look for 3 commas
if( position = str_result.find(",", position) )
{
if( position = str_result.find(",", (position+ 1)) )
{
if ( position =str_result.find(",", (position + 1)) )
{
// We are at the beginning of the error message
// Find the end of the message by finding the comma that follows it
//
int end_position = str_result.find(",", (position + 1));
if(!end_position)
{
// Could not find trailing comma, use the end of the entire result instead
//
end_position = str_result.size() -1;
}
// Extract the error message
//
string reason = str_result.substr((position + 1), end_position - position - 1);
// Display error message
//
cerr << reason << "\n";
return 1;
}
}
}
}
}
else
{
// report the error
//
cerr << socket.getError() << "\n";
// close the socket
//
socket.close();
// exit program with failure (non-zero) status
//
return 1;
}
}
Generated by GNU enscript 1.6.4.