// ProcessViaklix.cpp // Example program to process ViaKlix credit card transaction // Using Rudeserver Socket library // COPYRIGHT 2007 Matt Flood // All Rights Reserved #include #include #include 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 Viaklik account information // string viaklix_account_pin="SOMEPIN"; // Your VIAKLIX PIN string viaklix_account_merchant_id="SOMEMERCHANTID"; // Your VIAKLIX Merchant ID // ViaKlix Test Mode // Set to uppercase TRUE for test mode // Set to uppercase FALSE to go live // string testmode="TRUE"; // Address/path of the viaklix.com services // string server_address="www.viaklix.com"; string server_application_path="/process.asp"; // 2. Build the query String // In real-world app, you should url-encode anything that is not hard coded //////////////////////////// string querystring = "ssl_pin="; querystring += viaklix_account_pin; querystring += "&ssl_merchant_id="; querystring += viaklix_account_merchant_id; querystring += "&ssl_test_mode="; querystring += testmode; querystring += "&ssl_result_format=ASCII"; querystring += "&ssl_show_form=FALSE"; querystring += "&ssl_exp_date="; querystring += cardexpires; querystring += "&ssl_card_number="; querystring += cardnumber; querystring += "&ssl_description="; querystring += track; querystring += "&ssl_amount="; querystring += ordertotal; querystring += "&ssl_ship_to_first_name="; querystring += card_holder_firstname; querystring += "&ssl_ship_to_last_name="; querystring += card_holder_lastname; querystring += "&ssl_cvv2=present&ssl_cvv2cvc2="; 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(server_address.c_str(), 443)) { cerr << socket.getError() << "\n"; return 1; } // Send the HTTP request // socket.sends("POST "); socket.sends(server_application_path.c_str()); socket.sends(" HTTP/1.0\n"); socket.sends("Host: "); socket.sends(server_address.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(); int position = str_result.find("ssl_result=",0); if(position >= 0) { position += 11; if(str_result[position] == '0') { // YAY - Accepted cout << "Transaction Successful\n"; return 0; } else { cerr << "Transaction Failed\n"; position = str_result.find("ssl_result_message=", 0); if(position >=0 ) { position += 19; string errorstr = str_result.substr(position, str_result.size()); cerr << errorstr.c_str() << "\n"; return 1; } else { cerr << "Could not determine error" << "\n"; return 1; } } } else { cerr << result << "\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; } }