Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does ActiveMerchant support Subscription Based transaction

I am trying to integrate ActiveMerchant in my rails app. I have certain plans that if subscribed limit the user access. As you all guyz might be knowing what a subscription based app is, I am not going into explaining my app. Please suggest me some examples for making this happen. I have already viewed the railscasts episodes 141 through 146 but Ryan has only demonstrated Paypal Web Payments Standard and Paypal Web Payments Pro. I have also read a bunch of blogs but it didn't help.

Please help.

Thanks in Advance.

like image 911
Rohit Avatar asked Nov 11 '10 12:11

Rohit


2 Answers

Better late than never, huh?

The actual master branch of ActiveMerchant contains a recurring class integrated into both the PaypalGateway and PaypalExpressGateway.

Here's a demo snippet which works. I'm just not sure about a few points (I will update the answer as soon as I figured them out), which are:

  • Just setting the billing agreement does not show any price regardless of setting :initial_amount. Including an Item will show the item's price above the billing_agreement[:description]. So I am not sure how this affects capturings, which is what I am testing these days.
  • IPN notifications. They're missing in the following snippet. Update following...

    class PaymentsController < ApplicationController
      include ActiveMerchant::Billing
    
    
      # GET /subscriptions/:id/checkout
      def checkout
        payment_request = PAYPAL_EXPRESS_GATEWAY.setup_purchase(@subscription.price_in_cents,
            :billing_agreement => {
                :type => 'RecurringPayments',
                :description => 'Subscription agreement',
            },
    
            :currency => 'CHF',
            :no_shipping => true,
            :allow_guest_checkout => true,
            :allow_note => false,
            :initial_amount => @subscription.price_in_cents,
            :locale => 'de',
            :ip => request.remote_ip,
            :return_url => url_for(:action => :confirm, :only_path => false),
            :cancel_return_url => url_for(:action => :cancel, :only_path => false),
            # Looks like :notify_url is not used here, but in the next section 
        )
    
        if payment_request.success?
          redirect_to PAYPAL_EXPRESS_GATEWAY.redirect_url_for(payment_request.token)
        else
          # Render something informal
          render :text => payment_request.inspect.to_s and return
        end
      end
    
      # POST /subscriptions/:id/confirm 
      # params having token and PayerID
      def confirm
        profile = PAYPAL_EXPRESS_GATEWAY.recurring(@subscription.price_in_cents, nil, 
            :description => 'Subscription agreement',
            :start_date => Date.tomorrow, # PayPal throws an error if the date is not in the future
            :period => 'Year',
            :frequency => 1,
            :amount => @subscription.price_in_cents,
            :currency => 'CHF',
            :initial_amount => @subscription.price_in_cents,
            :auto_bill_outstanding => true,
    
            :token => params[:token]
        )
    
        # profile has profile_id and profile_status. remember status because this gets updated via IPN.
        @debug = {:params => params.inspect.to_s, :profile => profile.inspect.to_s }
    
        # Render something informal
        render :text => @debug.to_s and return
      end
    
    
      # implement instead of just log
      def notification
        log = Logger.new 'log/ipn.log'
        log.debug params.inspect
        render :text => params.inspect.to_s and return
      end
    
    
      # Private methods omitted
    
    end
    

You want to have a look into PaypalRecurringAPI and PaypalExpressGateway / PayPalGateway to see which options are processed and in which place of the xml request.

edit The newer, revised screencast about paypal and recurring billing is done with a separate paypal-recurring gem. Maybe this helps if you can't get it to work with ActiveMerchant.

like image 181
pdu Avatar answered Nov 17 '22 15:11

pdu


Active merchant supports recurring payments for some of its gateways ( https://github.com/Shopify/active_merchant/wiki/GatewayFeatureMatrix ).

Each has slightly different syntax ( https://github.com/Shopify/active_merchant/blob/master/lib/active_merchant/billing/gateways/authorize_net_cim.rb) but can accomplish what you want.

I would recommend however you pick your payment gateway and use a specific APi for it. AM lags behind somewhat (from my experience) and recurring payments are not its primary goal.

There are also services out there that will handle all the gateway interaction for you and you just deal with there API. It makes it easier to accept payment and handle Pci DSS requirements in the case of 3rd party hosted payment pages.

like image 38
David Lyod Avatar answered Nov 17 '22 14:11

David Lyod