easy_pay_u_latam 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +101 -0
  4. data/Rakefile +37 -0
  5. data/app/assets/config/easy_pay_u_latam_manifest.js +2 -0
  6. data/app/assets/images/easy_pay_u_latam/btn-payu.png +0 -0
  7. data/app/assets/images/easy_pay_u_latam/payu.png +0 -0
  8. data/app/assets/javascripts/easy_pay_u_latam/application.js +2 -0
  9. data/app/assets/stylesheets/easy_pay_u_latam/application.scss +3 -0
  10. data/app/assets/stylesheets/easy_pay_u_latam/styles.css +4 -0
  11. data/app/controllers/easy_pay_u_latam/api/v1/pay_u_payments_controller.rb +111 -0
  12. data/app/controllers/easy_pay_u_latam/api_controller.rb +5 -0
  13. data/app/controllers/easy_pay_u_latam/application_controller.rb +5 -0
  14. data/app/controllers/easy_pay_u_latam/pay_u_payments_controller.rb +27 -0
  15. data/app/helpers/easy_pay_u_latam/application_helper.rb +11 -0
  16. data/app/jobs/easy_pay_u_latam/application_job.rb +4 -0
  17. data/app/mailers/easy_pay_u_latam/application_mailer.rb +6 -0
  18. data/app/mailers/easy_pay_u_latam/pay_u_payment_mailer.rb +17 -0
  19. data/app/models/easy_pay_u_latam/application_record.rb +5 -0
  20. data/app/models/easy_pay_u_latam/payu_payment.rb +22 -0
  21. data/app/views/easy_pay_u_latam/api/v1/pay_u_payments/index.rabl +0 -0
  22. data/app/views/easy_pay_u_latam/pay_u_payment_mailer/error.html.erb +7 -0
  23. data/app/views/easy_pay_u_latam/pay_u_payment_mailer/success.html.erb +7 -0
  24. data/app/views/easy_pay_u_latam/pay_u_payments/_form.html.erb +46 -0
  25. data/app/views/easy_pay_u_latam/pay_u_payments/edit.html.erb +40 -0
  26. data/app/views/easy_pay_u_latam/pay_u_payments/index.html.erb +0 -0
  27. data/app/views/easy_pay_u_latam/pay_u_payments/show.html.erb +104 -0
  28. data/app/views/layouts/easy_pay_u_latam/application.html.erb +14 -0
  29. data/app/views/layouts/easy_pay_u_latam/mailer.html.erb +74 -0
  30. data/config/initializers/rabl.rb +6 -0
  31. data/config/locales/devise.en.yml +64 -0
  32. data/config/routes.rb +16 -0
  33. data/db/migrate/20170929211207_create_easy_pay_u_latam_payu_payments.rb +58 -0
  34. data/lib/easy_pay_u_latam.rb +20 -0
  35. data/lib/easy_pay_u_latam/Configuration.rb +66 -0
  36. data/lib/easy_pay_u_latam/engine.rb +5 -0
  37. data/lib/easy_pay_u_latam/version.rb +3 -0
  38. data/lib/tasks/easy_pay_u_latam_tasks.rake +4 -0
  39. metadata +172 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 64d19525974012f933758d447a5da89ab9bcc1bc
4
+ data.tar.gz: 0127060a8f4a73a4aa6a1bbae2030955d4ad3f5e
5
+ SHA512:
6
+ metadata.gz: ad907cdcab40b76e6444a1ee9544e08131d3cf545a75a095169dd99717a0432783925785284452d65ec196d7359e72c579e501f99229e72bf9d4b9a77064aaf1
7
+ data.tar.gz: 422c86b12b469e56b69818f8f88bfba04cee936d1ec9a419910830719a225808edab7e60151b16540cc10aa9eb4301af55bb434c3dfab9ea1aeac843dbe84245
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2017
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # EasyPayULatam
2
+ With this gem you can integrate the WebCheckout of PayU Latam with simple steps.
3
+
4
+ ## Installation
5
+ Add this line to your application's Gemfile:
6
+
7
+ ```ruby
8
+ gem 'easy_pay_u_latam'
9
+ ```
10
+
11
+ We strongly recommend using Devise gem.
12
+ ```ruby
13
+ gem 'devise'
14
+ ```
15
+
16
+ And then execute:
17
+ ```bash
18
+ $ bundle install
19
+ ```
20
+
21
+ Then run
22
+ ```bash
23
+ $ rails easy_pay_u_latam:install:migrations
24
+ ```
25
+
26
+ If you want to reference the payments to a user, you can run the following migration.
27
+ ```bash
28
+ $ rails g migration AddUserReferencesToEasyPayULatamPayuPayments user:references
29
+ ```
30
+
31
+ Don't forget to mount Engine in your routes.rb
32
+ ```ruby
33
+ # config/routes.rb
34
+ mount EasyPayULatam::Engine, at: "/easy_pay_u_latam"
35
+ ```
36
+
37
+ And precompile the engine assets (PayU logos).
38
+ ```ruby
39
+ # config/initializers/assets.rb
40
+ Rails.application.config.assets.precompile += %w( easy_pay_u_latam/* )
41
+ ```
42
+
43
+ ## Configuration
44
+ First create a easy_pay_u_latam.rb in your config/initializers
45
+ ```ruby
46
+ # config/initializers/easy_pay_u_latam.rb
47
+ EasyPayULatam.configure do |config|
48
+ config.api_key = "YOUR PAY U LATAM API KEY"
49
+ config.account_id = "YOUR PAY U ACCOUNT ID"
50
+ config.merchant_id = "YOUR PAY U MERCHANT ID"
51
+ config.placeholder = "SOME PLACE HOLDER FOR PAY U REFERENCE CODE"
52
+ config.root_url = "ROOT URL FOR PRODUCTION"
53
+ #Pay U will consume a Web Service and it can not be in localhost, you most use something like ngrok
54
+ config.test_root_url = "ROOT URL FOR TESTING"
55
+ config.currency_precision = 2 #By default is 0 for colombian peso
56
+ end
57
+ ```
58
+
59
+ You can tell the engine which layout to use by overriding the application_controller
60
+ ```ruby
61
+ # app/controllers/easy_pay_u_latam/application_controller.rb
62
+ module EasyPayULatam
63
+ class ApplicationController < ActionController::Base
64
+ protect_from_forgery with: :exception
65
+ layout "app/layouts/application"
66
+ end
67
+ end
68
+ ```
69
+
70
+ You also should override the engine application_mailer so it can send success and error emails after PayU confirmation.
71
+ ```ruby
72
+ # app/mailers/easy_pay_u_latam/application_mailer.rb
73
+ module EasyPayULatam
74
+ class ApplicationMailer < ActionMailer::Base
75
+ # You can also tell the engine which mailer layout to use
76
+ layout 'easy_pay_u_latam/mailer'
77
+ default from: 'Placeholder <test@example.com>'
78
+ end
79
+ end
80
+ ```
81
+
82
+ Finally create some method on any of you controllers that create the instance and data base record of the PayUPayment, you must especify amount, currency and description, period, start_date, and end_date are optionals if you are using this gem for subscriptions like payments.
83
+ ```ruby
84
+ @payu_payment = EasyPayULatam::PayuPayment.create(
85
+ amount: amount,
86
+ currency: "COP",
87
+ period: params[:period],
88
+ user_id: current_user.id,
89
+ description: "Your description here...",
90
+ start_date: Date.today,
91
+ end_date: end_date
92
+ )
93
+
94
+ redirect_to "/easy_pay_u_latam/pay_u_payments/#{@payu_payment.id}/edit"
95
+ ```
96
+
97
+ ## Contributing
98
+ This gem is stable but it have a lot of room for improvement, is my first gem so a lot of thing could be better, feel free to help and share.
99
+
100
+ ## License
101
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
data/Rakefile ADDED
@@ -0,0 +1,37 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'EasyPayULatam'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+ load 'rails/tasks/statistics.rake'
22
+
23
+
24
+
25
+ require 'bundler/gem_tasks'
26
+
27
+ require 'rake/testtask'
28
+
29
+ Rake::TestTask.new(:test) do |t|
30
+ t.libs << 'lib'
31
+ t.libs << 'test'
32
+ t.pattern = 'test/**/*_test.rb'
33
+ t.verbose = false
34
+ end
35
+
36
+
37
+ task default: :test
@@ -0,0 +1,2 @@
1
+ //= link_directory ../javascripts/easy_pay_u_latam .js
2
+ //= link_directory ../stylesheets/easy_pay_u_latam .css
@@ -0,0 +1,2 @@
1
+ //= require jquery
2
+ //= require bootstrap-sprockets
@@ -0,0 +1,3 @@
1
+ @import "bootstrap-sprockets";
2
+ @import "bootstrap";
3
+ @import "easy_pay_u_latam/styles";
@@ -0,0 +1,4 @@
1
+ .btn-payu{
2
+ background: none;
3
+ border: none;
4
+ }
@@ -0,0 +1,111 @@
1
+ module EasyPayULatam
2
+ class Api::V1::PayUPaymentsController < ApiController
3
+
4
+ # acts_as_token_authentication_handler_for User
5
+
6
+ def index
7
+ @payu_payments = PayuPayment.where(user_id: current_user.id)
8
+ end
9
+
10
+ def show
11
+ @payu_payment = PayuPayment.where(user_id: current_user.id).find params[:id]
12
+ end
13
+
14
+ def get_status
15
+ payu_payment = PayuPayment.where(user_id: current_user.id).order(created_at: :desc).first
16
+
17
+ message = "Tu pago está "
18
+ if payu_payment.status == PayuPayment::APPROVED
19
+ message += "Aprobado"
20
+ elsif payu_payment.status == PayuPayment::REJECTED
21
+ message += "Rechazado"
22
+ else
23
+ message += "Pendiente"
24
+ end
25
+
26
+ render status: 200, json: {message: message, payment_status: payu_payment.status}
27
+ end
28
+
29
+ def confirmation
30
+ @payUConfig = EasyPayULatam.configuration
31
+ # Generacion de codigo en md5
32
+ md5 = Digest::MD5.new
33
+ # api-key ~ merchant_id ~ id-sale ~ valor ~ cop ~aprovada
34
+ md5.update "#{@payUConfig.get_api_key}~#{@payUConfig.get_merchant_id}~#{params['reference_sale']}~#{params['value'].to_f}~#{params['currency']}~4"
35
+ key = md5.hexdigest
36
+
37
+ if key.to_s == params['sign'].to_s
38
+ payu_payment = PayuPayment.find(params[:id])
39
+ unless payu_payment.nil?
40
+
41
+ status = 2
42
+ if params['state_pol'] == "4"
43
+ status = 1
44
+ end
45
+
46
+ payu_payment.update(
47
+ status: status,
48
+ buyer_phone: params['phone'],
49
+ number_card: params['cc_number'],
50
+ payer_name: params['cc_holder'],
51
+ billing_country: params['billing_country'],
52
+ description: params['description'],
53
+ # value: params['value'],
54
+ payment_method_type: params['payment_method_type'],
55
+ buyer_email: params['email_buyer'],
56
+ response_message_pol: params['response_message_pol'],
57
+ shipping_city: params['shipping_city'],
58
+ transaction_id: params['transaction_id'],
59
+ sign: params['sign'],
60
+ tax: params['tax'],
61
+ payment_method: params['payment_method'],
62
+ billing_address: params['billing_address'],
63
+ payment_method_name: params['payment_method_name'],
64
+ state_pol: params['state_pol'],
65
+ buyer_nickname: params['nickname_buyer'],
66
+ reference_pol: params['reference_pol'],
67
+ currency: params['currency'],
68
+ risk: params['risk'],
69
+ shipping_address: params['shipping_address'],
70
+ bank_id: params['bank_id'],
71
+ payment_request_state: params['payment_request_state'],
72
+ customer_number: params['customer_number'],
73
+ administrative_fee_base: params['administrative_fee_base'],
74
+ attempts: params['attempts'],
75
+ merchant_id: params['merchant_id'],
76
+ exchange_rate: params['exchange_rate'],
77
+ shipping_country: params['shipping_country'],
78
+ franchise: params['franchise'],
79
+ ip: params['ip'],
80
+ billing_city: params['billing_city'],
81
+ reference_code: params['reference_sale']
82
+ )
83
+
84
+ if params['state_pol'] == "4"
85
+ PayUPaymentMailer.success(payu_payment.payer_name, payu_payment.buyer_email, payu_payment).deliver_now!
86
+ else
87
+ PayUPaymentMailer.error(payu_payment.payer_name, payu_payment.buyer_email, payu_payment).deliver_now!
88
+ end
89
+
90
+ render status: 200, json: { status: 'OK', message: 'OK', params: params }
91
+
92
+ else
93
+ PayUPaymentMailer.error(payu_payment.payer_name, payu_payment.email_buyer, payu_payment).deliver_now!
94
+ render status: 411, json: { status: 'OK', message: 'No existe referencia de pago', params: params }
95
+ end
96
+ else
97
+
98
+ render status: 411, json: { status: 'OK', message: 'Error de seguridad signature', params: params }
99
+ end
100
+
101
+ end
102
+
103
+ end
104
+
105
+ private
106
+
107
+ def set_access_control_headers
108
+ headers['Access-Control-Allow-Origin'] = '*'
109
+ headers['Access-Control-Request-Method'] = %w{GET POST OPTIONS HEAD}.join(',')
110
+ end
111
+ end
@@ -0,0 +1,5 @@
1
+ module EasyPayULatam
2
+ class ApiController < ActionController::Base
3
+ protect_from_forgery with: :null_session
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ module EasyPayULatam
2
+ class ApplicationController < ActionController::Base
3
+ protect_from_forgery with: :exception
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ module EasyPayULatam
2
+ class PayUPaymentsController < ApplicationController
3
+
4
+ # before_action :authenticate_user!
5
+
6
+ def index
7
+ @payu_payments = PayuPayment.where(user_id: params[:user_id])
8
+ end
9
+
10
+ def show
11
+ @payu_payment = PayuPayment.where(user_id: params[:user_id]).find params[:id]
12
+ end
13
+
14
+ def edit
15
+ @payUConfig = EasyPayULatam.configuration
16
+ @payu_payment = PayuPayment.where(user_id: params[:user_id]).find params[:id]
17
+
18
+ @payu_payment.update_attribute :reference_code, "#{@payUConfig.placeholder}-#{@payu_payment.id}"
19
+ @payu_payment.update_attribute :status, PayuPayment::PENDING
20
+
21
+ md5 = Digest::MD5.new
22
+ md5.update "#{@payUConfig.get_api_key}~#{@payUConfig.get_merchant_id}~#{@payUConfig.placeholder}-#{@payu_payment.id}~#{@payu_payment.amount}~#{@payu_payment.currency}"
23
+ @signature = md5.hexdigest
24
+ end
25
+
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ module EasyPayULatam
2
+ module ApplicationHelper
3
+ def method_missing(method, *args, &block)
4
+ if (method.to_s.end_with?('_path') || method.to_s.end_with?('_url')) && main_app.respond_to?(method)
5
+ main_app.send(method, *args)
6
+ else
7
+ super
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,4 @@
1
+ module EasyPayULatam
2
+ class ApplicationJob < ActiveJob::Base
3
+ end
4
+ end
@@ -0,0 +1,6 @@
1
+ module EasyPayULatam
2
+ class ApplicationMailer < ActionMailer::Base
3
+ # default from: 'from@example.com'
4
+ layout 'easy_pay_u_latam/mailer'
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ module EasyPayULatam
2
+ class PayUPaymentMailer < ApplicationMailer
3
+
4
+ def success(name, email, payment)
5
+ @name = name
6
+ @payment = payment
7
+ mail to: email, subject: "¡Hemos recibido tu pago!"
8
+ end
9
+
10
+ def error(name, email, payment)
11
+ @name = name
12
+ @payment = payment
13
+ mail to: email, subject: "¡Tu pago ha sido rechazado!"
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,5 @@
1
+ module EasyPayULatam
2
+ class ApplicationRecord < ActiveRecord::Base
3
+ self.abstract_class = true
4
+ end
5
+ end
@@ -0,0 +1,22 @@
1
+ module EasyPayULatam
2
+ class PayuPayment < ApplicationRecord
3
+ PENDING = 0
4
+ APPROVED = 1
5
+ REJECTED = 2
6
+
7
+ validates :amount, :currency, :user_id, :description, presence: true
8
+
9
+ def approved
10
+ self.status == APPORVED
11
+ end
12
+
13
+ def rejected
14
+ self.status == REJECTED
15
+ end
16
+
17
+ def pending
18
+ self.status == PENDING
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ <p>
2
+ Hola <%= @name %>, tu pago ha sido rechazado.
3
+ </p>
4
+ <br>
5
+ <br>
6
+ <br>
7
+ <%= link_to "Ver detalles", pay_u_payment_url(@payment), style: "background-color: #FED106; border-color: #FED106; color: black; padding: 10px; border-radius: 5px; text-decoration: none; font-size: 20px; font-weight: bold" %>
@@ -0,0 +1,7 @@
1
+ <p>
2
+ Hola <%= @name %>, hemos recibido tu pago.
3
+ </p>
4
+ <br>
5
+ <br>
6
+ <br>
7
+ <%= link_to "Ver detalles", pay_u_payment_url(@payment), style: "background-color: #FED106; border-color: #FED106; color: black; padding: 10px; border-radius: 5px; text-decoration: none; font-size: 20px; font-weight: bold" %>
@@ -0,0 +1,46 @@
1
+ <div class="row" style="margin-bottom: 20px;">
2
+ <div class="col-md-12">
3
+ <label>Nombre del pagador: </label>
4
+ <input name='buyerFullName' type='text' placeholder="Nombre" class="form-control" required>
5
+ </div>
6
+ </div>
7
+ <div class="row" style="margin-bottom: 20px;">
8
+ <div class="col-md-12">
9
+ <label>Email del comprador</label>
10
+ <input name='buyerEmail' type='email' placeholder='Correo electrónico' class="form-control" required/>
11
+ </div>
12
+ </div>
13
+ <div class="row" style="margin-bottom: 20px;">
14
+ <div class="col-md-12">
15
+ <label>Teléfono del pagador: </label>
16
+ <input name='telephone' type='phone' class="form-control" placeholder="Teléfono" required>
17
+ </div>
18
+ </div>
19
+ <div class="row" style="margin-bottom: 20px;">
20
+ <div class="col-md-12">
21
+ <label>Dirección: </label>
22
+ <input name='shippingAddress' type='text' class="form-control" placeholder="Dirección" required>
23
+ </div>
24
+ </div>
25
+ <div class="row" style="margin-bottom: 20px;">
26
+ <div class="col-md-12">
27
+ <label>Ciudad: </label>
28
+ <input name='shippingCity' type='text' class="form-control" placeholder="Ciudad" required>
29
+ </div>
30
+ </div>
31
+ <!-- Campos Ocultos -->
32
+ <!-- Mínima información requerida por PayULatam -->
33
+ <!-- http://developers.payulatam.com/es/web_checkout/integration.html -->
34
+ <input name='merchantId' type='hidden' value='<%= @payUConfig.get_merchant_id %>'>
35
+ <input name='accountId' type='hidden' value='<%= @payUConfig.get_account_id %>'>
36
+ <input name='description' type='hidden' value='<%= @payu_payment.description %>'>
37
+ <input name='referenceCode' type='hidden' value='<%= @payUConfig.placeholder %>-<%=@payu_payment.id%>'>
38
+ <input name='amount' type='hidden' value='<%= @payu_payment.amount %>'>
39
+ <input name='tax' type='hidden' value='0'>
40
+ <input name='taxReturnBase' type='hidden' value='0'>
41
+ <input name='currency' type='hidden' value='<%= @payu_payment.currency %>'>
42
+ <input name='signature' type='hidden' value='<%= @signature %>'>
43
+ <input name='shippingCountry' type='hidden' value='CO'>
44
+
45
+ <input name='responseUrl' type='hidden' value='<%= @payUConfig.get_root_url %>/easy_pay_u_latam/pay_u_payments/<%= @payu_payment.id %>?user_id=<%= params[:user_id]%>'>
46
+ <input name='confirmationUrl' type='hidden' value='<%= @payUConfig.get_root_url %>/easy_pay_u_latam/api/v1/pay_u_payments/<%= @payu_payment.id %>/confirmation.json?user_id=<%= params[:user_id]%>'>
@@ -0,0 +1,40 @@
1
+ <div class="panel panel-default">
2
+ <div class="panel-heading">
3
+ <h3 class="panel-title">
4
+ Datos para el pago
5
+ </h3>
6
+ </div>
7
+ <div class="panel-body">
8
+ <form method='post' action='<%= @payUConfig.get_payu_url %>'>
9
+ <div class="row">
10
+ <%# se revisa que la clinica si tenga el permiso de pagar o las inscripciones esten abiertas para pagar %>
11
+
12
+ <div class="col-md-5 col-md-offset-1">
13
+ <div class="row">
14
+ <div class="col-md-12">
15
+ <%= image_tag 'easy_pay_u_latam/payu.png', style: "width: 100%"%>
16
+ </div>
17
+ </div>
18
+ <%= render "form" %>
19
+ </div>
20
+ <div class="col-md-5">
21
+ <div class="jumbotron">
22
+ <h1>
23
+ <small>Total (<%= @payu_payment.currency%>):</small><br>
24
+ <%= number_to_currency @payu_payment.amount, precision: @payUConfig.currency_precision, delimiter: "." %>
25
+ </h1>
26
+ <p>
27
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
28
+ </p>
29
+ <p class="text-center" style="margin-top: 20px;">
30
+ <button class="btn-payu" type="submit" style="background: none; border: none;">
31
+ <%= image_tag "easy_pay_u_latam/btn-payu.png", style: "width: 100%;" %>
32
+ </button>
33
+ </p>
34
+ </div>
35
+ </div>
36
+
37
+ </div>
38
+ </form>
39
+ </div>
40
+ </div>
@@ -0,0 +1,104 @@
1
+ <div class="panel panel-default">
2
+ <div class="panel-heading">
3
+ <h3 class="panel-title">
4
+ Información de tu pago
5
+ </h3>
6
+ </div>
7
+ <div class="panel-body">
8
+ <div class="row">
9
+ <div class="col-md-6 col-md-offset-3">
10
+ <table class="table table-stripped">
11
+ <tr>
12
+ <th>Estado de la transacción general:</th>
13
+ <td>
14
+ <% if @payu_payment.status == 1 %>
15
+ <span class="label label-success">
16
+ Aprobada
17
+ </span>
18
+ <% elsif @payu_payment.status == 2 %>
19
+ <span class="label label-danger">
20
+ Rechazada
21
+ </span>
22
+ <% else %>
23
+ <span class="label label-warning">
24
+ Pendiente de pago
25
+ </span>
26
+ <% end %>
27
+ </td>
28
+ </tr>
29
+ <!-- <tr>
30
+ <th>Estado de la transacción por pasarela:</th>
31
+ <td>
32
+ <%#= @payu_payment.transaction_state %>
33
+ </td>
34
+ </tr> -->
35
+ <tr>
36
+ <th>ID de transacción:</th>
37
+ <td>
38
+ <%= @payu_payment.transaction_id %>
39
+ </td>
40
+ </tr>
41
+ <% if !@payu_payment.start_date.nil? && !@payu_payment.end_date.nil? %>
42
+ <tr>
43
+ <th>Periodo pagado:</th>
44
+ <td>
45
+ <%= @payu_payment.start_date %>
46
+ a
47
+ <%= @payu_payment.end_date %>
48
+ </td>
49
+ </tr>
50
+ <% end %>
51
+ <tr>
52
+ <th>Referencia de pago:</th>
53
+ <td>
54
+ <%= @payu_payment.reference_code %>
55
+ </td>
56
+ </tr>
57
+ <tr>
58
+ <th>Descripción:</th>
59
+ <td>
60
+ <%= @payu_payment.description %>
61
+ </td>
62
+ </tr>
63
+ <tr>
64
+ <th>Total pagado:</th>
65
+ <td>
66
+ <%= number_to_currency @payu_payment.amount, precision: 0, delimiter: "." %> <%= @payu_payment.currency %>
67
+ </td>
68
+ </tr>
69
+ <tr>
70
+ <th>Nombre de quien pagó:</th>
71
+ <td>
72
+ <%= @payu_payment.payer_name %>
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <th>Email de quien pagó:</th>
77
+ <td>
78
+ <%= @payu_payment.buyer_email %>
79
+ </td>
80
+ </tr>
81
+ <tr>
82
+ <th>Teléfono de quien pagó:</th>
83
+ <td>
84
+ <%= @payu_payment.buyer_phone %>
85
+ </td>
86
+ </tr>
87
+ <tr>
88
+ <th>Dirección de envío:</th>
89
+ <td>
90
+ <%= @payu_payment.shipping_address %> - <%= @payu_payment.shipping_city %> - <%= @payu_payment.shipping_country %>
91
+ </td>
92
+ </tr>
93
+ <tr>
94
+ <th>CUS de autenticación (SOLO PSE):</th>
95
+ <td>
96
+ <%= @payu_payment.cus %>
97
+ </td>
98
+ </tr>
99
+ </table>
100
+ </div>
101
+ </div>
102
+
103
+ </div>
104
+ </div>
@@ -0,0 +1,14 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Easy pay u latam</title>
5
+ <%= stylesheet_link_tag "easy_pay_u_latam/application", media: "all" %>
6
+ <%= javascript_include_tag "easy_pay_u_latam/application" %>
7
+ <%= csrf_meta_tags %>
8
+ </head>
9
+ <body>
10
+
11
+ <%= yield %>
12
+
13
+ </body>
14
+ </html>
@@ -0,0 +1,74 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
6
+ <title>Pago recibido </title>
7
+ <style type="text/css">
8
+ #outlook a {padding:0;}
9
+ body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
10
+ .ExternalClass {width:100%;}
11
+ .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
12
+ #backgroundTable {margin:0; padding:0; width:100% !important; line-height: 100% !important;}
13
+ table { border-collapse:collapse; mso-table-lspace:0pt; mso-table-rspace:0pt; }
14
+ table td {border-collapse: collapse;}
15
+
16
+ @media only screen and (max-width: 640px) {
17
+ body[yahoo] .deviceWidth {width:440px!important; }
18
+
19
+ body[yahoo] .full {
20
+ display:block;
21
+ width:100%;
22
+ }
23
+ }
24
+ </style>
25
+ </head>
26
+ <%# @info = Information.first %>
27
+ <body yahoo="fix">
28
+ <table cellpadding="0" cellspacing="0" border="0" id="backgroundTable" width="100%">
29
+ <tr>
30
+ <td align="center">
31
+
32
+ <p align="center" style="margin-bottom: 20px;">
33
+ <!-- <img src="https://s3.amazonaws.com/agroneto/mailer/AGRONETO-logo.png" alt="AgroNeto" style="width: 200px;"> -->
34
+ </p>
35
+
36
+ <%= yield %>
37
+
38
+ <table cellpadding="0" cellspacing="0" border="0" align="center" width="600">
39
+ <tr>
40
+ <td align="center" style="padding: 30px 0;">
41
+ <!-- <p style="font-family: Arial, sans-serif; font-size: 14px; color: #0F6A37; margin-bottom: 25px;">
42
+ <a href="http://agroneto.com" style="text-decoration: none; color: #0F6A37;">
43
+ AgroNeto
44
+ </a>
45
+ |
46
+ <a href="http://agroneto.com/terms" style="text-decoration: none; color: #0F6A37;">
47
+ Términos y condiciones
48
+ </a>
49
+ </p>
50
+ <p style="line-height: 32px;">
51
+ <a href="<%#= @info.facebook_link %>">
52
+ <span style="background-color: #0F6A37; padding: 9px 10px 3px 11px; margin-right: 5px;">
53
+ <img src="https://s3.amazonaws.com/agroneto/mailer/facebook-icon.png" height="16" alt="" border="0" />
54
+ </span>
55
+ </a>
56
+ <a href="<#%= @info.twitter_link %>">
57
+ <span style="background-color: #0F6A37; padding: 9px 10px 3px 11px; margin-right: 5px;">
58
+ <img src="https://s3.amazonaws.com/agroneto/mailer/twitter-icon.png" height="16" alt="" border="0" />
59
+ </span>
60
+ </a>
61
+ </p> -->
62
+ <p style="font-family: Arial, sans-serif; font-size: 13px; color: #7b7b7b; margin-bottom: 3px;">
63
+ <%#= @info.copyrights_text %>
64
+ </p>
65
+ <!-- <p style="font-family: Arial, sans-serif; font-size: 12px; color: #7b7b7b; margin-top: 0;">If you don't want to receive the newsletter, you can simply <a href="http://yourlink" style="text-decoration: none; color: #69B417;">unsubscribe</a></p> -->
66
+ </td>
67
+ </tr>
68
+ </table>
69
+
70
+ </td>
71
+ </tr>
72
+ </table>
73
+ </body>
74
+ </html>
@@ -0,0 +1,6 @@
1
+ require 'rabl'
2
+ Rabl.configure do |config|
3
+ config.include_json_root = false
4
+ config.include_child_root = false
5
+ config.replace_nil_values_with_empty_strings = true
6
+ end
@@ -0,0 +1,64 @@
1
+ # Additional translations at https://github.com/plataformatec/devise/wiki/I18n
2
+
3
+ en:
4
+ devise:
5
+ confirmations:
6
+ confirmed: "Your email address has been successfully confirmed."
7
+ send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
8
+ send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
9
+ failure:
10
+ already_authenticated: "You are already signed in."
11
+ inactive: "Your account is not activated yet."
12
+ invalid: "Invalid %{authentication_keys} or password."
13
+ locked: "Your account is locked."
14
+ last_attempt: "You have one more attempt before your account is locked."
15
+ not_found_in_database: "Invalid %{authentication_keys} or password."
16
+ timeout: "Your session expired. Please sign in again to continue."
17
+ unauthenticated: "You need to sign in or sign up before continuing."
18
+ unconfirmed: "You have to confirm your email address before continuing."
19
+ mailer:
20
+ confirmation_instructions:
21
+ subject: "Confirmation instructions"
22
+ reset_password_instructions:
23
+ subject: "Reset password instructions"
24
+ unlock_instructions:
25
+ subject: "Unlock instructions"
26
+ email_changed:
27
+ subject: "Email Changed"
28
+ password_change:
29
+ subject: "Password Changed"
30
+ omniauth_callbacks:
31
+ failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
32
+ success: "Successfully authenticated from %{kind} account."
33
+ passwords:
34
+ no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
35
+ send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
36
+ send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
37
+ updated: "Your password has been changed successfully. You are now signed in."
38
+ updated_not_active: "Your password has been changed successfully."
39
+ registrations:
40
+ destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
41
+ signed_up: "Welcome! You have signed up successfully."
42
+ signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
43
+ signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
44
+ signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
45
+ update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
46
+ updated: "Your account has been updated successfully."
47
+ sessions:
48
+ signed_in: "Signed in successfully."
49
+ signed_out: "Signed out successfully."
50
+ already_signed_out: "Signed out successfully."
51
+ unlocks:
52
+ send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
53
+ send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
54
+ unlocked: "Your account has been unlocked successfully. Please sign in to continue."
55
+ errors:
56
+ messages:
57
+ already_confirmed: "was already confirmed, please try signing in"
58
+ confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
59
+ expired: "has expired, please request a new one"
60
+ not_found: "not found"
61
+ not_locked: "was not locked"
62
+ not_saved:
63
+ one: "1 error prohibited this %{resource} from being saved:"
64
+ other: "%{count} errors prohibited this %{resource} from being saved:"
data/config/routes.rb ADDED
@@ -0,0 +1,16 @@
1
+ EasyPayULatam::Engine.routes.draw do
2
+ # devise_for :users, class_name: "EasyPayULatam::User"
3
+ namespace :api do
4
+ namespace :v1 do
5
+ resources :pay_u_payments, only: [:index, :show] do
6
+ member do
7
+ post "confirmation"
8
+ get "payed"
9
+ get "get_status"
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ resources :pay_u_payments, only: [:index, :show, :edit, :update]
16
+ end
@@ -0,0 +1,58 @@
1
+ class CreateEasyPayULatamPayuPayments < ActiveRecord::Migration[5.0]
2
+ def change
3
+ create_table :easy_pay_u_latam_payu_payments do |t|
4
+ t.integer :status
5
+ t.date :start_date
6
+ t.date :end_date
7
+ t.string :period
8
+ t.string :reference_code
9
+ t.string :description
10
+ t.float :amount
11
+ t.float :tax
12
+ t.float :tax_return_base
13
+ t.string :currency
14
+ t.string :buyer_full_name
15
+ t.string :buyer_email
16
+ t.string :shipping_address
17
+ t.string :shipping_city
18
+ t.string :shipping_country
19
+ t.string :buyer_phone
20
+ t.integer :transaction_state
21
+ t.float :risk
22
+ t.string :reference_pol
23
+ t.integer :installments_units
24
+ t.datetime :processing_date
25
+ t.string :cus
26
+ t.string :pse_bank
27
+ t.string :response_code
28
+ t.string :payment_method
29
+ t.string :payment_method_type
30
+ t.string :payment_method_name
31
+ t.string :payment_request_state
32
+ t.string :franchise
33
+ t.string :lap_transaction_state
34
+ t.string :message
35
+ t.string :authorization_code
36
+ t.string :transaction_id
37
+ t.string :trazability_code
38
+ t.string :state_pol
39
+ t.string :number_card
40
+ t.string :payer_name
41
+ t.string :billing_country
42
+ t.string :response_message_pol
43
+ t.string :sign
44
+ t.string :billing_address
45
+ t.string :billing_city
46
+ t.string :buyer_nickname
47
+ t.string :bank_id
48
+ t.string :customer_number
49
+ t.float :administrative_fee_base
50
+ t.integer :attempts
51
+ t.string :merchant_id
52
+ t.string :exchange_rate
53
+ t.string :ip
54
+
55
+ t.timestamps
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,20 @@
1
+ require "easy_pay_u_latam/engine"
2
+ require "easy_pay_u_latam/configuration"
3
+
4
+ module EasyPayULatam
5
+ class << self
6
+ attr_accessor :configuration
7
+ end
8
+
9
+ def self.configuration
10
+ @configuration ||= Configuration.new
11
+ end
12
+
13
+ def self.reset
14
+ @configuration = Configuration.new
15
+ end
16
+
17
+ def self.configure
18
+ yield(configuration)
19
+ end
20
+ end
@@ -0,0 +1,66 @@
1
+ module EasyPayULatam
2
+ class Configuration
3
+ attr_accessor :api_key, :merchant_id, :account_id, :placeholder, :root_url, :test_root_url, :payu_url, :test_api_key, :test_merchan_id, :test_account_id, :test_payu_url, :currency_precision
4
+
5
+ def initialize
6
+ # Path for PayU responses
7
+ @currency_precision = 0
8
+ @root_url = nil
9
+ @test_root_url = nil
10
+
11
+ @placeholder = nil
12
+
13
+ # For production
14
+ @api_key = nil
15
+ @merchant_id = nil
16
+ @account_id = nil
17
+ @payu_url = "https://gateway.payulatam.com/ppp-web-gateway/"
18
+
19
+ # For testing
20
+ @test_api_key = "4Vj8eK4rloUd272L48hsrarnUA"
21
+ @test_merchant_id = "508029"
22
+ @test_account_id = "512321"
23
+ @test_payu_url = "https://sandbox.gateway.payulatam.com/ppp-web-gateway/"
24
+ end
25
+
26
+ def get_api_key
27
+ if Rails.env == "development" || Rails.env == "test"
28
+ @test_api_key
29
+ else
30
+ @api_key
31
+ end
32
+ end
33
+
34
+ def get_merchant_id
35
+ if Rails.env == "development" || Rails.env == "test"
36
+ @test_merchant_id
37
+ else
38
+ @merchant_id
39
+ end
40
+ end
41
+
42
+ def get_account_id
43
+ if Rails.env == "development" || Rails.env == "test"
44
+ @test_account_id
45
+ else
46
+ @account_id
47
+ end
48
+ end
49
+
50
+ def get_payu_url
51
+ if Rails.env == "development" || Rails.env == "test"
52
+ @test_payu_url
53
+ else
54
+ @payu_url
55
+ end
56
+ end
57
+
58
+ def get_root_url
59
+ if Rails.env == "development" || Rails.env == "test"
60
+ @test_root_url
61
+ else
62
+ @root_url
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,5 @@
1
+ module EasyPayULatam
2
+ class Engine < ::Rails::Engine
3
+ isolate_namespace EasyPayULatam
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module EasyPayULatam
2
+ VERSION = '0.1.1'
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :easy_pay_u_latam do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: easy_pay_u_latam
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - DEVPENGUIN
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-10-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '5.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: rabl
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '0'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0'
47
+ - !ruby/object:Gem::Dependency
48
+ name: jquery-rails
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0'
61
+ - !ruby/object:Gem::Dependency
62
+ name: bootstrap-sass
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0'
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ - !ruby/object:Gem::Dependency
76
+ name: sass-rails
77
+ requirement: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ type: :runtime
83
+ prerelease: false
84
+ version_requirements: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ - !ruby/object:Gem::Dependency
90
+ name: pg
91
+ requirement: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ type: :development
97
+ prerelease: false
98
+ version_requirements: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ description: PayU Latam easy integration.
104
+ email:
105
+ - simoncorreaocampo@gmail.com
106
+ executables: []
107
+ extensions: []
108
+ extra_rdoc_files: []
109
+ files:
110
+ - MIT-LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - app/assets/config/easy_pay_u_latam_manifest.js
114
+ - app/assets/images/easy_pay_u_latam/btn-payu.png
115
+ - app/assets/images/easy_pay_u_latam/payu.png
116
+ - app/assets/javascripts/easy_pay_u_latam/application.js
117
+ - app/assets/stylesheets/easy_pay_u_latam/application.scss
118
+ - app/assets/stylesheets/easy_pay_u_latam/styles.css
119
+ - app/controllers/easy_pay_u_latam/api/v1/pay_u_payments_controller.rb
120
+ - app/controllers/easy_pay_u_latam/api_controller.rb
121
+ - app/controllers/easy_pay_u_latam/application_controller.rb
122
+ - app/controllers/easy_pay_u_latam/pay_u_payments_controller.rb
123
+ - app/helpers/easy_pay_u_latam/application_helper.rb
124
+ - app/jobs/easy_pay_u_latam/application_job.rb
125
+ - app/mailers/easy_pay_u_latam/application_mailer.rb
126
+ - app/mailers/easy_pay_u_latam/pay_u_payment_mailer.rb
127
+ - app/models/easy_pay_u_latam/application_record.rb
128
+ - app/models/easy_pay_u_latam/payu_payment.rb
129
+ - app/views/easy_pay_u_latam/api/v1/pay_u_payments/index.rabl
130
+ - app/views/easy_pay_u_latam/pay_u_payment_mailer/error.html.erb
131
+ - app/views/easy_pay_u_latam/pay_u_payment_mailer/success.html.erb
132
+ - app/views/easy_pay_u_latam/pay_u_payments/_form.html.erb
133
+ - app/views/easy_pay_u_latam/pay_u_payments/edit.html.erb
134
+ - app/views/easy_pay_u_latam/pay_u_payments/index.html.erb
135
+ - app/views/easy_pay_u_latam/pay_u_payments/show.html.erb
136
+ - app/views/layouts/easy_pay_u_latam/application.html.erb
137
+ - app/views/layouts/easy_pay_u_latam/mailer.html.erb
138
+ - config/initializers/rabl.rb
139
+ - config/locales/devise.en.yml
140
+ - config/routes.rb
141
+ - db/migrate/20170929211207_create_easy_pay_u_latam_payu_payments.rb
142
+ - lib/easy_pay_u_latam.rb
143
+ - lib/easy_pay_u_latam/Configuration.rb
144
+ - lib/easy_pay_u_latam/engine.rb
145
+ - lib/easy_pay_u_latam/version.rb
146
+ - lib/tasks/easy_pay_u_latam_tasks.rake
147
+ homepage: https://github.com/simoncorreaocampo/EasyPayULatam
148
+ licenses:
149
+ - MIT
150
+ metadata: {}
151
+ post_install_message:
152
+ rdoc_options: []
153
+ require_paths:
154
+ - lib
155
+ required_ruby_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ required_rubygems_version: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - ">="
163
+ - !ruby/object:Gem::Version
164
+ version: '0'
165
+ requirements: []
166
+ rubyforge_project:
167
+ rubygems_version: 2.5.1
168
+ signing_key:
169
+ specification_version: 4
170
+ summary: With this gem you can use PayU Latam Web Checkout with some simple configuration
171
+ step.
172
+ test_files: []