type:
integration
system:
ASP.Net, C#
name:
FoxyCart XML Test Generator in C#
description:
Code in C# to generate and post a FoxyCart XML datafeed on demand.
tag:
xml, datafeed, testing, C#, .net, dotnet
date:
2011-06-01
version:
1.1

test xml post with csharp

Please note: The code on this page is submitted by members of the FoxyCart community, and may not verified by FoxyCart.com LLC in any way, shape, or form. Please double check the code before installing. If you need help with it please post in our forum, but if we cannot offer assistance (due to unfamiliarity with this particular system or language) we apologize in advance.

Description

The purpose of this file is to help you set up and debug your FoxyCart XML DataFeed scripts. It's designed to mimic FoxyCart.com and send encrypted and encoded XML to a URL of your choice. It will print out the response that your script gives back, which should be “foxy” if successful.

Installation

Compile the following code. Create or use a sample datafeed document that is saved as “data.xml” in the output executable's directory.

You can get the sample XML for v0.7.2 from Transaction XML Datafeeds: Instant Transaction Notification or http://wiki.foxycart.com/v/0.7.2/transaction_xml_datafeed

Requirements

Requires .Net Framework 2.0 or compatible.

Code

using System;
using System.IO;
using System.Net;
using System.Text;
using System.Web;   //Add reference to System.Web.dll. Ensure target framework is the full.net framework, not a client profile (client profiles do not include System.Web)
 
class Program
{
 
    private static string DataFeedKey = "[Your API key here, remove square brackets]";
 
    static void Main(string[] args)
    {
 
        //Load plain XML data (previously parsed)
        string transactionData = (new StreamReader("data.xml")).ReadToEnd();
 
        //Encode it using the RC4 algorithm (see class implementation belwow).
        string encryptedTransactionData = RC4.Encrypt(DataFeedKey, transactionData, false);
        string encodedTransactionData = HttpUtility.UrlEncode(encryptedTransactionData, Encoding.GetEncoding(1252));
 
        //Create our POST string.  Note you could skip all this and just append the encrypted data too
        string postData = "FoxyData=" + encodedTransactionData;
 
        //Create a web request to send the data
        HttpWebRequest req = (HttpWebRequest)WebRequest.Create("[Your datafeed processing page here, remove square brackets]");
        req.Method = "POST";
        req.ContentType = "application/x-www-form-urlencoded";
 
        //Write POST stream            
        StreamWriter sw = new StreamWriter(req.GetRequestStream(), Encoding.ASCII);
        sw.Write(postData);
        sw.Close();
 
        //Send it and see if it was okay
        HttpWebResponse resp = null;
        try
        {
            resp = (HttpWebResponse)req.GetResponse();
 
            //This should read "foxy"
            string r = new StreamReader(resp.GetResponseStream()).ReadToEnd();
        }
        catch (WebException ex)
        {
            string err = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
        }
 
    }
 
 
    /**
     * RC4.NET 1.0
     *
     * RC4.NET is a petite library that allows you to use RC4
     * encryption easily in the .NET Platform. It's OO and can
     * produce outputs in binary and hex.
     *
     * (C) Copyright 2006 Mukul Sabharwal [http://mjsabby.com]
     *	   All Rights Reserved
     *
     * @link http://rc4dotnet.devhome.org
     * @author Mukul Sabharwal <mjsabby@gmail.com>
     * @version $Id: RC4.cs,v 1.0 2006/03/19 15:35:24 mukul Exp $
     * @copyright Copyright &copy; 2006 Mukul Sabharwal
     * @license http://www.gnu.org/copyleft/lesser.html
     * @package RC4.NET
     */
    public class RC4
    {
        /**
         * Get ASCII Integer Code
         *
         * @param char ch Character to get ASCII value for
         * @access private
         * @return int
         */
        private static int ord(char ch)
        {
            return (int)(Encoding.GetEncoding(1252).GetBytes(ch + "")[0]);
        }
        /**
         * Get character representation of ASCII Code
         *
         * @param int i ASCII code
         * @access private
         * @return char
         */
        private static char chr(int i)
        {
            byte[] bytes = new byte[1];
            bytes[0] = (byte)i;
            return Encoding.GetEncoding(1252).GetString(bytes)[0];
        }
        /**
         * Convert Hex to Binary (hex2bin)
         *
         * @param string packtype Rudimentary in this implementation
         * @param string datastring Hex to be packed into Binary
         * @access private
         * @return string
         */
        private static string pack(string packtype, string datastring)
        {
            int i, j, datalength, packsize;
            byte[] bytes;
            char[] hex;
            string tmp;
 
            datalength = datastring.Length;
            packsize = (datalength / 2) + (datalength % 2);
            bytes = new byte[packsize];
            hex = new char[2];
 
            for (i = j = 0; i < datalength; i += 2)
            {
                hex[0] = datastring[i];
                if (datalength - i == 1)
                    hex[1] = '0';
                else
                    hex[1] = datastring[i + 1];
                tmp = new string(hex, 0, 2);
                try { bytes[j++] = byte.Parse(tmp, System.Globalization.NumberStyles.HexNumber); }
                catch { } /* grin */
            }
            return Encoding.GetEncoding(1252).GetString(bytes);
        }
        /**
         * Convert Binary to Hex (bin2hex)
         *
         * @param string bindata Binary data
         * @access public
         * @return string
         */
        public static string bin2hex(string bindata)
        {
            int i;
            byte[] bytes = Encoding.GetEncoding(1252).GetBytes(bindata);
            string hexString = "";
            for (i = 0; i < bytes.Length; i++)
            {
                hexString += bytes[i].ToString("x2");
            }
            return hexString;
        }
        /**
         * The symmetric encryption function
         *
         * @param string pwd Key to encrypt with (can be binary of hex)
         * @param string data Content to be encrypted
         * @param bool ispwdHex Key passed is in hexadecimal or not
         * @access public
         * @return string
         */
        public static string Encrypt(string pwd, string data, bool ispwdHex)
        {
            int a, i, j, k, tmp, pwd_length, data_length;
            int[] key, box;
            byte[] cipher;
            //string cipher;
 
            if (ispwdHex)
                pwd = pack("H*", pwd); // valid input, please!
            pwd_length = pwd.Length;
            data_length = data.Length;
            key = new int[256];
            box = new int[256];
            cipher = new byte[data.Length];
            //cipher = "";
 
            for (i = 0; i < 256; i++)
            {
                key[i] = ord(pwd[i % pwd_length]);
                box[i] = i;
            }
            for (j = i = 0; i < 256; i++)
            {
                j = (j + box[i] + key[i]) % 256;
                tmp = box[i];
                box[i] = box[j];
                box[j] = tmp;
            }
            for (a = j = i = 0; i < data_length; i++)
            {
                a = (a + 1) % 256;
                j = (j + box[a]) % 256;
                tmp = box[a];
                box[a] = box[j];
                box[j] = tmp;
                k = box[((box[a] + box[j]) % 256)];
                cipher[i] = (byte)(ord(data[i]) ^ k);
                //cipher += chr(ord(data[i]) ^ k);
            }
            return Encoding.GetEncoding(1252).GetString(cipher);
            //return cipher;
        }
        /**
         * Decryption, recall encryption
         *
         * @param string pwd Key to decrypt with (can be binary of hex)
         * @param string data Content to be decrypted
         * @param bool ispwdHex Key passed is in hexadecimal or not
         * @access public
         * @return string
         */
        public static string Decrypt(string pwd, string data, bool ispwdHex)
        {
            return Encrypt(pwd, data, ispwdHex);
        }
    }
 
}

Site Tools