<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Brandon Passley</title>
	<atom:link href="http://brandonpassley.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://brandonpassley.com</link>
	<description>Brandon Passley Design &#38; Development</description>
	<pubDate>Wed, 06 Jan 2010 16:20:43 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>PayPal Recurring Payments</title>
		<link>http://brandonpassley.com/ruby-on-rails/paypal-recurring-payments-with-ruby-on-rails/</link>
		<comments>http://brandonpassley.com/ruby-on-rails/paypal-recurring-payments-with-ruby-on-rails/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 20:34:33 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=339</guid>
		<description><![CDATA[A quick overview of integrating PayPal's Recurring Payments into Ruby on Rails. With companies developing more and more software-as-a-service applications, developers are needing to accept and bill credit cards on a recurring basis (monthly, yearly, etc.). With PayPal's new recurring payment API it has become much easier to integrate recurring payments into any Ruby on Rails application.]]></description>
			<content:encoded><![CDATA[<p>After finishing the majority of the development on <a href="http://drawbridgeapp.com" target="_blank">DrawbridgeApp.com</a>, a project proposal creator and manager, I realized other freelancers and small companies were also running into the same issues with managing the proposals they needed to deliver to clients. I decided to deliver Drawbridge to the public at a low monthly rate, jumping on the &#8220;software as a service&#8221; train. The issue with running software in return for a monthly payment is having the ability to take and, more importantly, save credit card numbers. These obviously must be saved through a third-party merchant account. After researching many options, I decided to go with PayPal — which may or may not have been the best solution, but this is about implementing the solutions.</p>
<p>At the time I was developing Drawbridge there was plenty of documentation written about implementing a shopping cart and collecting single payments with PayPal through various means (<a href="http://www.activemerchant.org/" target="_blank">active merchant</a>) but there wasn&#8217;t anything written on integrating recurring payments with PayPal since PayPal had just launched their recurring payment option (active merchant did not have PayPal recurring payment integration at the time). After finding and dissecting the <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/library_download_sdks" target="_blank">PayPal SDK for Ruby on Rails</a> I decided to use the callers in the SDK and tie them into the recurring payments.</p>
<p><strong>Download and Install the PayPal SDK</strong><br />
You can download the <a href="https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_Ruby_NVP_SDK.zip" target="_blank">full PayPal SDK</a> to get an idea of how the basic transaction process works with Ruby on Rails, but you really only need the <a href="http://brandonpassley.com/wp-content/uploads/2009/04/paypalsdk.zip" target="_blank">PayPalSDK Plugin</a> (I couldn&#8217;t find any type of gem, so I have posted the files on my server.)</p>
<p>Onc you have downloaded the plugin, you will see three files in the &#8220;lib&#8221; folder:<br />
<strong>caller.rb </strong>– which handles the request and transactions<br />
<strong>profile.rb</strong> – which handles authentication information and end points<br />
<strong>utils.rb </strong>– which includes logging utilities</p>
<p>The only thing I changed in these files was to move the credentials and endpoints out of profile.rb and into initializers/globals.rb, this way I can control where the transactions go depending on the environment — development environment to the PayPal sandbox for testing and the production environment to my real PayPal account and live server.</p>
<p><em>Update vendor/plugins/PayPalSDK/lib/profile.rb</em></p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> specify the 3-token values.
</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_class variable_other_readwrite_class_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@@</span>credentials</span> =  {<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>USER<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span style="color: #808080;"><span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_USER</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>PWD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_PASS</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>SIGNATURE<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SIG</span> }
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> endpoint of PayPal server against which call will be made.
</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_class variable_other_readwrite_class_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@@</span>endpoints</span> = {<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>SERVER<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SERVER</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>SERVICE<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>/nvp/<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>}
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Proxy information of the client environment.
</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_class variable_other_readwrite_class_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@@</span>proxy_info</span> = {<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>USE_PROXY<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="constant constant_language constant_language_ruby">false</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>ADDRESS<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="constant constant_language constant_language_ruby">nil</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>PORT<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="constant constant_language constant_language_ruby">nil</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>USER<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="constant constant_language constant_language_ruby">nil</span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>PASSWORD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="constant constant_language constant_language_ruby">nil</span> }
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Information needed for tracking purposes.
</span><span class="variable variable_other variable_other_readwrite variable_other_readwrite_class variable_other_readwrite_class_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@@</span>client_info</span> = {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>VERSION<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>50.0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>, <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>SOURCE<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>PayPalRubySDKV1.2.0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>}</span></pre>
<p><em>Add this to config/initializers/globals.rb</em></p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> ==== PAYPAL INFORMATION =====
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Depending on environment, either send to PayPal sandbox or real account
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> ENVIRONMENT: DEVELOPMENT
</span><span class="keyword keyword_control keyword_control_ruby">if</span> <span class="variable variable_other variable_other_constant variable_other_constant_ruby">ENV</span>[<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>RAILS_ENV<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>] == <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>production<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_USER</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">YOUR PAYPAL API USER NAME</span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_PASS</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">YOUR PAYPAL API PASSWORD</span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SIG</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>YOUR PAYPAL API SIGNATURE<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SERVER</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>api-3t.paypal.com<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> ENVIRONMENT: PRODUCTION
</span><span class="keyword keyword_control keyword_control_ruby">else</span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_USER</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"YOUR SANDBOX API USER NAME</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_PASS</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"YOUR </span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">SANDBOX </span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">API PASSWORD</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SIG</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby">YOUR </span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">SANDBOX </span></span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby">API SIGNATURE</span></span><span class="source source_ruby"><span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">API_SERVER</span> = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>api-3t.beta-sandbox.paypal.com<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p><strong>CreateRecurringPaymentsProfile</strong><br />
Now you can include caller.rb in your transactions  controller <em>(require &#8216;caller&#8217;)</em> which will allow you to use the &#8220;<strong>CreateRecurringPaymentsProfile</strong>&#8221; method in the &#8220;call&#8221; method. There are many options that can be included in this hash that can be <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments#id086520F027U" target="_blank">found here</a>, but the only required items for creating a new recurring profile are (or see <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments#id08669F0705Z" target="_blank">full PayPal API list</a>):</p>
<ul>
<li>CREDITCARDTYPE</li>
<li>ACCT <em>(credit card number)</em></li>
<li>EXPDATE</li>
<li>FIRSTNAME</li>
<li>LASTNAME</li>
<li>PROFILESTARTDATE</li>
<li>BILLINGPERIOD</li>
<li>BILLINGFREQUENCY</li>
<li>AMT</li>
</ul>
<p>You can also include a trial period. I use this with Drawbridge to allow new users to have a 30 day free trial. This means they will not be charged the monthly price until after the first 30 days (see <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments#id086520F027U__id08652200WTS" target="_blank">full list here</a>).</p>
<ul>
<li>TRIALBILLINGPERIOD</li>
<li>TRIALBILLINGFREQUENCY</li>
<li>TRIALAMT</li>
<li>TRIALTOTALBILLINGCYCLES</li>
</ul>
<p>There is much more information of what you can do on the <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments" target="_blank">PayPal Recurring Payments with PayPal Payments Pro</a> page.</p>
<p><strong>Using the Call method</strong><br />
Once you are familiar with what PayPal requires to create a recurring profile, using the call method in Ruby on Rails is pretty easy. Here is an example of how I use the call method and the variables I send. Obviously some of these items are sent from the <a href="https://drawbridgeapp.com/signup/paid" target="_blank">form on DrawbridgeApp.com</a>, but some are set in the hash.</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">do_payment</span></span>
  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span> =  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">PayPalSDKCallers</span>::<span class="support support_class support_class_ruby">Caller</span>.<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span>(<span class="constant constant_language constant_language_ruby">false</span>)
  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>transaction</span> = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span>.call(
    {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block">
</span>      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>PROFILEREFERENCE</span> =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.id,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>method</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>CreateRecurringPaymentsProfile<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>amt</span>             =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>price</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>currencycode</span>    =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>USD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>paymentaction</span>   =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Sale<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>creditcardtype</span>  =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>creditCardType</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>acct</span>            =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>creditCardNumber</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>firstname</span>       =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>first_name</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>lastname</span>        =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>last_name</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>email</span>           =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>email</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>zip</span>             =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>zip</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>countrycode</span>     =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>US<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>expdate</span>         =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>expDate</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>cvv2</span>            =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>cvv2Number</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>ProfileStartDate</span> =&gt; <span class="support support_class support_class_ruby">Time</span>.now.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%Y-%m-%d %H:%M:%S<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>),
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>BillingFrequency</span> =&gt; <span class="constant constant_numeric constant_numeric_ruby">1</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>BillingPeriod</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Month<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>desc</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Drawbride Quote Manager<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>note</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>A note about the transaction<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>TRIALBILLINGPERIOD</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Month<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>TRIALBILLINGFREQUENCY</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>TRIALAMT</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>TRIALTOTALBILLINGCYCLES</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>1<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
    }
  )
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>You can check whether the transaction was successful by doing</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="keyword keyword_control keyword_control_ruby">if</span> <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>transaction</span>.success?
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Do whatever
</span><span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>If everything is successful, save the returned PayPal recurring profile id to be used when referencing the account&#8217;s PayPal transaction history. If there is an error, PayPal returns the reason in it&#8217;s response. You can save and grab this message in a session by doing this:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Get response from PayPal
</span>session[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>paypal_error</span>] = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>transaction</span>.response
<span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>response</span> = session[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>paypal_error</span>]
<span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>longmessage</span> = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>response</span>[<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>L_LONGMESSAGE0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>]
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> Send errors
</span>flash.now[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>warning</span>] = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>response</span>[<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>L_LONGMESSAGE0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>]
render <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>index<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span></span></pre>
<p><strong>Change Credit Card Numbers</strong><br />
What happens when a user needs to update their credit card number? Since PayPal doesn&#8217;t allow a recurring payment profile to change it&#8217;s credit card number, a new profile must be created for that account. This is quite unpleasant, but understandable. Here is the process I decided was the safest and most efficient.</p>
<p><strong>Suspend the Current PayPal Profile</strong><br />
First suspend the current PayPal profile by using <em>&#8220;ManageRecurringPaymentsProfileStatus&#8221;</em> to have an action of<em> &#8220;Suspend&#8221;</em>:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span> = <span class="variable variable_other variable_other_constant variable_other_constant_ruby">PayPalSDKCallers</span>::<span class="support support_class support_class_ruby">Caller</span>.<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span>(<span class="constant constant_language constant_language_ruby">false</span>)
<span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>suspend</span> = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span>.call(
  {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block">
</span>    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>method</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>ManageRecurringPaymentsProfileStatus<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>profileid</span>       =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.paypal_id,
    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>Suspend<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>note</span>            =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>A note about what you are doing<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
  }
)</span></pre>
<p><strong>Create a New PayPal Profile</strong></p>
<p>Then create a new PayPal profile for the user, using their new credit card information. It is VERY important that you update the PayPal profile id in your database and also start the new recurring date the same as the suspended account, otherwise you will charge the user again. First check that the account was suspended and then create a new PayPal profile by doing:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="keyword keyword_control keyword_control_ruby">if</span> <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>suspend</span>.success?
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> NOW WE CREATE A NEW RECURRING PAYMENT PROFILE
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> *NOTE: USE THE CURRENT BILLING DATE AS TO NOT BILL MORE THAN ONCE IN THE MONTH
</span>  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span> =  <span class="variable variable_other variable_other_constant variable_other_constant_ruby">PayPalSDKCallers</span>::<span class="support support_class support_class_ruby">Caller</span>.<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span>(<span class="constant constant_language constant_language_ruby">false</span>)
  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>transaction</span> = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span>.call(
    {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block">
</span>      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>PROFILEREFERENCE</span> =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.id,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>method</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>CreateRecurringPaymentsProfile<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>amt</span>             =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>price</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>currencycode</span>    =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>USD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>paymentaction</span>   =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Sale<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>creditcardtype</span>  =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>creditCardType</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>acct</span>            =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>creditCardNumber</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>firstname</span>       =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span></span>first_name,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>lastname</span>        =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span></span>first_name,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>email</span>           =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span></span>email,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>zip</span>             =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span></span>zip,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>countrycode</span>     =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>US<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>expdate</span>         =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>expDateYear</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>cvv2</span>            =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>cvv2Number</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>ProfileStartDate</span> =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.nextPayPalBillingDate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%Y-%m-%d %H:%M:%S<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>),
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>BillingFrequency</span> =&gt; <span class="constant constant_numeric constant_numeric_ruby">1</span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>BillingPeriod</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Month<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>desc</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>Drawbride Quote Manager<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>note</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>UPDATED CREDIT CARD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
    }
  )
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>To do the above <em>&#8220;:ProfileStartDate&#8221;</em>, you will need to get the next billing date. I created a method in models/account.rb <em>(where I track my PayPal profile)</em>:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">nextPayPalBillingDate</span></span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> The PayPal next billing date is based on when the account was created
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> It assumes that this was when the credit card was charged for the first time
</span>  curdate = <span class="support support_class support_class_ruby">Time</span>.now
  <span class="keyword keyword_control keyword_control_ruby">unless</span> paypal_created_at.nil?
    accountdate = <span class="variable variable_language variable_language_ruby">self</span>.paypal_created_at
    new_start_date = <span class="support support_class support_class_ruby">Time</span>.parse(<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%Y<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%m<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>accountdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%d<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span> <span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%H:%M:%S<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>)
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> If the date is less than this month and days we move the start date to next month
</span><span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">    <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> (i.e. curdate = 10/16/08 &amp; new_start_date = 10/14/08)
</span>    <span class="keyword keyword_control keyword_control_ruby">if</span> new_start_date &lt;= <span class="support support_class support_class_ruby">Time</span>.now
      curdate = <span class="support support_class support_class_ruby">Time</span>.now + <span class="constant constant_numeric constant_numeric_ruby">1.</span>months
      new_start_date = <span class="support support_class support_class_ruby">Time</span>.parse(<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span><span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%Y<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%m<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span>-<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>accountdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%d<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span> <span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>curdate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%H:%M:%S<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>)<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>)
    <span class="keyword keyword_control keyword_control_ruby">end</span>
    <span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby">return</span> new_start_date
  <span class="keyword keyword_control keyword_control_ruby">else</span>
    <span class="keyword keyword_control keyword_control_pseudo-method keyword_control_pseudo-method_ruby">return</span> <span class="support support_class support_class_ruby">Time</span>.now
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>This way you can easily set</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>ProfileStartDate</span> =&gt; <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.nextPayPalBillingDate.strftime(<span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>%Y-%m-%d %H:%M:%S<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>),</span></pre>
<p><strong>Reactivate Suspended Profile on Failure</strong><br />
If the credit card is invalid, does not have enough funds, or whatever else happens to return an error when creating a new PayPal Recurring profile, the suspended account must be reactivated. This is exactly the same process as suspending the profile, except you would just set the action to <em>&#8220;Reactivate&#8221;</em>.</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="keyword keyword_control keyword_control_ruby">else</span>
<span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby">  <span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> CREATE FAILED SO WE MUST REACTIVATE SUSPENDED ACCOUNT
</span>  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span> = <span class="variable variable_other variable_other_constant variable_other_constant_ruby">PayPalSDKCallers</span>::<span class="support support_class support_class_ruby">Caller</span>.<span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">new</span>(<span class="constant constant_language constant_language_ruby">false</span>)
  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>reactivate</span> = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>caller</span>.call(
    {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block">
</span>      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>method</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>ManageRecurringPaymentsProfileStatus<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>profileid</span>       =&gt;  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>account</span>.paypal_id,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span>          =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>Reactivate<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
      <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>note</span>            =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>UPDATED CREDIT CARD<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>
    }
  )

  session[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>dcc_response</span>]=<span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>transaction</span>.response <span class="comment comment_line comment_line_number-sign comment_line_number-sign_ruby"><span class="punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_ruby">#</span> this is actually the create response
</span>  <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>response</span> = session[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>dcc_response</span>]
  flash[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>warning</span>] = <span class="variable variable_other variable_other_readwrite variable_other_readwrite_instance variable_other_readwrite_instance_ruby"><span class="punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_ruby">@</span>response</span>[<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>L_LONGMESSAGE0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>]
  redirect_to <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>somewhere<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p><strong>What Else?<br />
</strong>Hopefully this will help answer some of the questions I originally had when I had set up PayPal Recurring Payments for other developers trying to accomplish the same thing. Here are a few other things:</p>
<p>• You can sign-up for the PayPal recurring payments here: <a href="https://www.paypal.com/cgi-bin/webscr?cmd=xpt/Marketing/general/ProRecurringPayments-outside" target="_blank">https://www.paypal.com/cgi-bin/webscr?cmd=xpt/Marketing/general/ProRecurringPayments-outside</a>. You will need to have a PalPal pro account first for $30 per month and then you can add the recurring payment plan on to the service for an extra $30 per month. So all together you will be paying around $60 per month.</p>
<p>• You will definitely need an SSL certificate. These are pretty easy to install, especially if you are using a large host. I purchased mine from <a href="http://www.godaddy.com/gdshop/ssl/ssl.asp" target="_blank">GoDaddy.com</a> for $29.99 per year and have everything hosted at <a href="http://mediatemple.net/" target="_blank">MediaTemple.net</a> (which made it extremely easy to install the certificate).</p>
<p>• PayPal Pro Recurring Payments: <a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments" target="_blank">https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;content_ID=developer/e_howto_api_WPRecurringPayments</a></p>
<p>• PayPal Ruby on Rails SDK <em>(this is not the recurring payments but is very helpful)</em>: <a href="https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_Ruby_NVP_SDK.zip" target="_blank">https://cms.paypal.com/cms_content/US/en_US/files/developer/PP_Ruby_NVP_SDK.zip</a></p>
<p>• The PayPalSDK Ruby on Rails plugin I used: <a href="http://brandonpassley.com/wp-content/uploads/2009/04/paypalsdk.zip" target="_blank">http://brandonpassley.com/wp-content/uploads/2009/04/paypalsdk.zip</a></p>
<p><strong>Questions or Comments<br />
</strong>Please feel free to contact me with questions or comments. I am 100% sure I left something out, so please don&#8217;t hesitate to add to this, or ask me questions — I will respond.</p>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/ruby-on-rails/paypal-recurring-payments-with-ruby-on-rails/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sparklines</title>
		<link>http://brandonpassley.com/ruby-on-rails/sparklines/</link>
		<comments>http://brandonpassley.com/ruby-on-rails/sparklines/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 04:33:11 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=296</guid>
		<description><![CDATA[Sparklines are a great way to show a large array of numbers quickly. Even without references these tiny graphs can give the user a quick history in a glance. Here is a Ruby on Rails script I wrote that renders a sparkline graph from a URL.]]></description>
			<content:encoded><![CDATA[<p>If you use <a href="http://google.com/analytics" target="_blank">Google Analytics</a>, you have seen Sparklines at work. Sparklines, as <a href="http://www.edwardtufte.com/bboard/q-and-a-fetch-msg?msg_id=0001OR&amp;topic_id=1&amp;topic=" target="_blank">described by Edward Tuft</a>, are intense, simple word-sized graphics. These tiny, sometimes ambiguous, graphs can give a needed overview of a path of a set of numbers, even without a reference point. They look something like this <img class="alignnone size-medium wp-image-321" style="border:none;margin:0 4px;" title="deficit" src="http://brandonpassley.com/wp-content/uploads/2009/03/deficit.png" alt="" width="62" height="16" /> and they can give the user a sense of history at a quick glance… as they glaze over the list of numbers next to it.</p>
<p>I wanted to use Sparklines on a project I had been working on in Ruby on Rails. There are plenty of resources for installing the <a href="http://nubyonrails.com/pages/sparklines" target="_blank">Sparkline gem</a>, but I couldn&#8217;t find much on actually implementing them. I created a quick script that could render sparklines with variables I could send from the URL. <em>(NOTE: This could probably be written better, but it worked for me.)</em></p>
<p>You will need to get the RMagick and Sparkline gems:</p>
<pre class="textmate-source mac_classic">$ gem install rmagick
$ gem install sparklines</pre>
<p>Here is what your action <em>(apps/controllers/controller_name.rb)</em> would look like:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby"><span class="meta meta_function meta_function_method meta_function_method_without-arguments meta_function_method_without-arguments_ruby"><span class="keyword keyword_control keyword_control_def keyword_control_def_ruby">def</span> <span class="entity entity_name entity_name_function entity_name_function_ruby">sparkline</span></span>
  <span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>RMagick<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
  <span class="meta meta_require meta_require_ruby"><span class="keyword keyword_other keyword_other_special-method keyword_other_special-method_ruby">require</span> <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>sparklines<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span>
  respond_to <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do </span>|format|
    data = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>d</span>]
    params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>h</span>].blank? ? (height = <span class="constant constant_numeric constant_numeric_ruby">40</span>) : (height = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>h</span>])
    params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>s</span>].blank? ? (step = <span class="constant constant_numeric constant_numeric_ruby">4</span>) : (step = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>s</span>])
    params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>c</span>].blank? ? (color = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>2A5DB8<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>) : (color = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>c</span>])
    params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>t</span>].blank? ? (type = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>smooth<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>) : (type = params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>t</span>])

    data = <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>0<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span> <span class="keyword keyword_control keyword_control_ruby">if</span> params[<span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>d</span>].blank?
    format.png <span class="keyword keyword_control keyword_control_ruby keyword_control_ruby_start-block">do
</span>      sparkline = <span class="support support_class support_class_ruby">Sparklines</span>.plot_to_image(
                                    data.split(<span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>,<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>).collect {<span class="meta meta_syntax meta_syntax_ruby meta_syntax_ruby_start-block"> </span>|d| d.to_i },
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>type</span> =&gt; type,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>upper</span> =&gt; <span class="constant constant_numeric constant_numeric_ruby">0</span>,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>above_color</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>#<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>color<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>line_color</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>#<span class="source source_ruby source_ruby_embedded source_ruby_embedded_source"><span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">#{</span>color<span class="punctuation punctuation_section punctuation_section_embedded punctuation_section_embedded_ruby">}</span></span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>step</span> =&gt; step,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>height</span> =&gt; height
                                    )
      send_data sparkline.to_blob,  <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>filename</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>sparkline.png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>disposition</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>inline<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>,
                                    <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>type</span> =&gt; <span class="string string_quoted string_quoted_double string_quoted_double_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">"</span>image/png<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">"</span></span>
    <span class="keyword keyword_control keyword_control_ruby">end</span>
  <span class="keyword keyword_control keyword_control_ruby">end</span>
<span class="keyword keyword_control keyword_control_ruby">end</span></span></pre>
<p>Don&#8217;t forget to add the sparkline to your routes <em>(config/routes.rb)</em>:</p>
<pre class="textmate-source mac_classic"><span class="source source_ruby">map.sparkline      <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>/sparkline<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>controller</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'graphs</span><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span>, <span class="constant constant_other constant_other_symbol constant_other_symbol_ruby"><span class="punctuation punctuation_definition punctuation_definition_constant punctuation_definition_constant_ruby">:</span>action</span> =&gt; <span class="string string_quoted string_quoted_single string_quoted_single_ruby"><span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_ruby">'</span>sparkline<span class="punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_ruby">'</span></span></span></pre>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/ruby-on-rails/sparklines/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Ari Hest</title>
		<link>http://brandonpassley.com/portfolio/ari-hest/</link>
		<comments>http://brandonpassley.com/portfolio/ari-hest/#comments</comments>
		<pubDate>Wed, 25 Mar 2009 18:01:24 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=230</guid>
		<description><![CDATA[Continuing the journey into content management system integrations for Matthew Williams’ band/artist websites.]]></description>
			<content:encoded><![CDATA[<p>Once again working with<a href="http://nomoregoodnames.com" target="_blank"> Matthew Williams</a>, I built a custom content management system for the new Ari Hest website. I can&#8217;t claim work on any of the design or front-end flash work <em>(I wish I could because it looks awesome)</em>. This content management system was a little easier than previous work on the <a href="http://brandonpassley.com/portfolio/william-fitzsimmons" target="_self">William Fitzsimmons</a> website, since it only required a simple news and tour administration and no video work. I did add a PDF tour flyer generator<em> (which was also used for the William Fitzsimmons site)</em> which allows users to download a flyer for any tour date. This is a great feature for colleges, or for those fans that just want to support the band and post their own flyers.</p>
<p>I&#8217;ve been listening to Ari Hest for a few years now and still haven&#8217;t gotten tired of his music. Make sure to check out his new site.</p>
<p><a href="http://arihest.com" target="_blank">[ Visit the Ari Hest website ]</a></p>
<div id="attachment_231" class="wp-caption alignnone" style="width: 610px"><img class="size-full wp-image-231" title="ari_hest_screenshot" src="http://brandonpassley.com/wp-content/uploads/2009/03/ari_hest_screenshot.png" alt="Ari Hest Screenshot" width="600" height="486" /><p class="wp-caption-text">Ari Hest Screenshot</p></div>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/ari-hest/feed/</wfw:commentRss>
		</item>
		<item>
		<title>WebbChange.com</title>
		<link>http://brandonpassley.com/ruby-on-rails/webbchange/</link>
		<comments>http://brandonpassley.com/ruby-on-rails/webbchange/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 17:04:55 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=212</guid>
		<description><![CDATA[WebbChange is an unique, innovative, democratic, social search engine made possible by a new currency that represents your opinion.]]></description>
			<content:encoded><![CDATA[<p>This is seriously going to be the future of determining what is valuable on the web. The virtual coin system was the brilliant idea of Travis Russel and was brought to reality by a great team. I had, and still have, the great privilege of being the sole designer and programmer for the project. WebbChange strives to be the world leader in providing individually pertinent information by empowering people to define what is valuable and useful on the web. This is all done with the aforementioned virtual coins system. Each user gets 10,000 coins to distribute to whatever websites, images, files, videos or articles they think are valuable. If they use all 10,000 coins, they have to re-evaluate and re-adjust their coins to continue determining what they find valuable. This creates a system where each user has the exact same amount of value, as in, no user gets to &#8220;vote&#8221; more than any other user.</p>
<p><strong>Design and function of the &#8220;Boards&#8221;<br />
</strong>The design is information driven. I wanted to keep the design simple and focused and out of the way of the information the user is trying to find. With so much information, the most logical solution was to create individual boards that displayed specific search driven results. These boards are extremely versatile and can be customized to call and display any information from the database. For example one board could simply be &#8220;Top Websites&#8221; where another board could be &#8220;Top Websites by Females&#8221;. Each board is also self contained and paginates the results. These boards carry throughout the website. Whether the user is on the homepage or on a website&#8217;s details page or on the search page, the boards stay consistent.</p>
<p><strong>The WebbChange SmartSearch</strong><br />
The search results that can be populated (user info stays confidential, of course) from the information WebbChange stores is amazing. If you are looking for what users in Australia who are 20 to 30, who don&#8217;t smoke and who enjoy &#8220;Horses&#8221; value, WebbChange will show you. We have coined the term &#8220;Social Search Engine&#8221; because it populates its results based on each user&#8217;s interests, networks, location, etc. and then organizes them by top coin amounts. Even Google and Yahoo don&#8217;t do this ;)</p>
<p><strong>The future of WebbChange</strong><br />
We have sooo many features in development and planned for the future from personalization of a user&#8217;s homepage, top website competitions, to bringing WebbChange out of the &#8220;web&#8221;. Make sure to keep checking on <a href="http://webbchange.com" target="_blank">WebbChange.com</a> and on my personal site for upcoming changes.</p>
<p><a href="http://webbchange.com" target="_blank">[ Visit WebbChange.com ]</a></p>
<div class="mceTemp">
<dl id="attachment_213" class="wp-caption alignnone" style="width: 610px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-213" title="webbchange-home" src="http://brandonpassley.com/wp-content/uploads/2009/03/webbchange-home.jpg" alt="WebbChange Screenshot" width="600" height="803" /></dt>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/ruby-on-rails/webbchange/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Parrish Hanna</title>
		<link>http://brandonpassley.com/portfolio/parrish-hanna/</link>
		<comments>http://brandonpassley.com/portfolio/parrish-hanna/#comments</comments>
		<pubDate>Mon, 15 Dec 2008 15:56:12 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=200</guid>
		<description><![CDATA["From a corporate design leader to sought after speaker and professor, Parrish Hanna has a broad array of experience in the world of digital business solution and brand experience development."]]></description>
			<content:encoded><![CDATA[<p>Parrish required a personal website that created a stage for him to discuss and highlight his professional theories, thought processes and general experiences. Working with the brilliant <a href="http://daniel-sauter.com" target="_blank">Daniel Sauter</a> (<a href="/portfolio/uic-art-architecture">UIC Art &amp; Architecture</a>) again, the direction came out of a need to make, what would typically be a very boring and &#8220;wordy&#8221; site, into something much more interesting and innovative.</p>
<p>Therefore, we focused on typography and movement. The UI consists of a plane and a grid of every page laying flat on it. Any internal link the user follows does not load a new page, but rather moves the entire plane and grid to the appropriate &#8220;slide&#8221;. This movement is not only intriguing, but begins to create interesting layouts since a portion of each adjacent &#8220;slide&#8221; peaks into the browser window.</p>
<p><strong>Development Notes</strong><br />
Because of the nature of the site, I built a custom content management system (CMS) with PHP/MySQL to work specifically with the difficult front-end layouts. One of the most interesting features no one would see is that Parrish only has to update the basic content in the CMS and the front-end will determine which of the three layouts it should use based on images, text, files, etc. The very cool sliding feature uses the <a href="http://mootools.net/" target="_blank">MooTools</a> JavaScript library. This would have gotten a little hairy without it.</p>
<p><strong>Final Thoughts</strong><br />
A text-based website does not have to be boring.</p>
<p><a title="DrawbridgeApp.com" href="http://parrishhanna.com" target="_blank">[ Visit the Parrish Hanna site ]</a></p>
<p><img class="size-full wp-image-202 alignnone" title="parrishhanna-hybrid" src="http://brandonpassley.com/wp-content/uploads/2009/03/parrishhanna-hybrid.jpg" alt="Parrish Hanna Screenshot" width="600" height="439" /></p>
<p><img class="size-full wp-image-204 alignnone" title="parrishhanna-images" src="http://brandonpassley.com/wp-content/uploads/2009/03/parrishhanna-images.jpg" alt="Parrish Hanna Screenshot" width="600" height="439" /></p>
<p><img class="size-full wp-image-205 alignnone" title="parrishhanna-textual" src="http://brandonpassley.com/wp-content/uploads/2009/03/parrishhanna-textual.jpg" alt="Parrish Hanna Screenshot" width="600" height="439" /></p>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/parrish-hanna/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Drawbridge Quote Manager</title>
		<link>http://brandonpassley.com/ruby-on-rails/drawbridge-quote-proposal-manager/</link>
		<comments>http://brandonpassley.com/ruby-on-rails/drawbridge-quote-proposal-manager/#comments</comments>
		<pubDate>Thu, 30 Oct 2008 14:28:41 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/wordpress/?p=102</guid>
		<description><![CDATA[Before a project can start, a quote must be approved. DrawbridgeApp.com can help you create, organize and track these quotes. With it's elegant design and simple user interface, Drawbridge can make the quoting process… not so bad.]]></description>
			<content:encoded><![CDATA[<p>Drawbridge started as a way for me to experiment and learn with Ruby on Rails. It ended up turning into a fully functional online application that many users have found to be very successful. The idea of a quote and proposal manager came in a need to fullfill many requests for project quotes in my freelancing career. Drawbridge gave me a way to organize, track and manage quotes for all of my projects. If you want to learn more about Drawbridge,<a href="http://drawbridgeapp.com/tour"> look at the tour</a> to see many of the features. To get the best tour, <a href="http://drawbridgeapp.com/plans">sign-up for a free account</a> and play around.</p>
<p><a title="DrawbridgeApp.com" href="http://drawbridgeapp.com">[ Visit the DrawbridgeApp.com site ]</a></p>
<p><img class="size-full wp-image-106 alignnone" title="drawbridge_quotes" src="http://brandonpassley.com/wp-content/uploads/2008/10/quote_edit.jpg" alt="" /></p>
<p><img class="size-full wp-image-108 alignnone" title="drawbridge_quote_view" src="http://brandonpassley.com/wp-content/uploads/2008/10/quote_view.jpg" alt="Drawbridge Screen Shot" /></p>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/ruby-on-rails/drawbridge-quote-proposal-manager/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ETC ComputerLand Branding</title>
		<link>http://brandonpassley.com/portfolio/etc-computerland/</link>
		<comments>http://brandonpassley.com/portfolio/etc-computerland/#comments</comments>
		<pubDate>Wed, 29 Oct 2008 20:17:33 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[Design]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Print]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/wordpress/?p=134</guid>
		<description><![CDATA[Select projects and branding for ETC Computerland which were developed while I was the Senior Interactive Designer.]]></description>
			<content:encoded><![CDATA[<p>ETC ComputerLand is a small technology company in Quincy, IL <em>(my home town)</em> that services many of the top local companies as well as a few national companies. They do everything from cabling, to advanced technologies <em>(think Cisco)</em>, to developing high-end websites and custom applications. I worked as the Senior Interactive Designer in my almost two years there. I was in charge of developing a consistent look and feel as well as overseeing all client related designs. We had a team of three developers, three designers, a sales person and a project manager.</p>
<p><a href="http://etccomputerland.com" target="_blank">[ Visit the ETC ComputerLand website ]</a><a href="http://brandonpassley.com/wordpress/wp-content/uploads/2008/10/etc_welcome_final.pdf" target="_blank"><br />
[ Download the PDF welcome packet ]</a></p>
<div id="attachment_136" class="wp-caption alignnone" style="width: 660px"><img class="size-full wp-image-136" title="etc_2" src="http://brandonpassley.com/wp-content/uploads/2008/10/etc_2.jpg" alt="This was a welcome packet that was designed to give new customers a general overview of everything that ETC ComputerLand could do for them." width="650" height="429" /><p class="wp-caption-text">This was a welcome packet that was designed to give new customers a general overview of everything that ETC ComputerLand could do for them.</p></div>
<div id="attachment_137" class="wp-caption alignnone" style="width: 660px"><img class="size-full wp-image-137" title="etc_1" src="http://brandonpassley.com/wp-content/uploads/2008/10/etc_1.jpg" alt="ETC ComputerLand Business Cards" width="650" height="449" /><p class="wp-caption-text">These business cards deliver the first taste of the ETC brand. The clean typography, white space and simple color scheme show a professional, contemporary brand.</p></div>
<div id="attachment_135" class="wp-caption alignnone" style="width: 660px"><img class="size-full wp-image-135" title="etc_3" src="http://brandonpassley.com/wp-content/uploads/2008/10/etc_3.jpg" alt="An example of the universal look and feel of the ETC branding. The clean colors and typography create a streamlined brand and stays consistent through all of the ETC brand." width="650" height="497" /><p class="wp-caption-text">These business cards deliver the first taste of the ETC brand. The clean typography, white space and simple color scheme show a professional, contemporary brand.</p></div>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/etc-computerland/feed/</wfw:commentRss>
		</item>
		<item>
		<title>William Fitzsimmons</title>
		<link>http://brandonpassley.com/portfolio/william-fitzsimmons/</link>
		<comments>http://brandonpassley.com/portfolio/william-fitzsimmons/#comments</comments>
		<pubDate>Sun, 28 Sep 2008 17:35:07 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/?p=227</guid>
		<description><![CDATA[The journey into content management system integrations for Matthew Williams' band/artist websites.]]></description>
			<content:encoded><![CDATA[<p>I can&#8217;t claim any design work on this website, but I did build a custom content management system for the William Fitzsimmons website. Working with <a href="http://nomoregoodnames.com/" target="_blank">Matthew Willams</a> on this project, I needed to integrate a system that allowed William to update his tours, news and videos quickly and easily. I built a custom CMS to do all of this, including integrating <a href="http://www.youtube.com/user/williamfitzsimmons" target="_blank">William&#8217;s YouTube videos</a> into the open source <a href="http://www.longtailvideo.com/players/jw-flv-player/" target="_blank">JW FLV Media Player</a>. One other great feature I built for the site was a dynamic PDF tour flyer generator <em>(say that a few times fast)</em> which allows users to download a flyer for any tour date. This is a great feature for colleges, or for those fans that just want to support the band and post their own flyers.</p>
<p>If you&#8217;re in the mood for folk-ish music to ease <em>(or not ease)</em> the soul check out <a href="http://www.williamfitzsimmons.com" target="_blank">William Fitszimmons</a>.<a href="http://www.williamfitzsimmons.com" target="_blank"><br />
</a></p>
<p><a href="http://www.williamfitzsimmons.com" target="_blank">[ Visit the William Fitszimmons site ]</a></p>
<div class="mceTemp">
<dl id="attachment_228" class="wp-caption alignnone" style="width: 604px;">
<dt class="wp-caption-dt"><img class="size-full wp-image-228" title="william_fitzsimmons_screenshot" src="http://brandonpassley.com/wp-content/uploads/2009/03/william_fitzsimmons_screenshot.jpg" alt="William Fitzsimmons Screenshot" width="594" height="959" /></dt>
</dl>
</div>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/william-fitzsimmons/feed/</wfw:commentRss>
		</item>
		<item>
		<title>goBidPro Auction Software</title>
		<link>http://brandonpassley.com/portfolio/gobidpro-auction-software/</link>
		<comments>http://brandonpassley.com/portfolio/gobidpro-auction-software/#comments</comments>
		<pubDate>Fri, 14 Sep 2007 16:05:45 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/wordpress/?p=116</guid>
		<description><![CDATA[GoBidPro is an online auction service built and designed for radio stations to run on-air, on-line and on-paper (newspaper) auctions.]]></description>
			<content:encoded><![CDATA[<p>The software was built in PHP/MySQL and designed to create a work flow for administrators and users to efficiently get to the information they need. Since GoBidPro is being sold to radio stations and not to individual users the administrative area was the main focus for the project . This means that the radio station must have a system that can manage, track, organize, create, destroy, bill and archive every aspect to each auction.</p>
<p>This wasn&#8217;t an easy process considering there were over 11 main categories to manage, each having one or more sub-categories. From customers, vendors and salespeople to inventory and reports, the software had to manage everything, but most importantly had to tie all of these areas together into one universal work flow.</p>
<p><img class="size-full wp-image-118 alignnone" title="gobidpro_2" src="http://brandonpassley.com/wp-content/uploads/2008/10/gobidpro_2.jpg" alt="GoBidPro Screen Shot" /></p>
<p><img class="size-full wp-image-120 alignnone" title="gobidpro_3" src="http://brandonpassley.com/wp-content/uploads/2008/10/gobidpro_3.jpg" alt="GoBidPro Screen Shot" /></p>
<p><img class="size-full wp-image-121 alignnone" title="gobidpro_1" src="http://brandonpassley.com/wp-content/uploads/2008/10/gobidpro_1.jpg" alt="GoBidPro Inventory Screen Shot" /></p>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/gobidpro-auction-software/feed/</wfw:commentRss>
		</item>
		<item>
		<title>UIC Art &amp; Architecture</title>
		<link>http://brandonpassley.com/portfolio/uic-art-architecture/</link>
		<comments>http://brandonpassley.com/portfolio/uic-art-architecture/#comments</comments>
		<pubDate>Fri, 23 Feb 2007 15:37:31 +0000</pubDate>
		<dc:creator>Brandon Passley</dc:creator>
		
		<category><![CDATA[PHP/MySQL]]></category>

		<category><![CDATA[Portfolio]]></category>

		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://brandonpassley.com/wordpress/?p=37</guid>
		<description><![CDATA[This project was initiated and led by Daniel Sauter, Assistant Professor, Electronic Visualization – UIC and made possible with a team of six.]]></description>
			<content:encoded><![CDATA[<p><span class="excerpt">The website was started from scratch, the design and programming were collaborative, but each member specialized in some type of aspect. The project was developed over a ten month time period.</span></p>
<p>Team members:<em> Brandon Passley, Graphic Design/Electronic Visualization; Jack Fisher, Graphic Design; Gene Parcellano, Graphic Design; Camille Mankus, Graphic Design; Anna Trzyna, Electronic Visualization; Santi Vitayaudom, Electronic Visualization; </em></p>
<p><a title="UIC Art &amp; Architecure" href="http://adweb.aa.uic.edu/web/" target="_blank">[ more information ]</a></p>
<p><img class="size-full wp-image-53 alignnone" title="uic_portfolio_1" src="http://brandonpassley.com/wp-content/uploads/2008/10/uic_portfolio_1.jpg" alt="UIC Art &amp; Architecture" /></p>
<p><img class="alignnone size-full wp-image-58" title="uic_portfolio_3" src="http://brandonpassley.com/wp-content/uploads/2008/10/uic_portfolio_3.jpg" alt="" /></p>
<p><img class="alignnone size-full wp-image-57" title="uic_portfolio_2" src="http://brandonpassley.com/wp-content/uploads/2008/10/uic_portfolio_2.jpg" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://brandonpassley.com/portfolio/uic-art-architecture/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
