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.
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:
: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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With