So it turns out I was making it WAY more complicated than it needed to be. While before it was necessary with the Authorize.net to do stuff, with PayPal it actually requires (for our purposes, your mileage may vary) nothing from them other than having your stuff set up. All it requires is for you to post some properly formatted information to a url:
sUrl = "https://pilot-payflowpro.paypal.com"
WebRequest request = WebRequest.Create( sUrl );
request.Method = "POST";
string PostData =
"USER=/*User*/" +
"&VENDOR=/*Vendor*/" +
"&PARTNER=PayPal" +
"&PWD=/*PassWord*/" +
"&TRXTYPE=S" +
"&TENDER=C" +
"&ACCT=/*CC#*/" +
"&EXPDATE=/*CC Expiration Date*/" +
"&CVV2=/*CCV Code*/" +
"&AMT=/*Order Amount*/" +
"&FIRSTNAME=/*First Name*/" +
"&LASTNAME=/*Last Name*/" +
"&STREET=/*Address Street*/" +
"&CITY=/*Address City*/" +
"&STATE=/*Address State*/" +
"&ZIP=/*Zip Code*/" +
"COMMENT1=/*Any Comment*/";
byte[] bar = Encoding.UTF8.GetBytes( PostData );
request.ContentLength = bar.Length;
using ( Stream datStream = request.GetRequestStream( ) ) {
datStream.Write( bar, 0, bar.Length );
datStream.Close( );
}
string serverResponse;
WebResponse wResp = request.GetResponse( );
using ( Stream datStream = wResp.GetResponseStream( ) )
using ( StreamReader datSReader = new StreamReader( datStream ) )
serverResponse = datSReader.ReadToEnd( );
this.Response = HttpUtility.ParseQueryString(serverResponse);
IsSuccess = this.Response.Get( "RESULT" ) == "0";
if ( !IsSuccess ) MessageBox.Show( "RESULT != 0: RESULT = " + this.Response.Get( "RESULT" ) );
return IsSuccess;
This code, in its form before it was changed, came straight from the guys at PayPal, and made it a lot easier to manage transactions via a windows form application.