February 2008 - Posts

Simple and Pretty Cool.

Originally Posted on mikedopp.net

 <a id="login-link" href="javascript:showLogin();">Login</a>
    <div id="login-panel" style="visibility: hidden;">
       <fieldset onkeydown="checkForEnter();">
           <label>
               UserName:
               <input type="text" id="userName" /></label>
           <label>
               Password:<input type="password" id="password" /></label>
           <label class="checkbox" for="rememberMe">
               <input type="checkbox" id="rememberMe" checked="checked" />Remember Me
               <asp:Button ID="Button1" runat="server" UseSubmitBehavior="false" onClientClick="setTimeout(loginButton_Click, 0); return false;" Text="Login &raquo;" PostBackUrl="~/catalog/Default.aspx" /></label></fieldset>
    </div>
 

Javascript involved:
   These functions here are mearly for a "WOW" factor. They have nothing
    to do with ASP.NET AJAX. The ASP.NET AJAX functionality is below.

var hideTimerID = 0;
    
   function showLogin() {
       clearTimeout(hideTimerID);
    
       $get("login-link").style.visibility = "hidden";
    
       $get("login-panel").style.visibility = "visible";
    
       $get("userName").focus();
    
       // Hide the login panel after 30 seconds.
       hideTimerID = setTimeout(hideLogin, 30000);
   }
    
   function hideLogin() {
       $get("login-link").style.visibility = "visible";
    
       $get("login-panel").style.visibility = "hidden";
    
       // Blank out the username and password for security reasons.
       $get("userName").value = "";
    
       $get("password").value = "";
   }
    
   function checkForEnter(e) {
       if (!e) e = window.event;
    
       if (e && e.keyCode == 13) {
           loginButton_Click();
       }
   }    
    

Now we are in the actual ASP.NET AJAX implementation. These are some very
  simple JavaScript methods that will tap into the ASP.NET AJAX Framework.

 

function errorCallback(error) {
       alert(error.get_message());
   }
    
   function loginCallback(loggedIn) {
       hideLogin();
       if (loggedIn == false) {
           alert("The username and password you supplied is invalid.");
       }
   }
    
   function loginButton_Click() {
       Sys.Services.AuthenticationService.login($get("userName").value, $get("password").value,
           $get("rememberMe").checked, null, location.href, loginCallback, errorCallback);
   }
   function logoutButton_Click() {
       Sys.Services.AuthenticationService.logout(location.href, null, errorCallback);
   }
 
Of course feel free to change it how you like but this is the basic howto.
 

To help clear up confusion on how to write against the Paypal SDK:

Update to the PayFlowPro issues with Paypal. First and foremost Paypal support is awesome. Second the  PayPal Developer Community needs some work from my perspective. While Admin_ToddS was right. It was like pulling teeth to get info.

Also they seriously need to rebuild the SDK with better documentation. Perhaps I will take it upon myself to push a better SDK out next post.

Here is the code I ended up using as you will see it was much easier once paypal turned on the gateway.

 

   1:  using System;
   2:  using PayPal.Payments.DataObjects;
   3:   
   4:  namespace eStoreFrontCS
   5:  {
   6:      /// <summary>
   7:      /// Summary description for Constants.
   8:      /// </summary>
   9:      public class Constants
  10:      {
  11:          private Constants()
  12:          {
  13:          }
  14:                  
  15:          // Payflow Pro Host Name. This is the host name for the PayPal Payment Gateway.
  16:          // For testing:     pilot-payflowpro.verisign.com
  17:          // For production:     payflowpro.verisign.com
  18:   
  19:          // DO NOT use test-payflow.verisign.com or payflow.verisign.com.
  20:          
  21:          // The path "/transaction" must be included at this time, otherwise a result code -1
  22:          // will be returned.
  23:   
  24:          // If needed, set proxy like given example.
  25:          // internal static PayflowConnectionData Connection = new PayflowConnectionData("pilot-payflowpro.verisign.com/transaction",443,<ProxyAddress>,<ProxyPort>,<ProxyLogon>,<ProxyPassword>,@"C:\Program Files\Payflow SDK for .NET\certs");
  26:          //public static PayflowConnectionData Connection = new PayflowConnectionData("pilot-payflowpro.verisign.com/transaction",443,@"C:\Program Files\Payflow SDK for .NET\certs");
  27:          //This is Express Checkout User information
  28:          //,null,0,null,null
  29:          public static UserInfo PayflowECUser = new UserInfo("", "", "", "");
  30:          //This is Buyer Auth User information
  31:          public static UserInfo PayflowBAUser = new UserInfo("", "", "", "");
  32:       //You need to send "<user>", "<vendor>", "<partner>", "<password>" where USER and VENDOR are //your merchant Login ID, unless you created a Payflow Pro User(no need have not set one up.).
  33:          
  34:  //public static String LocalHostName  = System.Configuration.ConfigurationSettings.AppSettings["hostName"];
  35:      }
  36:  }
 
 

Original Post:

<sarcasm>Because writing against this gateway is so very easy.</sarcasm>

Add a button to a aspx form and in the code behind add:

   1:  using System;
   2:  using System.Data;
   3:  using System.Configuration;
   4:  using System.Collections;
   5:  using System.Web;
   6:  using System.Web.Security;
   7:  using System.Web.UI;
   8:  using System.Web.UI.WebControls;
   9:  using System.Web.UI.WebControls.WebParts;
  10:  using System.Web.UI.HtmlControls;
  11:  using System.Net;
  12:  using System.Text;
  13:  using System.IO;
  14:  using System.Text.RegularExpressions;
  15:   
  16:  public partial class vps_home : System.Web.UI.Page
  17:  {
  18:      
  19:      protected void Page_Load(object sender, EventArgs e)
  20:      {
  21:   
  22:      }
  23:      protected void Button1_Click(object sender, EventArgs e)
  24:      {
  25:          //PayPal offers an SDK for .net that can be downloaded here: http://www.pdncommunity.com/pdn/board/message?board.id=payflow&message.id=569
  26:          //this was created because the SDK can be somewhat confusing.
  27:   
  28:          //*************** Note ***********************
  29:          //before using this code change the following line below: wrWebRequest.Headers.Add("X-VPS-VIT-Client-Certification-Id:14");
  30:          //you need to change the ID to something beside 14 that will be unique
  31:   
  32:          //1. Set the url to send the transaction to
  33:          //test
  34:          string postURL = "https://pilot-payflowpro.verisign.com/transaction";
  35:          //live
  36:          //string postURL = "https://payflowpro.verisign.com/transaction";
  37:   
  38:          //2. Set your user info. This is case sensitive
  39:          string PWD = "xxx";
  40:          string USER= "xxx";
  41:          string VENDOR="xxx";
  42:          string PARTNER = "xxx";
  43:   
  44:          //3. now create the name value pair string to send to the Payflow servers
  45:          //more variables can be found in the docs that can be downloaded from your payflow manager
  46:   
  47:          StringBuilder postData = new StringBuilder();
  48:   
  49:          //***************add the user info***************
  50:          postData.Append("PWD=" + PWD);
  51:          postData.Append("&USER=" + USER);
  52:          postData.Append("&VENDOR=" + VENDOR);
  53:          postData.Append("&PARTNER=" + PARTNER);
  54:   
  55:          //***************add some required info for testing***************
  56:          postData.Append("&CUSTIP=" + Request.UserHostAddress);
  57:          //S for Sale. A for Auth. More in the docs
  58:          postData.Append("&TRXTYPE=S");
  59:          postData.Append("&AMT=1.00");
  60:          //this is in the format MMYY
  61:          postData.Append("&EXPDATE=0109");
  62:          postData.Append("&ACCT=5105105105105100");
  63:          postData.Append("&CVV2=123");
  64:          postData.Append("&FIRSTNAME=bob");
  65:          postData.Append("&LASTNAME=smith");
  66:          postData.Append("&STREET=155515 Q St");
  67:          postData.Append("&STATE=NE");
  68:          postData.Append("&CITY=Omaha");
  69:          postData.Append("&ZIP=68137");
  70:          postData.Append("&COUNTRY=US");
  71:          //C is for credit card, P is for PayPal Express Checkout. More in the docs
  72:          postData.Append("&TENDER=C");
  73:   
  74:          //*************add some optional feilds***************
  75:          postData.Append("&COMMENT1=ASP.NET Testing");
  76:          //make sure that the "@" is not url encoded or you will get an error
  77:          postData.Append("&email=bob@domain.com");
  78:          //this is if you want to have PayPal send an IPN post
  79:          //postData.Append("&NOTIFYURL=" + xxxx);
  80:   
  81:          //removed for now: INVNUM=12345678&
  82:   
  83:          //add the REQUEST_ID
  84:          postData.Append("&REQUEST_ID=" + System.Guid.NewGuid().ToString());
  85:          
  86:          //write out the post data
  87:          Response.Write("PostData:<br> " + postData + "<br><br>");
  88:          
  89:          byte[] requestBytes = Encoding.UTF8.GetBytes(postData.ToString());
  90:          HttpWebRequest wrWebRequest = (HttpWebRequest)WebRequest.Create(postURL);
  91:   
  92:          //Set WebRequest Properties
  93:          wrWebRequest.Method = "POST";
  94:          wrWebRequest.Accept = "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
  95:          wrWebRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.7) Gecko/20060909 Firefox/1.5.0.7";
  96:          wrWebRequest.ContentType = "text/namevalue";
  97:          wrWebRequest.ContentLength = requestBytes.Length;
  98:          wrWebRequest.AllowAutoRedirect = false;
  99:          
 100:          //add the custom headers
 101:          wrWebRequest.Headers.Add("X-VPS-Timeout:30");
 102:          wrWebRequest.Headers.Add("X-VPS-VIT-Client-Architecture:x86");
 103:          wrWebRequest.Headers.Add("X-VPS-VIT-Client-Certification-Id:14");
 104:          wrWebRequest.Headers.Add("X-VPS-VIT-Client-Type:ASP.NET");
 105:          wrWebRequest.Headers.Add("X-VPS-VIT-Client-Version:0.0.1");
 106:          wrWebRequest.Headers.Add("X-VPS-VIT-Integration-Product:Homegrown");
 107:          wrWebRequest.Headers.Add("X-VPS-VIT-Integration-Version:0.0.1");
 108:          wrWebRequest.Headers.Add("X-VPS-VIT-OS-Name:windows");
 109:          wrWebRequest.Headers.Add("X-VPS-VIT-OS-Version:2002_SP2");
 110:      
 111:          // write the form values into the request message
 112:          Stream reqStream = wrWebRequest.GetRequestStream();
 113:          reqStream.Write(requestBytes, 0, requestBytes.Length);
 114:          // Get the response.
 115:          HttpWebResponse hwrWebResponse = (HttpWebResponse)wrWebRequest.GetResponse();
 116:          reqStream.Close();
 117:          StreamReader responseReader = new StreamReader(wrWebRequest.GetResponse().GetResponseStream());
 118:              
 119:          string responseData = responseReader.ReadToEnd();
 120:          responseReader.Close();
 121:          Response.Write("Response Data:<br>" + responseData);
 122:   
 123:   
 124:      }
 125:  }
 
 
 
 
 
 
 
 
 
 
 
 
 
Technorati Tags:
More Posts