Skip to content

Instantly share code, notes, and snippets.

@ecleel
Created December 14, 2016 15:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ecleel/3b08cef659c7656483b585905a13b3af to your computer and use it in GitHub Desktop.
Save ecleel/3b08cef659c7656483b585905a13b3af to your computer and use it in GitHub Desktop.

Sadad payment integration using moyasar gem

In this example, we will discuss step by step how to add sadad payment to your rails app using moyasar gem.

Requirments

Getting started

Configuring App

  1. Create new rails app.

    $ rails new sadad-example
  2. Add Moyasar ruby gem to your gem file. Then run bundle install.

    gem 'moyasar'
  3. Get your secret and publishable keys from Moyasar dashboard.

  4. Create new file config/moyasar.yml then add your keys

    development:
      secret_key: ' add your key here'
      publishable_key: ' add your key here'
    
    production:
      secret_key: ' add your key here'
      publishable_key: ' add your key here'
    
  5. Create new file config/initializers/moyasar.rb to configure moyasar gem

    MOYASAR_CONFIG = YAML.load(ERB.new(File.read("#{Rails.root}/config/moyasar.yml")).result)[Rails.env]
    Moyasar.api_key = MOYASAR_CONFIG['secret_key']
  6. Start rails server rails s

Create sadad payment request

  1. We will create simple controller to demonstrate payment integration

    rails g controller requests index create success cancel
  2. Edit config/routes.rb file to look like below

    get 'requests', to: 'requests#index', as: 'requests'
    post 'requests',to: 'requests#create'
    get 'requests/success',to: 'requests#success'
    get 'requests/cancel',to: 'requests#cancel' 
  3. We will add a simple form to views/requests/index.html.erb file with required fields to complete payment request as stated in Moyasar API Documentation.

    <% unless flash[:error].nil? %>
       <p style="color:red;"> <%= flash[:error] %></p>
    <% end %>
    
    <% unless flash[:success].nil? %>
       <p style="color:green;"> <%= flash[:success] %></p>
    <% end %>
    
    <%= form_tag requests_path do %>
      <%= text_field_tag "username", nil ,placeholder: 'Sadad user name'%>
      <br/>
      <%= text_field_tag "amount", nil ,placeholder: 'Amount in SAR' %>
      <br/>
      <%= submit_tag "Create Payment"%>
    <% end %>
  4. Edit controllers/requests_controller#create method as below:

    def create
        begin
            # Create payment request
            @payment = Moyasar::Payment.create(
                                               # payment amount
                                               amount: params[:amount],
                                               # payment currency
                                               currency: 'SAR',
                                               # payment description
                                               description: 'test payment',
                                               source: {
                                                # payment type . Sadad in our context
                                                type:   'sadad',
                                                # Sadad username
                                                username:   params[:username],
                                                # Redirect URL in case of payment success
                                                success_url: request.base_url + '/requests/success',
                                                # Redirect URL in case of payment failure
                                                fail_url:    request.base_url + '/requests/cancel',
                                    })
              
              if @payment.status.eql?("failed")
                flash[:error] = @payment.source.message
                redirect_to requests_path
              else
                # save payment id in session
                session[:payment_id] = @payment.id
                redirect_to @payment.source.transaction_url
              end
        rescue Moyasar::InvalidRequestError => e
              flash[:error] = e.message
              redirect_to requests_path
        end
    end
  5. Enter valid sadad payment information then click create payment button, Then If sadad information are valid, you will be redirected to sadad page to complete your payment.

  6. If payment requeste completed successfully you will be redirected to success URL.

  7. Edit controllers/requests_controller#success to handle payment success as below:

    def success
        flash[:success] = "Payment processed successfully"
        redirect_to requests_path
    end
  8. If payment failed you will be redirected to cancel URL.

  9. Edit controllers/requests_controller#cancel to handle payment failure as below:

    def cancel
        # Fetch payment to get failure message
        @payment = Moyasar::Payment.fetch(session[:payment_id])
        flash[:error] = @payment.source.message
        redirect_to requests_path
    end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment