This is an old revision of the document!


type:
integration
system:
ASP.Net, C#
name:
ASP.NET C# API + Datafeed Code
description:
Functions to interact with the FoxyCart API and XML Datafeed
tags:
api, datafeed, xml, c#, csharp, integration
date:
2011-06-01
version:
1.0

ASP.NET with C\# XML Datafeed E-Commerce Integration

Description

Functions to interact with the FoxyCart API and XML Datafeeds. This code will decrypt the XML stream into a string. From there you can store off or do other processing. Per the DataFeed API, the only response from the page is the string “foxy”. This can be used as a foundation to build a more advanced FoxyCart + .NET e-commerce integration. Don't forget to look at Transaction XML Datafeeds: Instant Transaction Notification for the XML format.

Requirements

Add the following code to the code file of a C# ASP.Net page called “ProcessTransaction.aspx”. You may need to set ValidateRequest=“false” in the Page directives of the .aspx page.

Code

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class ProcessTransaction : System.Web.UI.Page
{
    private string API_KEY = "Your FoxyCart API Key";
 
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            string foxyFeed = Request.Form["FoxyData"];
            byte[] ffBytes = Encoding.ASCII.GetBytes(foxyFeed);
            string unencodedFeed = HttpUtility.UrlDecode(ffBytes, Encoding.GetEncoding(1252));
            string transaction = RC4.Decrypt(API_KEY, unencodedFeed, false);
 
            //Process the XML string "transaction" as desired.
 
            Response.Write("foxy");
        }
        catch (Exception) { }   //Just eat all exceptions.  You can log this internally if you'd like.
    }
 
 
    /**
     * 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