stall-atos 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: daf588b4c8f1d06db827b602cc8eae3b4a137139
4
+ data.tar.gz: 34163d8ac6e761c506ce37d2ae8f8d01e2e55f2f
5
+ SHA512:
6
+ metadata.gz: 8e136677ec3ac23ae433114051d390e2084065e758d96092850285224f125a35df9980d66eab82065cc358acba7ea6acdf4680e7b0049d152c4d53b46553c588
7
+ data.tar.gz: 048de03bba28c77bacc848f3fd228086b66973bc5a91a861998debca45332d31b40c1625e96f4b4f820208deeef8ded14cfe5907f10ebdaa24a4f361cd4a1ef0
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ *.gem
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,4 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.3.0
4
+ before_install: gem install bundler -v 1.11.2
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in stall-atos.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 vala
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,80 @@
1
+ # Stall::Atos
2
+
3
+ This gem allows integrating your [Stall](https://github.com/stall-rails/stall)
4
+ e-commerce app with one of the Atos online payment gateway solutions.
5
+
6
+ This gem is just the glue between [Stall](https://github.com/stall-rails/stall)
7
+ and the provided Atos executable.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'stall-atos'
15
+ ```
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install stall-atos
24
+
25
+ Then use the install generator to copy the config template file :
26
+
27
+ $ rails generator stall:atos:install
28
+
29
+
30
+ ## Usage
31
+
32
+ You first need to configure the gateway by filling the required variables in
33
+ that were added to the stall config initialize.
34
+
35
+ By default, it is configured to fetch from the variables from the environment,
36
+ so ideally, just create the following env vars :
37
+
38
+ - `ATOS_MERCHANT_ID`
39
+ - `ATOS_SECRET_KEY`
40
+
41
+ > **Note** : Test merchant id and secret key can be different than production
42
+ ones.
43
+
44
+ Now, go to the Stall initializer, and fill in the test and production URLs
45
+ provdided by your bank in the `atos.test_payment_url` and `atos.payment_url`
46
+ configuration.
47
+
48
+ Restart your server, and you should now be able to use the CM-CIC payment
49
+ gateway in test mode.
50
+
51
+ When you're ready to switch to production, set the following environment
52
+ variable :
53
+
54
+ - `ATOS_PRODUCTION_MODE=true`
55
+
56
+ Just like the other settings, you can change the way it's configured in the
57
+ stall initializer file.
58
+
59
+ ### Automatic response URL
60
+
61
+ You need to provide a payment response URL to your bank which will be :
62
+
63
+ ```text
64
+ <http|http>://<YOUR_DOMAIN>/atos/payment/notify
65
+ ```
66
+
67
+ You can find the route with :
68
+
69
+ ```bash
70
+ rake routes | grep payment/notify
71
+ ```
72
+
73
+ ## Contributing
74
+
75
+ Bug reports and pull requests are welcome on GitHub at https://github.com/stall-rails/stall-atos.
76
+
77
+ ## License
78
+
79
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
80
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,7 @@
1
+ %form.payment-gateway-form{ action: request.params.target_url, method: "post" }
2
+ %input#version{ name: "Data", type: "hidden", value: request.params.data }
3
+ %input#tpe{ name: "Seal", type: "hidden", value: request.params.seal }
4
+ %input#date{ name: "InterfaceVersion", type: "hidden", value: request.params.interface_version }
5
+
6
+ %button.btn.btn-primary{ name: "submit_cic_payment_form", type: "submit" }
7
+ = t('stall.payments.gateway.pay')
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "stall/atos"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,13 @@
1
+ module Stall
2
+ module Atos
3
+ class InstallGenerator < Rails::Generators::Base
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def copy_config_template
7
+ inject_into_file 'config/initializers/stall.rb', after: "Stall.configure do |config|\n" do
8
+ File.read(File.join(self.class.source_root, 'config.rb'))
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,34 @@
1
+ # Atos payment gateway configuration
2
+ # Fill in the informations provided by your bank (Atos service provider)
3
+ #
4
+ config.payment.atos do |atos|
5
+ # Hmac key calculated with the js calculator given by CIC
6
+ atos.merchant_id = ENV['ATOS_MERCHANT_ID']
7
+ # Hmac key calculated with the js calculator given by CIC
8
+ atos.secret_key = ENV['ATOS_SECRET_KEY']
9
+
10
+ # Secret key version. Defaults to 1 when first generated, but you can update
11
+ # this value if you generated another key
12
+ #
13
+ # atos.key_version = '1'
14
+
15
+ # Test payment URL, provided by the bank
16
+ atos.test_payment_url = ''
17
+ # Production payment URL, provided by the bank
18
+ atos.payment_url = ''
19
+
20
+ # Atos / SIPS target version. Defaults to HP_2.9, but could need to be
21
+ # updated, depending on the bank provided version
22
+ #
23
+ # atos.interface_version = 'HP_2.9'
24
+
25
+ # Test or production mode, default to false, changes the payment
26
+ # gateway target URL
27
+ #
28
+ # By default, the test mode is activated in all environments but you just
29
+ # need to add `ATOS_PRODUCTION_MODE=true` in your environment variables
30
+ # and restart your server to switch to production mode
31
+ #
32
+ atos.test_mode = ENV['ATOS_PRODUCTION_MODE'] != 'true'
33
+ end
34
+
data/lib/stall/atos.rb ADDED
@@ -0,0 +1,16 @@
1
+ require 'stall'
2
+
3
+ module Stall
4
+ module Atos
5
+ extend ActiveSupport::Autoload
6
+
7
+ autoload :PaymentParams
8
+ autoload :PaymentResponse
9
+ autoload :Version
10
+
11
+ autoload :FakeGatewayPaymentNotification
12
+ end
13
+ end
14
+
15
+ require 'stall/atos/gateway'
16
+ require 'stall/atos/engine'
@@ -0,0 +1,6 @@
1
+ module Stall
2
+ module Atos
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,52 @@
1
+ module Stall
2
+ module Atos
3
+ class FakeGatewayPaymentNotification < Stall::Payments::FakeGatewayPaymentNotification
4
+ delegate :currency, to: :cart
5
+
6
+ def params
7
+ {}.tap do |params|
8
+ params.merge!(options)
9
+ end
10
+ end
11
+
12
+ private
13
+
14
+ def options
15
+ @options ||= {
16
+ "Data" => data,
17
+ "Seal" => Stall::Atos::PaymentParams.calculate_seal_for(data),
18
+ "InterfaceVersion" => "HP_2.0",
19
+ "Encode" => ""
20
+ }
21
+ end
22
+
23
+ def data
24
+ @data ||= Stall::Atos::PaymentParams.serialize(
25
+ merchantId: gateway.merchant_id,
26
+ transactionReference: gateway.transaction_id,
27
+ keyVersion: gateway.key_version,
28
+ amount: cart.total_price.cents,
29
+ currencyCode: cart.currency.iso_numeric,
30
+ transactionDateTime: Time.now.iso8601,
31
+ captureDay: '0',
32
+ captureMode: 'AUTHOR_CAPTURE',
33
+ orderChannel: 'INTERNET',
34
+ responseCode: '00',
35
+ acquirerResponseCode: '00',
36
+ authorisationId: '12345',
37
+ guaranteeIndicator: 'N',
38
+ cardCSCResultCode: '4E',
39
+ panExpiryDate: '210001',
40
+ paymentMeanBrand: 'VISA',
41
+ paymentMeanType: 'CARD',
42
+ customerIpAddress: '127.0.0.1',
43
+ maskedPan: '4100##########00',
44
+ holderAuthentRelegation: 'N',
45
+ holderAuthentStatus: '3D_ERROR',
46
+ transactionOrigin: 'INTERNET',
47
+ paymentPattern: 'ONE_SHOT'
48
+ )
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,138 @@
1
+ module Stall
2
+ module Atos
3
+ class Gateway < Stall::Payments::Gateway
4
+ register :atos
5
+
6
+ # Merchant ID
7
+ class_attribute :merchant_id
8
+ # Secret key found in the banks's download interface
9
+ class_attribute :secret_key
10
+ # Secret key version
11
+ class_attribute :key_version
12
+ self.key_version = '1'
13
+
14
+ # Test payment URL to send payment form to, provided by the bank
15
+ class_attribute :test_payment_url
16
+ # Production payment URL to send payment form to, provided by the bank
17
+ class_attribute :payment_url
18
+
19
+ # Interface version of the Atos / SIPS API
20
+ class_attribute :interface_version
21
+ self.interface_version = 'HP_2.9'
22
+
23
+ # Test or production mode, default to false, changes the payment
24
+ # gateway target URL
25
+ class_attribute :test_mode
26
+ self.test_mode = !Rails.env.production?
27
+
28
+ def self.request(cart)
29
+ Request.new(cart)
30
+ end
31
+
32
+ def self.response(request)
33
+ Response.new(request)
34
+ end
35
+
36
+ def self.fake_payment_notification_for(cart)
37
+ Stall::Atos::FakeGatewayPaymentNotification.new(cart)
38
+ end
39
+
40
+ def target_url
41
+ test_mode ? test_payment_url : payment_url
42
+ end
43
+
44
+ # The gateway interface only provides one return URL, so we use the
45
+ # payment notification state to determine wether to forward the customer
46
+ # to the next checkout step or not.
47
+ #
48
+ def synchronous_payment_notification?
49
+ true
50
+ end
51
+
52
+ private
53
+
54
+ # Override the transaction id methods, since the Atos gateway only
55
+ # authorize numbers
56
+ def next_transaction_id
57
+ if (last_transaction = Payment.order("data->>'transaction_id' DESC").select(:data).first)
58
+ if (id = last_transaction.transaction_id)
59
+ index = id[-5..-1].to_i + 1
60
+ return transaction_id_for(index)
61
+ end
62
+ end
63
+
64
+ transaction_id_for(1)
65
+ end
66
+
67
+ def transaction_id_for(index)
68
+ super.gsub(/-/, '')
69
+ end
70
+
71
+ def transaction_id_format
72
+ '%{cart_id}%{transaction_index}'
73
+ end
74
+
75
+ class Request
76
+ attr_reader :cart
77
+
78
+ delegate :currency, to: :cart, allow_nil: true
79
+
80
+ def initialize(cart)
81
+ @cart = cart
82
+ end
83
+
84
+ def payment_form_partial_path
85
+ 'stall/atos/payment_form'
86
+ end
87
+
88
+ def params
89
+ @params ||= Stall::Atos::PaymentParams.new(gateway)
90
+ end
91
+
92
+ def gateway
93
+ @gateway = Stall::Atos::Gateway.new(cart)
94
+ end
95
+ end
96
+
97
+ class Response
98
+ attr_reader :request
99
+
100
+ def initialize(request)
101
+ @request = request
102
+ end
103
+
104
+ def rendering_options
105
+ { nothing: true }
106
+ end
107
+
108
+ def success?
109
+ response.success?
110
+ end
111
+
112
+ def notify
113
+ cart.payment.pay! if success?
114
+ end
115
+
116
+ def valid?
117
+ response.valid?
118
+ end
119
+
120
+ def cart
121
+ @cart ||= Cart.find_by_payment_transaction_id(response.transaction_id)
122
+ end
123
+
124
+ def gateway
125
+ @gateway = Stall::Atos::Gateway
126
+ end
127
+
128
+ private
129
+
130
+ def response
131
+ @response ||= Stall::Atos::PaymentResponse.new(
132
+ gateway, Rack::Utils.parse_nested_query(request.raw_post)
133
+ )
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,52 @@
1
+ require 'digest'
2
+
3
+ module Stall
4
+ module Atos
5
+ class PaymentParams
6
+ attr_reader :gateway
7
+
8
+ delegate :cart, :target_url, :interface_version, to: :gateway
9
+
10
+ def initialize(gateway)
11
+ @gateway = gateway
12
+ end
13
+
14
+ def data
15
+ @data ||= self.class.serialize(
16
+ amount: cart.total_price.cents,
17
+ currencyCode: cart.currency.iso_numeric,
18
+ merchantId: gateway.merchant_id,
19
+ transactionReference: gateway.transaction_id(refresh: true),
20
+ keyVersion: gateway.key_version,
21
+ automaticResponseUrl: gateway.payment_urls.payment_notification_url,
22
+ normalReturnUrl: gateway.payment_urls.payment_success_return_url
23
+ )
24
+ end
25
+
26
+ def seal
27
+ @seal ||= self.class.calculate_seal_for(data)
28
+ end
29
+
30
+ private
31
+
32
+ # Transforms the provided hash to the following Atos accepted format :
33
+ #
34
+ # key1=value1|key2=value2|...|keyN=valueN
35
+ #
36
+ def self.serialize(hash)
37
+ hash.map { |item| item.map(&:to_s).join('=') }.join('|')
38
+ end
39
+
40
+ def self.unserialize(string)
41
+ string.split('|').each_with_object({}.with_indifferent_access) do |str, hash|
42
+ key, value = str.split('=')
43
+ hash[key] = value
44
+ end
45
+ end
46
+
47
+ def self.calculate_seal_for(data)
48
+ Digest::SHA256.hexdigest([data, Stall::Atos::Gateway.secret_key].join)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,88 @@
1
+ # This object handles the internal processing of Atos payment gateway response,
2
+ # handling params parsing, request origin verification, success tracking and
3
+ # other data extracting tasks
4
+ #
5
+ module Stall
6
+ module Atos
7
+ class PaymentResponse
8
+ attr_reader :gateway, :params
9
+
10
+ def initialize(gateway, params)
11
+ @gateway = gateway
12
+ @params = params
13
+ end
14
+
15
+ def transaction_id
16
+ data['transactionReference']
17
+ end
18
+
19
+ def success?
20
+ data['responseCode'] == '00'
21
+ end
22
+
23
+ # Ensure the response comes from the Gateway by casting the seal from the
24
+ # provided key-value string data and the secret key
25
+ #
26
+ def valid?
27
+ params['Seal'] == Stall::Atos::PaymentParams.calculate_seal_for(params['Data'])
28
+ end
29
+
30
+ def data
31
+ @data ||= Stall::Atos::PaymentParams.unserialize(params['Data'])
32
+ end
33
+
34
+ private
35
+
36
+ # Response code that can be sent from the ATOS gateway. They're not used
37
+ # for now and here just for reference, but could be used some day to
38
+ # implement a way to bubble payment processing errors to the end user.
39
+ #
40
+ def response_code_messages
41
+ @response_code_messages ||= {
42
+ '00' => %(Transaction approuvée ou traitée avec succès),
43
+ '02' => %(Contactez l'émetteur du moyen de paiement),
44
+ '03' => %(Accepteur invalide),
45
+ '04' => %(Conservez le support du moyen de paiement),
46
+ '05' => %(Ne pas honorer),
47
+ '07' => %(Conservez le support du moyen de paiement, conditions spéciales),
48
+ '08' => %(Approuvez après l'identification),
49
+ '12' => %(Transaction invalide),
50
+ '13' => %(Montant invalide),
51
+ '14' => %(Coordonnées du moyen de paiement invalides),
52
+ '15' => %(Émetteur du moyen de paiement inconnu),
53
+ '17' => %(Paiement interrompu par l'acheteur),
54
+ '24' => %(Opération impossible),
55
+ '25' => %(Transaction inconnue),
56
+ '30' => %(Érreur de format),
57
+ '31' => %(Id de l'organisation d'acquisition inconnu),
58
+ '33' => %(Moyen de paiement expiré),
59
+ '34' => %(Suspicion de fraude),
60
+ '40' => %(Fonction non supportée),
61
+ '41' => %(Moyen de paiement perdu),
62
+ '43' => %(Moyen de paiement volé),
63
+ '51' => %(Provision insuffisante ou crédit dépassé),
64
+ '54' => %(Moyen de paiement expiré),
65
+ '56' => %(Moyen de paiement manquant dans le fichier),
66
+ '57' => %(Transaction non autorisée pour ce porteur),
67
+ '58' => %(Transaction interdite au terminal),
68
+ '59' => %(Suspicion de fraude),
69
+ '60' => %(L'accepteur du moyen de paiement doit contacter l'acquéreur),
70
+ '61' => %(Éxcède le maximum autorisé),
71
+ '62' => %(Transaction en attente de confirmation de paiement),
72
+ '63' => %(Règles de sécurité non respectées),
73
+ '65' => %(Nombre de transactions du jour dépassé),
74
+ '68' => %(Réponse non parvenue ou reçue trop tard),
75
+ '75' => %(Nombre de tentatives de saisie des coordonnées du moyen de paiement dépassé 87 Terminal inconnu),
76
+ '90' => %(Arrêt momentané du système),
77
+ '91' => %(Émetteur du moyen de paiement inaccessible),
78
+ '92' => %(La transaction ne contient pas les informations suffisantes pour être redirigées vers l'organisme d'autorisation),
79
+ '94' => %(Transaction dupliquée),
80
+ '96' => %(Mauvais fonctionnement du système),
81
+ '97' => %(Requête expirée: transaction refusée),
82
+ '98' => %(Serveur inaccessible),
83
+ '99' => %(Incident technique)
84
+ }
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,5 @@
1
+ module Stall
2
+ module Atos
3
+ VERSION = "0.1.1"
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'stall/atos/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'stall-atos'
8
+ spec.version = Stall::Atos::VERSION
9
+ spec.authors = ['vala']
10
+ spec.email = ['vala@glyph.fr']
11
+
12
+ spec.summary = %q{Stall e-commerce CM-CIC payment gateway integration}
13
+ spec.description = %q{Allows easy CM-CIC gateway integration in a Stall e-commerce app}
14
+ spec.homepage = 'https://github.com/rails-stall/stall-atos'
15
+ spec.license = 'MIT'
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
18
+ spec.bindir = 'exe'
19
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
+ spec.require_paths = ['lib']
21
+
22
+ spec.add_dependency 'stall', '~> 0.1'
23
+
24
+ spec.add_development_dependency 'bundler', '~> 1.11'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
26
+ spec.add_development_dependency 'rspec', '~> 3.0'
27
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stall-atos
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - vala
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-11-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: stall
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.1'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.11'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.11'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.0'
69
+ description: Allows easy CM-CIC gateway integration in a Stall e-commerce app
70
+ email:
71
+ - vala@glyph.fr
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".gitignore"
77
+ - ".rspec"
78
+ - ".travis.yml"
79
+ - Gemfile
80
+ - LICENSE.txt
81
+ - README.md
82
+ - Rakefile
83
+ - app/views/stall/atos/_payment_form.html.haml
84
+ - bin/console
85
+ - bin/setup
86
+ - lib/generators/stall/atos/install/install_generator.rb
87
+ - lib/generators/stall/atos/install/templates/config.rb
88
+ - lib/stall/atos.rb
89
+ - lib/stall/atos/engine.rb
90
+ - lib/stall/atos/fake_gateway_payment_notification.rb
91
+ - lib/stall/atos/gateway.rb
92
+ - lib/stall/atos/payment_params.rb
93
+ - lib/stall/atos/payment_response.rb
94
+ - lib/stall/atos/version.rb
95
+ - stall-atos.gemspec
96
+ homepage: https://github.com/rails-stall/stall-atos
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.5.1
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Stall e-commerce CM-CIC payment gateway integration
120
+ test_files: []