Does ActiveMerchant support Subscription Based transaction

后端 未结 2 1941
情书的邮戳
情书的邮戳 2021-02-06 14:58

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 base

相关标签:
2条回答
  • 2021-02-06 15:23

    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.

    0 讨论(0)
  • 2021-02-06 15:26

    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.

    0 讨论(0)
提交回复
热议问题