redsys-rails 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2b62aaf9562efda0dd97753c3fc5bd8134f49837
4
- data.tar.gz: 17694548d97b8bc42b3de71262a00f019d1e8243
3
+ metadata.gz: 5b82968f40f5fc6e3c85abd2504ebf0a1bbb380f
4
+ data.tar.gz: 2df72a13f967db89c5324897f54c409acb73a2fc
5
5
  SHA512:
6
- metadata.gz: 86061b3497e5b234885a22545a507a12bbb4a2804fe1dd0d69f385862020692d91da7bb9196b74f1d76561aab05e5ef1a4b877ad21d3eb7644add0332f5b5998
7
- data.tar.gz: 6229ab27f6fae95d65ac54a411311d7e7d7015e9d575fdbc74a37fbc97e0ed22ddf04a6394a88eb2a6ea7523afa8122dd1c942405a54b238d16de171b1eccd17
6
+ metadata.gz: 4d85f101c14b361ab407069de6f2f2fbb67569ca9ecca43b27b2032f9a21867c5b1a433d85381efa3a81153ec5e00b6d71ce6cff4e0f5507576adf2a95965fe3
7
+ data.tar.gz: 035e5278265f1b4aabb372691a19795b5e274ddc1c042f07a4ab037f4860454bc54d929f8da59af2eee95d3613cd802c9395b1f92e99f7c191326df443c17d0f
data/README.md CHANGED
@@ -1,33 +1,79 @@
1
1
  # Redsys::Rails
2
2
 
3
- Gem Payment platform Redsys
3
+ Redsys-Rails es una pequeña solución para integrar de forma rápida y sencilla la pasarela de pago de [Redsys.es](http://www.redsys.es/).
4
4
 
5
- A Ruby gem for communicating with the payment platform of Redsys
5
+ ## Requerimientos
6
+ - Esta gema solo proporciona las herramientas necesarias para integrar la opción de redirección desde la página web del comercio al TPV virtual contratado.
7
+ - Es necesario disponer de las claves de acceso que la entidad financiera habrá proporcionado al comercio para poder instalar esta gema.
6
8
 
7
- ## Installation
9
+ ## Instalación
8
10
 
9
- Add this line to your application's Gemfile:
11
+ Añade la siguiente línea al Gemfile de tu aplicación:
10
12
 
11
13
  ```ruby
12
14
  gem 'redsys-rails'
13
15
  ```
14
16
 
15
- And then execute:
17
+ Ejecuta:
16
18
 
17
19
  $ bundle
18
20
 
19
- Or install it yourself as:
21
+ O instala la gema tu mismo:
20
22
 
21
23
  $ gem install redsys-rails
22
24
 
23
- ## Usage
25
+ Genera el inicializador ejecutando el generador:
24
26
 
27
+ $ rails g redsys:install
25
28
 
29
+ Por último, configura los parámetros del TPV virutal en [config/initializers/redsys-rails.rb](lib/generators/templates/redsys-rails.rb)
26
30
 
27
- ## Contributing
31
+ ## Utilización
28
32
 
29
- 1. Fork it ( https://github.com/[my-github-username]/redsys-rails/fork )
30
- 2. Create your feature branch (`git checkout -b my-new-feature`)
31
- 3. Commit your changes (`git commit -am 'Add some feature'`)
32
- 4. Push to the branch (`git push origin my-new-feature`)
33
- 5. Create a new Pull Request
33
+ En el controlador donde realice el tratamiento de su pedido, una vez obtenido el id único del mismo,
34
+ redireccione al formulario de salto del tpv virtual mediante el siguiente código.
35
+
36
+ ```ruby
37
+ redirect_to redsys_form_path(amount: '', order: '', language: '')
38
+ ```
39
+
40
+ Un ejemplo:
41
+
42
+ ```ruby
43
+ redirect_to redsys_form_path(amount: '20.35', order: '0001', language: '001')
44
+ ```
45
+
46
+ #### Códigos de idioma
47
+
48
+ Castellano-001, Inglés-002, Catalán-003, Francés-004, Alemán-005, Holandés-006, Italiano-007, Sueco-008, Portugués-009,
49
+ Valenciano-010, Polaco-011, Gallego-012 y Euskera-013
50
+
51
+ #### URL de retorno
52
+
53
+ Si no ha configurado las url's de retorno para transacción correcta y para transacción fallida en el panel de control de su comercio,
54
+ puede proporcionarlas en la redirección mediante los parámetros url_ok y url_ko.
55
+
56
+ Un ejemplo:
57
+
58
+ ```ruby
59
+ redirect_to redsys_form_path(amount: '20.35', order: '0001', language: '001', url_ok: 'http://misite.com/pedido_ok', url_ko: 'http://misite.com/pedido_error')
60
+ ```
61
+
62
+ ## Notificación on-line
63
+
64
+ Instalación del webhook para la notificación online.
65
+
66
+ $ rails g redsys:notifications
67
+
68
+ El módulo es funcional y hace accesible una ruta para que el TPV virtual pueda notificar la transacción. Es aquí donde el comercio
69
+ ha de realizar las acciones necesarias, como por ejemplo actualizar el estado de su pedido confirmando el pago.
70
+
71
+ *Falta una explicación más detallada de esta funcionalidad.*
72
+
73
+ ## Contribuir
74
+
75
+ 1. Fork ( https://github.com/[my-github-username]/redsys-rails/fork )
76
+ 2. Crea la rama de tu funcionalidad (`git checkout -b my-new-feature`)
77
+ 3. Commita tus cambios (`git commit -am 'Add some feature'`)
78
+ 4. Push a la rama (`git push origin my-new-feature`)
79
+ 5. Crea un nuevo Pull Request
@@ -0,0 +1,23 @@
1
+ module Redsys
2
+ class TpvController < ApplicationController
3
+ skip_before_filter :verify_authenticity_token, only: [:confirmation]
4
+
5
+ #
6
+ # Formulario de salto a la pasarela de pago
7
+ # - amount:decimal => Importe a cobrar
8
+ # - order:integer => identidificador del pedido/reserva, ha de ser único
9
+ # - language:string => '001' Español, '002' Inglés...
10
+ # - url_ok:string => url de vuelta del tpv para pago correcto
11
+ # - url_ko:string => url de vuelta del tpv cuando ocurre un error
12
+ #
13
+ def form
14
+ amount = BigDecimal.new(params[:amount] || '0')
15
+ order = Integer(params[:order] || '0')
16
+ language = params[:language]
17
+ url_ok = params[:url_ok]
18
+ url_ko = params[:url_ko]
19
+ @tpv = Redsys::Tpv.new(amount, order, language, redsys_notification_url, url_ok, url_ko)
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,87 @@
1
+ require 'openssl'
2
+ require 'base64'
3
+ require 'json'
4
+
5
+ module Redsys
6
+ class Tpv
7
+ attr_accessor :amount, :language, :order, :currency, :merchant_code, :terminal,
8
+ :transaction_type, :merchant_url, :url_ok, :url_ko, :sha1, :signature
9
+
10
+ def self.tpv_url
11
+ Rails.configuration.redsys_rails[:url]
12
+ end
13
+
14
+ def self.signature_version
15
+ Rails.configuration.redsys_rails[:signature_version]
16
+ end
17
+
18
+ def initialize(amount, order, language, merchant_url = nil, url_ok = nil, url_ko = nil)
19
+ amount ||= 0
20
+ order ||= 0
21
+ language ||= '001'
22
+ merchant_url ||= ''
23
+ url_ok ||= ''
24
+ url_ko ||= ''
25
+
26
+ @amount = (amount * 100).to_i.to_s
27
+ @order = order.to_s.rjust(4, '0')
28
+ @language = language
29
+ @merchant_url = merchant_url
30
+ @url_ok = url_ok
31
+ @url_ko = url_ko
32
+
33
+ @currency = Rails.configuration.redsys_rails[:merchant_currency]
34
+ @merchant_code = Rails.configuration.redsys_rails[:merchant_code]
35
+ @terminal = Rails.configuration.redsys_rails[:merchant_terminal]
36
+ @transaction_type = Rails.configuration.redsys_rails[:merchant_transaction_type]
37
+ end
38
+
39
+ def merchant_params
40
+ "#{Base64.strict_encode64(merchant_params_json)}"
41
+ end
42
+
43
+ def merchant_params_json
44
+ merchant_parameters = {
45
+ :DS_MERCHANT_AMOUNT => @amount,
46
+ :DS_MERCHANT_ORDER => @order,
47
+ :DS_MERCHANT_MERCHANTCODE => @merchant_code,
48
+ :DS_MERCHANT_CURRENCY => @currency,
49
+ :DS_MERCHANT_TRANSACTIONTYPE => @transaction_type,
50
+ :DS_MERCHANT_TERMINAL => @terminal,
51
+ :DS_MERCHANT_MERCHANTURL => @merchant_url,
52
+ :DS_MERCHANT_URLOK => @url_ok,
53
+ :DS_MERCHANT_URLKO => @url_ko
54
+ }
55
+ JSON.generate(merchant_parameters)
56
+ end
57
+
58
+ def merchant_signature_3des
59
+ Base64.strict_encode64(encrypt_3DES(@order, Base64.strict_decode64(Rails.configuration.redsys_rails[:sha_256_key])))
60
+ end
61
+
62
+ def merchant_signature
63
+ key = Base64.strict_decode64(Rails.configuration.redsys_rails[:sha_256_key])
64
+ key = encrypt_3DES(@order, key)
65
+ encrypt_mac256(merchant_params, key)
66
+ end
67
+
68
+ private
69
+
70
+ def encrypt_mac256(data, key)
71
+ Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, data))
72
+ end
73
+
74
+ def encrypt_3DES(data, key)
75
+ cipher = OpenSSL::Cipher::Cipher.new('DES3')
76
+ cipher.encrypt
77
+ cipher.key = key
78
+ cipher.padding = 0
79
+ block_length = 8
80
+ data_str = data
81
+ data_str += "\0" until data_str.bytesize % block_length == 0
82
+ output = cipher.update(data_str)
83
+ output << cipher.final
84
+ output
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,8 @@
1
+ <%= form_tag(Redsys::Tpv.tpv_url, id: 'redsys_tpv_form') do %>
2
+ <%= hidden_field_tag 'Ds_SignatureVersion', Redsys::Tpv.signature_version %>
3
+ <%= hidden_field_tag 'Ds_MerchantParameters', @tpv.merchant_params %>
4
+ <%= hidden_field_tag 'Ds_Signature', @tpv.merchant_signature %>
5
+ <% end %>
6
+ <script type="text/javascript">
7
+ document.getElementById("redsys_tpv_form").submit();
8
+ </script>
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ Rails.application.routes.draw do
2
+ get 'redsys/form' => 'redsys/tpv#form', as: :redsys_form
3
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/named_base'
3
+
4
+ module Redsys
5
+ module Generators
6
+ class InstallGenerator < Rails::Generators::Base
7
+ source_root File.expand_path("../../templates", __FILE__)
8
+
9
+ def copy_initializer
10
+ template "redsys-rails.rb", "config/initializers/redsys-rails.rb"
11
+ end
12
+ end
13
+ end
14
+ end
15
+
@@ -0,0 +1,18 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/named_base'
3
+
4
+ module Redsys
5
+ module Generators
6
+ class NotificationsGenerator < Rails::Generators::Base
7
+ source_root File.expand_path("../../templates", __FILE__)
8
+
9
+ def copy_controller
10
+ template "controllers/notifications_controller.rb", "app/controllers/redsys/notifications_controller.rb"
11
+ end
12
+
13
+ def add_routes
14
+ route "post 'redsys/notification' => 'redsys/notifications#notification', as: :redsys_notification"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,19 @@
1
+ module Redsys
2
+ class NotificationsController < ApplicationController
3
+ skip_before_filter :verify_authenticity_token
4
+
5
+ #
6
+ # Tratamiento para la notificación online
7
+ # - Ds_Response == "0000" => Transacción correcta
8
+ #
9
+ def notification
10
+ json_params = JSON.parse(Base64.strict_decode64(params[:Ds_MerchantParameters]))
11
+ if json_params["Ds_Response"].present? && json_params["Ds_Response"] == "0000"
12
+ status = :ok
13
+ else
14
+ status = :bad_request
15
+ end
16
+ render nothing: true, layout: false, status: status
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ #
2
+ # * Valores proporcionados por su entidad financiera
3
+ #
4
+ Rails.configuration.redsys_rails = {
5
+ url: '', # * Url TPV
6
+ sha_256_key: '', # * Clave para firma HMAC SHA256
7
+ merchant_code: '', # * Código de comercio
8
+ merchant_terminal: '', # * Terminal
9
+ merchant_transaction_type: '', # * Tipo de transacción
10
+ merchant_currency: '978', # * 978: euro, 840: dólares, 826: libras, 392: yenes
11
+ signature_version: 'HMAC_SHA256_V1' # Versión firma HMAC SHA256
12
+ }
@@ -1,5 +1,5 @@
1
1
  module RedsysRails
2
2
  module Rails
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redsys-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - guzmanweb
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-01-27 00:00:00.000000000 Z
11
+ date: 2016-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -50,7 +50,14 @@ files:
50
50
  - LICENSE.txt
51
51
  - README.md
52
52
  - Rakefile
53
- - app/models/redsys_tpv.rb
53
+ - app/controllers/redsys/tpv_controller.rb
54
+ - app/models/redsys/tpv.rb
55
+ - app/views/redsys/tpv/form.html.erb
56
+ - config/routes.rb
57
+ - lib/generators/redsys/install_generator.rb
58
+ - lib/generators/redsys/notifications_generator.rb
59
+ - lib/generators/templates/controllers/notifications_controller.rb
60
+ - lib/generators/templates/redsys-rails.rb
54
61
  - lib/redsys-rails.rb
55
62
  - lib/redsys-rails/version.rb
56
63
  - redsys-rails.gemspec
@@ -74,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
74
81
  version: '0'
75
82
  requirements: []
76
83
  rubyforge_project:
77
- rubygems_version: 2.4.2
84
+ rubygems_version: 2.4.5
78
85
  signing_key:
79
86
  specification_version: 4
80
87
  summary: A Ruby gem for communicating with the payment platform of Redsys
@@ -1,69 +0,0 @@
1
- require 'openssl'
2
- require 'base64'
3
- require 'json'
4
-
5
- class RedsysTpv
6
- attr_accessor :amount, :language, :order, :currency, :merchant_code, :terminal,
7
- :transaction_type, :merchant_url, :url_ok, :url_ko, :sha1, :signature
8
-
9
- def initialize(amount, order, language)
10
- @amount = (amount * 100).to_i.to_s
11
- @language = (language == :es) ? '001' : '002'
12
- @order = order.to_s.rjust(4, '0')
13
-
14
- @currency = Rails.application.secrets.tpv_merchant_currency
15
- @merchant_code = Rails.application.secrets.tpv_merchant_code
16
- @terminal = Rails.application.secrets.tpv_merchant_terminal
17
- @transaction_type = Rails.application.secrets.tpv_merchant_transaction_type
18
-
19
- #@merchant_url = "#{Rails.application.secrets.tpv_merchant_url}?booking_id=#{booking.id}&language=#{I18n.locale}"
20
- end
21
-
22
- def merchant_params
23
- Base64.strict_encode64(merchant_params_json)
24
- end
25
-
26
- def merchant_params_json
27
- merchant_parameters = {
28
- :DS_MERCHANT_AMOUNT => @amount,
29
- :DS_MERCHANT_ORDER => @order,
30
- :DS_MERCHANT_MERCHANTCODE => @merchant_code,
31
- :DS_MERCHANT_CURRENCY => @currency,
32
- :DS_MERCHANT_TRANSACTIONTYPE => @transaction_type,
33
- :DS_MERCHANT_TERMINAL => @terminal,
34
- :DS_MERCHANT_MERCHANTURL => @merchant_url,
35
- :DS_MERCHANT_URLOK => @url_ok,
36
- :DS_MERCHANT_URLKO => @url_ko
37
- }
38
- JSON.generate(merchant_parameters)
39
- end
40
-
41
- def merchant_signature_3des
42
- Base64.strict_encode64(encrypt_3DES(@order, Base64.strict_decode64(Rails.application.secrets.tpv_sha_256_key)))
43
- end
44
-
45
- def merchant_signature
46
- key = Base64.strict_decode64(Rails.application.secrets.tpv_sha_256_key)
47
- key = encrypt_3DES(@order, key)
48
- encrypt_mac256(merchant_params, key)
49
- end
50
-
51
- private
52
-
53
- def encrypt_mac256(data, key)
54
- Base64.strict_encode64(OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, data))
55
- end
56
-
57
- def encrypt_3DES(data, key)
58
- cipher = OpenSSL::Cipher::Cipher.new('DES3')
59
- cipher.encrypt
60
- cipher.key = key
61
- cipher.padding = 0
62
- block_length = 8
63
- data_str = data
64
- data_str += "\0" until data_str.bytesize % block_length == 0
65
- output = cipher.update(data_str)
66
- output << cipher.final
67
- output
68
- end
69
- end