ogone 0.1.0 → 0.2.0

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
- SHA1:
3
- metadata.gz: bec0a5e938c818872281ccd8fb3b33005b67234e
4
- data.tar.gz: 7a28120c828924c4656abf5b562047720c5a76a3
2
+ SHA256:
3
+ metadata.gz: 85185bca3d62a4d0a260d9c09ee46faed5ff3d1ca5e87d5ea20eeba08f71e5b7
4
+ data.tar.gz: f752b6492f9c12a5647379ccad4e2d67a98566e67f0ce21e902ee6deb64daf43
5
5
  SHA512:
6
- metadata.gz: 6b26d16f4c5741fb7eb0a7037b57ebcbd958d52e65a125d8d81d3fbb1ef559bdb941673e6ff98dbf3d6670a3dd4d2c4538fa97e08e8200bd9f86d1f1f10ebfd1
7
- data.tar.gz: a55ebdc4b42f54fb82ee78b44cf95775a74123b8e7cc56f639188cb67ea6aa963361d1bf1cc2b1860f1ef51f5762aeca015681acec13579d9e04143c691d4f54
6
+ metadata.gz: 4c46e65d211f33026882c61807ce45bd69950139778097d7e82f7ecc3465bd10c55633b9d14866e7f19f7327f6f12395ae0a567affcd86ad57d07cad7b307e6d
7
+ data.tar.gz: e6a008fa16cae177fc94b12b6a41823601a2dda9114bbe9ecbec7056963b9bab610bf62c8c3dd089150e80fc6ddfc70915c41d4696efdea9419663b57d28d89f
@@ -0,0 +1,12 @@
1
+ Metrics/LineLength:
2
+ Max: 120
3
+ Metrics/BlockLength:
4
+ CountComments: false
5
+ Max: 25
6
+ Exclude:
7
+ - 'Rakefile'
8
+ - 'spec/**/*.rb'
9
+ Documentation:
10
+ Enabled: false
11
+ Style/Lambda:
12
+ Enabled: false
data/README.md CHANGED
@@ -5,6 +5,8 @@ your users to the ogone ecommerce form where they can pay. This gem is flexible
5
5
  as it does not rely on a hard-coded configuration to be used. Therefore you can
6
6
  dynamically handle several PSPIDs.
7
7
 
8
+ You can also use Flexcheckout combined with direct order (see Flexcheckout and direct order).
9
+
8
10
  ## Usage
9
11
 
10
12
  In your controller,
@@ -84,6 +86,48 @@ class PaymentController
84
86
  end
85
87
  ```
86
88
 
89
+ ## Flexcheckout and direct order
90
+
91
+ ```ruby
92
+ @ogone = Ogone::Flexcheckout.new opts # same options than Ogone::Ecommerce
93
+
94
+ @ogone.add_parameters(
95
+ 'CARD.PAYMENTMETHOD' => 'CreditCard',
96
+ 'PARAMETERS.ACCEPTURL' => 'http://my_app/ogone_flexcheckout_success',
97
+ 'PARAMETERS.EXCEPTIONURL' => 'http://my_app/ogone_flexcheckout_failure',
98
+ 'LANGUAGE' => 'en_US',
99
+ )
100
+
101
+ @ogone.form_url # this is the URL with the Flexcheckout form, you shoudl redirect_to it
102
+ ```
103
+
104
+ Once you fill the form, Ogone will redirect to the `ACCEPTURL` or `EXCEPTIONURL`. If you go to the `ACCEPTURL`,
105
+ you can proceed with the order :
106
+
107
+ ```ruby
108
+ # first ensure sha_out matches
109
+ @ogone = Ogone::Flexcheckout.new opts # same options than Ogone::Ecommerce
110
+ @ogone.check_shasign_out!(params)
111
+
112
+ # ok sha_out matches proceed to the order
113
+ @ogone = Ogone::OrderDirect.new opts # same options than Ogone::Ecommerce
114
+
115
+ @ogone.add_parameters(
116
+ 'ORDERID' => params['Alias.OrderId'],
117
+ 'AMOUNT' => 10 * 100,
118
+ 'CURRENCY' => 'EUR',
119
+ 'ALIAS' => params['Alias.AliasId'], # comes from the HTTP params set in the flexcheckout redirect
120
+ 'USERID' => 'my_api_user', # you need to have an API user https://payment-services.ingenico.com/int/en/ogone/support/guides/integration%20guides/directlink
121
+ 'PSWD' => 'super_secret@',
122
+ 'OPERATION' => 'RES'
123
+ # extra parameters may be set for 3D Secure : https://payment-services.ingenico.com/int/en/ogone/support/guides/integration%20guides/directlink-3-d/3-d-transaction-flow-via-directlink#comments
124
+ )
125
+
126
+ result = @ogone.perform_order
127
+
128
+ # handle result
129
+ ```
130
+
87
131
  ## Contributing
88
132
 
89
133
  1. Fork it
data/Rakefile CHANGED
@@ -1 +1 @@
1
- require "bundler/gem_tasks"
1
+ require 'bundler/gem_tasks'
@@ -1,3 +1,5 @@
1
- require "ogone/version"
2
- require "ogone/status"
3
- require "ogone/ecommerce"
1
+ require 'ogone/version'
2
+ require 'ogone/status'
3
+ require 'ogone/ecommerce'
4
+ require 'ogone/flexcheckout'
5
+ require 'ogone/order_direct'
@@ -0,0 +1,98 @@
1
+ require 'digest'
2
+
3
+ module Ogone
4
+ class Base
5
+ VALID_ENVIRONMENTS = %w[test prod].freeze unless const_defined? :VALID_ENVIRONMENTS
6
+ SIGNING_ALGORITHMS = %w[SHA1 SHA256 SHA512].freeze unless const_defined? :SIGNING_ALGORITHMS
7
+
8
+ class ConfigurationError < StandardError; end
9
+ class MandatoryParameterMissing < StandardError; end
10
+ class OutboundSignatureMismatch < StandardError; end
11
+
12
+ attr_accessor :sha_in, :sha_out
13
+
14
+ def initialize(options = {})
15
+ @parameters = {}
16
+ %i[sha_algo environment pspid sha_in sha_out].each do |config|
17
+ send :"#{config}=", options[config] unless options[config].nil?
18
+ end
19
+ end
20
+
21
+ def sha_algo=(sha_algo)
22
+ raise ArgumentError, "Unsupported signature algorithm: #{sha_algo}" unless SIGNING_ALGORITHMS.include?(sha_algo)
23
+ @sha_algo = sha_algo
24
+ end
25
+
26
+ def environment=(environment)
27
+ unless VALID_ENVIRONMENTS.include? environment.to_s
28
+ raise ArgumentError, "Unsupported Ogone environment: #{environment}"
29
+ end
30
+ @environment = environment
31
+ end
32
+
33
+ def pspid=(pspid)
34
+ raise ArgumentError, 'PSPID cannot be empty' if pspid.nil? || pspid == ''
35
+ @pspid = pspid
36
+ end
37
+
38
+ def add_parameters(parameters)
39
+ @parameters.merge! parameters
40
+ end
41
+
42
+ def fields_for_payment(parameters = {}, shasign_key = 'SHASIGN')
43
+ add_parameters(parameters || {})
44
+ check_mandatory_parameters!
45
+
46
+ upcase_keys(@parameters).merge(shasign_key.to_sym => sha_in_sign)
47
+ end
48
+
49
+ def check_shasign_out!(params)
50
+ params = upcase_keys(params)
51
+ raise OutboundSignatureMismatch if sha_out_sign(params) != params[:SHASIGN]
52
+ end
53
+
54
+ def upcase_keys(hash)
55
+ hash.each_with_object({}) { |(k, v), h| h[k.upcase.to_sym] = v; }
56
+ end
57
+
58
+ protected
59
+
60
+ def ogone_host
61
+ @environment == 'test' ? 'ogone.test.v-psp.com' : 'secure.ogone.com'
62
+ end
63
+
64
+ private
65
+
66
+ def sha_in_sign
67
+ to_hash = sorted_upcased_parameters.each_with_object([]) do |(k, v), a|
68
+ a << "#{k}=#{v}#{@sha_in}" unless v.nil? || v == ''
69
+ end.join
70
+ sign to_hash
71
+ end
72
+
73
+ def sha_out_sign(params)
74
+ to_hash = self.class.const_get('OUTBOUND_SIGNATURE_PARAMETERS').each_with_object([]) do |p, a|
75
+ a << "#{p}=#{params[p]}#{@sha_out}" unless params[p].nil? || params[p] == ''
76
+ end.join
77
+ sign to_hash
78
+ end
79
+
80
+ def sign(to_hash)
81
+ unless SIGNING_ALGORITHMS.include?(@sha_algo)
82
+ raise ArgumentError, "Unsupported signature algorithm: '#{@sha_algo}'"
83
+ end
84
+ Digest.const_get(@sha_algo).hexdigest(to_hash).upcase
85
+ end
86
+
87
+ def sorted_upcased_parameters
88
+ upcase_keys(@parameters).sort
89
+ end
90
+
91
+ def check_mandatory_parameters!
92
+ keys = @parameters.keys.map(&:to_sym)
93
+ self.class.const_get('MANDATORY_PARAMETERS').each do |parameter|
94
+ raise MandatoryParameterMissing, parameter unless keys.include? parameter.to_sym
95
+ end
96
+ end
97
+ end
98
+ end
@@ -1,120 +1,75 @@
1
- module Ogone
2
- class Ecommerce
3
- VALID_ENVIRONMENTS = %w(test prod) unless const_defined? :VALID_ENVIRONMENTS
4
- SIGNING_ALGORITHMS = %w(SHA1 SHA256 SHA512) unless const_defined? :SIGNING_ALGORITHMS
5
-
6
- class ConfigurationError < StandardError; end
7
-
8
- MANDATORY_PARAMETERS = %w(PSPID ORDERID AMOUNT CURRENCY LANGUAGE) unless const_defined? :MANDATORY_PARAMETERS
9
- class MandatoryParameterMissing < StandardError; end
10
-
11
- OUTBOUND_SIGNATURE_PARAMETERS = %w(AAVADDRESS AAVCHECK AAVZIP ACCEPTANCE ALIAS AMOUNT BIN \
12
- BRAND CARDNO CCCTY CN COMPLUS CREATION_STATUS CURRENCY \
13
- CVCCHECK DCC_COMMPERCENTAGE DCC_CONVAMOUNT DCC_CONVCCY \
14
- DCC_EXCHRATE DCC_EXCHRATESOURCE DCC_EXCHRATETS DCC_INDICATOR \
15
- DCC_MARGINPERCENTAGE DCC_VALIDHOURS DIGESTCARDNO ECI ED \
16
- ENCCARDNO FXAMOUNT FXCURRENCY IP IPCTY NBREMAILUSAGE NBRIPUSAGE\
17
- NBRIPUSAGE_ALLTX NBRUSAGE NCERROR ORDERID PAYID PM SCO_CATEGORY \
18
- SCORING STATUS SUBBRAND SUBSCRIPTION_ID TRXDATE VC).collect &:to_sym unless const_defined? :OUTBOUND_SIGNATURE_PARAMETERS
19
- class OutboundSignatureMismatch < StandardError; end
20
-
21
- attr_accessor :sha_in, :sha_out
1
+ require 'ogone/base'
22
2
 
23
- def initialize(options = {})
24
- @parameters = Hash.new
25
- [:sha_algo, :environment, :pspid, :sha_in, :sha_out].each do |config|
26
- self.send :"#{config}=", options[config] unless options[config].nil?
27
- end
28
- end
29
-
30
- def sha_algo=(sha_algo)
31
- unless SIGNING_ALGORITHMS.include?(sha_algo)
32
- raise ArgumentError.new("Unsupported signature algorithm: #{sha_algo}")
33
- end
34
- @sha_algo = sha_algo
35
- end
36
-
37
- def environment=(environment)
38
- unless VALID_ENVIRONMENTS.include? environment.to_s
39
- raise ArgumentError.new("Unsupported Ogone environment: #{environment}")
40
- end
41
- @environment = environment
42
- end
3
+ module Ogone
4
+ class Ecommerce < Base
5
+ MANDATORY_PARAMETERS = %w[PSPID ORDERID AMOUNT CURRENCY LANGUAGE].freeze
6
+
7
+ OUTBOUND_SIGNATURE_PARAMETERS = %i[
8
+ AAVADDRESS
9
+ AAVCHECK
10
+ AAVZIP
11
+ ACCEPTANCE
12
+ ALIAS
13
+ AMOUNT
14
+ BIN
15
+ BRAND
16
+ CARDNO
17
+ CCCTY
18
+ CN
19
+ COMPLUS
20
+ CREATION_STATUS
21
+ CURRENCY
22
+ CVCCHECK
23
+ DCC_COMMPERCENTAGE
24
+ DCC_CONVAMOUNT
25
+ DCC_CONVCCY
26
+ DCC_EXCHRATE
27
+ DCC_EXCHRATESOURCE
28
+ DCC_EXCHRATETS
29
+ DCC_INDICATOR
30
+ DCC_MARGINPERCENTAGE
31
+ DCC_VALIDHOURS
32
+ DIGESTCARDNO
33
+ ECI
34
+ ED
35
+ ENCCARDNO
36
+ FXAMOUNT
37
+ FXCURRENCY
38
+ IP
39
+ IPCTY
40
+ NBREMAILUSAGE
41
+ NBRIPUSAGE
42
+ NBRIPUSAGE_ALLTX
43
+ NBRUSAGE
44
+ NCERROR
45
+ ORDERID
46
+ PAYID
47
+ PM
48
+ SCO_CATEGORY
49
+ SCORING
50
+ STATUS
51
+ SUBBRAND
52
+ SUBSCRIPTION_ID
53
+ TRXDATE
54
+ VC
55
+ ].freeze
43
56
 
44
57
  def pspid=(pspid)
45
- raise ArgumentError.new("PSPID cannot be empty") if pspid.nil? || pspid == ""
58
+ super(pspid)
46
59
  @parameters[:PSPID] = pspid
47
60
  end
48
61
 
49
62
  def form_action
50
63
  unless VALID_ENVIRONMENTS.include? @environment.to_s
51
- raise ConfigurationError.new("Unsupported Ogone environment: '#{@environment}'.")
64
+ raise ConfigurationError, "Unsupported Ogone environment: '#{@environment}'."
52
65
  end
53
66
  "https://secure.ogone.com/ncol/#{@environment}/orderstandard_utf8.asp"
54
67
  end
55
68
 
56
69
  def add_single_return_url(return_url)
57
- [:ACCEPTURL, :DECLINEURL, :EXCEPTIONURL, :CANCELURL].each do |field|
70
+ %i[ACCEPTURL DECLINEURL EXCEPTIONURL CANCELURL].each do |field|
58
71
  @parameters[field] = return_url
59
72
  end
60
73
  end
61
-
62
- def add_parameters(parameters)
63
- @parameters.merge! parameters
64
- end
65
-
66
- def fields_for_payment(parameters = {})
67
- add_parameters(parameters || {})
68
- check_mandatory_parameters!
69
-
70
- upcase_keys(@parameters).merge :SHASIGN => sha_in_sign
71
- end
72
-
73
- def check_shasign_out!(params)
74
- params = upcase_keys(params)
75
- raise OutboundSignatureMismatch.new if sha_out_sign(params) != params[:SHASIGN]
76
- end
77
-
78
- def upcase_keys(hash)
79
- hash.inject({}) { |h, (k, v)| h[k.upcase.to_sym] = v; h }
80
- end
81
-
82
- private
83
-
84
- def sha_in_sign
85
- to_hash = sorted_upcased_parameters.inject([]) {
86
- |a, (k, v)| a << "#{k}=#{v}#{@sha_in}" unless v.nil? || v == ""
87
- a
88
- }.join
89
- sign to_hash
90
- end
91
-
92
- def sha_out_sign(params)
93
- to_hash = OUTBOUND_SIGNATURE_PARAMETERS.inject([]) {
94
- |a, p| a << "#{p}=#{params[p]}#{@sha_out}" unless params[p].nil? || params[p] == ""
95
- a
96
- }.join
97
- sign to_hash
98
- end
99
-
100
- def sign(to_hash)
101
- unless SIGNING_ALGORITHMS.include?(@sha_algo)
102
- raise ArgumentError.new("Unsupported signature algorithm: '#{@sha_algo}'")
103
- end
104
- Digest.const_get(@sha_algo).hexdigest(to_hash).upcase
105
- end
106
-
107
- def sorted_upcased_parameters
108
- upcase_keys(@parameters).sort
109
- end
110
-
111
- def check_mandatory_parameters!
112
- MANDATORY_PARAMETERS.each do |parameter|
113
- unless @parameters.include? parameter.to_sym
114
- raise MandatoryParameterMissing.new parameter
115
- end
116
- end
117
- end
118
-
119
74
  end
120
- end
75
+ end
@@ -0,0 +1,45 @@
1
+ require 'ogone/base'
2
+
3
+ module Ogone
4
+ class Flexcheckout < Base
5
+ MANDATORY_PARAMETERS = %w[
6
+ ACCOUNT.PSPID
7
+ PARAMETERS.ACCEPTURL
8
+ PARAMETERS.EXCEPTIONURL
9
+ CARD.PAYMENTMETHOD
10
+ LANGUAGE
11
+ ].freeze
12
+
13
+ OUTBOUND_SIGNATURE_PARAMETERS = %i[
14
+ ALIAS.ALIASID
15
+ ALIAS.NCERROR
16
+ ALIAS.NCERRORCARDNO
17
+ ALIAS.NCERRORCN
18
+ ALIAS.NCERRORCVC
19
+ ALIAS.NCERRORED
20
+ ALIAS.ORDERID
21
+ ALIAS.STATUS
22
+ ALIAS.STOREPERMANENTLY
23
+ CARD.BIC
24
+ CARD.BIN
25
+ CARD.BRAND
26
+ CARD.CARDHOLDERNAME
27
+ CARD.CARDNUMBER
28
+ CARD.CVC
29
+ CARD.EXPIRYDATE
30
+ ].freeze
31
+
32
+ def pspid=(pspid)
33
+ super(pspid)
34
+ @parameters[:'ACCOUNT.PSPID'] = pspid
35
+ end
36
+
37
+ def fields_for_payment(parameters = {})
38
+ super(parameters, 'SHASIGNATURE.SHASIGN')
39
+ end
40
+
41
+ def form_url
42
+ "https://#{ogone_host}/Tokenization/HostedPage?#{URI.encode_www_form(fields_for_payment)}"
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,27 @@
1
+ require 'ogone/base'
2
+
3
+ module Ogone
4
+ class OrderDirect < Base
5
+ MANDATORY_PARAMETERS = %w[
6
+ PSPID
7
+ ORDERID
8
+ AMOUNT
9
+ CURRENCY
10
+ ALIAS
11
+ USERID
12
+ PSWD
13
+ OPERATION
14
+ ].freeze
15
+
16
+ def pspid=(pspid)
17
+ super(pspid)
18
+ @parameters[:PSPID] = pspid
19
+ end
20
+
21
+ def perform_order
22
+ url = "https://#{ogone_host}/ncol/#{@environment}/orderdirect.asp"
23
+ res = HTTParty.get("#{url}?#{URI.encode_www_form(fields_for_payment)}")
24
+ res.body
25
+ end
26
+ end
27
+ end
@@ -1,45 +1,45 @@
1
1
  module Ogone
2
+ unless const_defined? :STATUS
3
+ STATUS = {
4
+ 0 => 'Incomplete or invalid',
5
+ 1 => 'Cancelled by client',
6
+ 2 => 'Authorization refused',
7
+ 4 => 'Order stored',
8
+ 41 => 'Waiting client payment',
9
+ 5 => 'Authorized',
10
+ 51 => 'Authorization waiting',
11
+ 52 => 'Authorization not known',
12
+ 55 => 'Stand-by',
13
+ 59 => 'Authoriz. to get manually',
14
+ 6 => 'Authorized and cancelled',
15
+ 61 => 'Author. deletion waiting',
16
+ 62 => 'Author. deletion uncertain',
17
+ 63 => 'Author. deletion refused',
18
+ 64 => 'Authorized and cancelled',
19
+ 7 => 'Payment deleted',
20
+ 71 => 'Payment deletion pending',
21
+ 72 => 'Payment deletion uncertain',
22
+ 73 => 'Payment deletion refused',
23
+ 74 => 'Payment deleted',
24
+ 75 => 'Deletion processed by merchant',
25
+ 8 => 'Refund',
26
+ 81 => 'Refund pending',
27
+ 82 => 'Refund uncertain',
28
+ 83 => 'Refund refused',
29
+ 84 => 'Payment declined by the acquirer',
30
+ 85 => 'Refund processed by merchant',
31
+ 9 => 'Payment requested',
32
+ 91 => 'Payment processing',
33
+ 92 => 'Payment uncertain',
34
+ 93 => 'Payment refused',
35
+ 94 => 'Refund declined by the acquirer',
36
+ 95 => 'Payment processed by merchant',
37
+ 99 => 'Being processed'
38
+ }.freeze
39
+ end
2
40
 
3
- STATUS = {
4
- 0 => 'Incomplete or invalid',
5
- 1 => 'Cancelled by client',
6
- 2 => 'Authorization refused',
7
- 4 => 'Order stored',
8
- 41 => 'Waiting client payment',
9
- 5 => 'Authorized',
10
- 51 => 'Authorization waiting',
11
- 52 => 'Authorization not known',
12
- 55 => 'Stand-by',
13
- 59 => 'Authoriz. to get manually',
14
- 6 => 'Authorized and cancelled',
15
- 61 => 'Author. deletion waiting',
16
- 62 => 'Author. deletion uncertain',
17
- 63 => 'Author. deletion refused',
18
- 64 => 'Authorized and cancelled',
19
- 7 => 'Payment deleted',
20
- 71 => 'Payment deletion pending',
21
- 72 => 'Payment deletion uncertain',
22
- 73 => 'Payment deletion refused',
23
- 74 => 'Payment deleted',
24
- 75 => 'Deletion processed by merchant',
25
- 8 => 'Refund',
26
- 81 => 'Refund pending',
27
- 82 => 'Refund uncertain',
28
- 83 => 'Refund refused',
29
- 84 => 'Payment declined by the acquirer',
30
- 85 => 'Refund processed by merchant',
31
- 9 => 'Payment requested',
32
- 91 => 'Payment processing',
33
- 92 => 'Payment uncertain',
34
- 93 => 'Payment refused',
35
- 94 => 'Refund declined by the acquirer',
36
- 95 => 'Payment processed by merchant',
37
- 99 => 'Being processed'
38
- } unless const_defined? :STATUS
39
-
40
- PAID_STATUSES = [4, 5, 9] unless const_defined? :PAID_STATUSES
41
- PENDING_STATUSES = [41, 51, 52, 91, 92, 99] unless const_defined? :PENDING_STATUSES
42
- CANCELLED_STATUSES = [1] unless const_defined? :CANCELLED_STATUSES
43
- REFUNDED_STATUSES = [8] unless const_defined? :REFUNDED_STATUSES
44
-
45
- end
41
+ PAID_STATUSES = [4, 5, 9].freeze unless const_defined? :PAID_STATUSES
42
+ PENDING_STATUSES = [41, 51, 52, 91, 92, 99].freeze unless const_defined? :PENDING_STATUSES
43
+ CANCELLED_STATUSES = [1].freeze unless const_defined? :CANCELLED_STATUSES
44
+ REFUNDED_STATUSES = [8].freeze unless const_defined? :REFUNDED_STATUSES
45
+ end
@@ -1,3 +1,3 @@
1
1
  module Ogone
2
- VERSION = "0.1.0"
2
+ VERSION = '0.2.0'.freeze
3
3
  end
@@ -1,28 +1,29 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
1
+ lib = File.expand_path('lib', __dir__)
3
2
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
3
  require 'ogone/version'
5
4
 
6
5
  Gem::Specification.new do |spec|
7
- spec.name = "ogone"
6
+ spec.name = 'ogone'
8
7
  spec.version = Ogone::VERSION
9
- spec.authors = ["Sebastien Saunier"]
10
- spec.email = ["seb@saunier.me"]
11
- spec.description = %q{Flexible Ogone ecommerce wrapper
8
+ spec.authors = ['Sebastien Saunier']
9
+ spec.email = ['seb@saunier.me']
10
+ spec.description = 'Flexible Ogone ecommerce wrapper
12
11
 
13
12
  Deal simply with multiple ogone ecommerce account within your application.
14
13
  No hard coded configuration read from a *.yml file.
15
- }
16
- spec.summary = %q{Flexible Ogone ecommerce wrapper}
17
- spec.homepage = "https://github.com/applidget/ogone"
18
- spec.license = "MIT"
14
+ '
15
+ spec.summary = 'Flexible Ogone ecommerce wrapper'
16
+ spec.homepage = 'https://github.com/applidget/ogone'
17
+ spec.license = 'MIT'
19
18
 
20
- spec.files = `git ls-files`.split($/)
19
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
21
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
22
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
24
23
 
25
- spec.add_development_dependency "bundler", "~> 1.3"
26
- spec.add_development_dependency "rake"
27
- spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency 'bundler', '~> 1.3'
25
+ spec.add_development_dependency 'rake'
26
+ spec.add_development_dependency 'rspec'
27
+ spec.add_development_dependency 'rubocop'
28
+ spec.add_dependency 'httparty'
28
29
  end
@@ -1,90 +1,86 @@
1
- require "ogone/ecommerce"
1
+ require 'ogone/ecommerce'
2
2
 
3
3
  module Ogone
4
4
  describe Ecommerce do
5
-
6
5
  before(:each) do
7
6
  @ogone = Ogone::Ecommerce.new
8
7
  end
9
8
 
10
- it "should raise an error if incorrect sha algorithm given" do
9
+ it 'should raise an error if incorrect sha algorithm given' do
11
10
  lambda { @ogone.sha_algo = 'WRONG_SHA' }.should raise_error ArgumentError
12
11
  end
13
12
 
14
- it "should raise an error if incorrect ogone environment given" do
13
+ it 'should raise an error if incorrect ogone environment given' do
15
14
  lambda { @ogone.environment = 'WRONG_ENV' }.should raise_error ArgumentError
16
15
  end
17
16
 
18
- it "should raise an error if an empty PSPID is specified" do
17
+ it 'should raise an error if an empty PSPID is specified' do
19
18
  lambda { @ogone.pspid = '' }.should raise_error ArgumentError
20
19
  end
21
20
 
22
- it "should render the test Ogone url" do
23
- @ogone.environment = "test"
24
- @ogone.form_action.should eq "https://secure.ogone.com/ncol/test/orderstandard_utf8.asp"
21
+ it 'should render the test Ogone url' do
22
+ @ogone.environment = 'test'
23
+ @ogone.form_action.should eq 'https://secure.ogone.com/ncol/test/orderstandard_utf8.asp'
25
24
  end
26
25
 
27
- it "should render the production Ogone url" do
28
- @ogone.environment = "prod"
29
- @ogone.form_action.should eq "https://secure.ogone.com/ncol/prod/orderstandard_utf8.asp"
26
+ it 'should render the production Ogone url' do
27
+ @ogone.environment = 'prod'
28
+ @ogone.form_action.should eq 'https://secure.ogone.com/ncol/prod/orderstandard_utf8.asp'
30
29
  end
31
30
 
32
- it "should have the PSPID stored in the parameters" do
33
- @ogone.pspid = "pspid"
34
- parameters[:PSPID].should eq "pspid"
31
+ it 'should have the PSPID stored in the parameters' do
32
+ @ogone.pspid = 'pspid'
33
+ parameters[:PSPID].should eq 'pspid'
35
34
  end
36
35
 
37
- describe "#check_shasign_out!" do
38
-
36
+ describe '#check_shasign_out!' do
39
37
  before(:each) do
40
- @ogone = Ogone::Ecommerce.new :sha_out => "sha_out", :sha_algo => "SHA1"
38
+ @ogone = Ogone::Ecommerce.new sha_out: 'sha_out', sha_algo: 'SHA1'
41
39
  end
42
40
 
43
- it "should check an inbound signature" do
41
+ it 'should check an inbound signature' do
44
42
  params = ogone_return_parameters
45
43
  lambda { @ogone.check_shasign_out! params }.should_not raise_error Ogone::Ecommerce::OutboundSignatureMismatch
46
44
  end
47
45
 
48
- it "should throw an error if the outbound shasign does not match" do
46
+ it 'should throw an error if the outbound shasign does not match' do
49
47
  params = {
50
- "amonut" => "160",
51
- "SHASIGN" => "FOO"
48
+ 'amonut' => '160',
49
+ 'SHASIGN' => 'FOO'
52
50
  }
53
51
  lambda { @ogone.check_shasign_out! params }.should raise_error Ogone::Ecommerce::OutboundSignatureMismatch
54
52
  end
55
53
  end
56
54
 
57
- describe "#fields_for_payment" do
58
-
55
+ describe '#fields_for_payment' do
59
56
  before(:each) do
60
- @ogone = Ogone::Ecommerce.new :pspid => "pspid", :sha_in => "sha_in", :sha_algo => "SHA1"
57
+ @ogone = Ogone::Ecommerce.new pspid: 'pspid', sha_in: 'sha_in', sha_algo: 'SHA1'
61
58
  end
62
59
 
63
- it "should give a hash ready to be used in `hidden_field_tag`" do
64
- fields = @ogone.fields_for_payment :AMOUNT => 100,
65
- :CURRENCY => "EUR",
66
- :ORDERID => "123",
67
- :LANGUAGE => "en_US"
60
+ it 'should give a hash ready to be used in `hidden_field_tag`' do
61
+ fields = @ogone.fields_for_payment AMOUNT: 100,
62
+ CURRENCY: 'EUR',
63
+ ORDERID: '123',
64
+ LANGUAGE: 'en_US'
68
65
 
69
- fields[:SHASIGN].should eq "AA7CA1F98159D14D0943311092F5435F239B4B36"
66
+ fields[:SHASIGN].should eq 'AA7CA1F98159D14D0943311092F5435F239B4B36'
70
67
  end
71
68
 
72
- it "should also work if parameters were given with #add_parameters" do
73
- @ogone.add_parameters :AMOUNT => 100, :CURRENCY => "EUR", :ORDERID => "123", :LANGUAGE => "en_US"
69
+ it 'should also work if parameters were given with #add_parameters' do
70
+ @ogone.add_parameters AMOUNT: 100, CURRENCY: 'EUR', ORDERID: '123', LANGUAGE: 'en_US'
74
71
 
75
72
  fields = @ogone.fields_for_payment
76
- fields[:SHASIGN].should eq "AA7CA1F98159D14D0943311092F5435F239B4B36"
73
+ fields[:SHASIGN].should eq 'AA7CA1F98159D14D0943311092F5435F239B4B36'
77
74
  end
78
-
79
75
  end
80
76
 
81
- describe "#add_single_return_url" do
82
- it "should allow lazy folks to give just one back url" do
83
- @ogone.add_single_return_url "http://iamsola.zy"
84
- parameters[:ACCEPTURL].should eq "http://iamsola.zy"
85
- parameters[:DECLINEURL].should eq "http://iamsola.zy"
86
- parameters[:EXCEPTIONURL].should eq "http://iamsola.zy"
87
- parameters[:CANCELURL].should eq "http://iamsola.zy"
77
+ describe '#add_single_return_url' do
78
+ it 'should allow lazy folks to give just one back url' do
79
+ @ogone.add_single_return_url 'http://iamsola.zy'
80
+ parameters[:ACCEPTURL].should eq 'http://iamsola.zy'
81
+ parameters[:DECLINEURL].should eq 'http://iamsola.zy'
82
+ parameters[:EXCEPTIONURL].should eq 'http://iamsola.zy'
83
+ parameters[:CANCELURL].should eq 'http://iamsola.zy'
88
84
  end
89
85
  end
90
86
 
@@ -94,25 +90,27 @@ module Ogone
94
90
  @ogone.instance_variable_get :@parameters
95
91
  end
96
92
 
93
+ # rubocop:disable Metrics/MethodLength
97
94
  def ogone_return_parameters
98
95
  {
99
- "orderID" => "r_511b52f7230b430b3f000003_19",
100
- "currency" => "EUR",
101
- "amount" => "160",
102
- "PM" => "CreditCard",
103
- "ACCEPTANCE" => "",
104
- "STATUS" => "1",
105
- "CARDNO" => "",
106
- "ED" => "",
107
- "CN" => "Sebastien Saunier",
108
- "TRXDATE" => "02/13/13",
109
- "PAYID" => "19113975",
110
- "NCERROR" => "",
111
- "BRAND" => "",
112
- "COMPLUS" => "registration_511b52f7230b430b3f000003",
113
- "IP" => "80.12.86.33",
114
- "SHASIGN" => "F3F5F963C700F56B69EA36173F5BFB3B28CA25E5",
96
+ 'orderID' => 'r_511b52f7230b430b3f000003_19',
97
+ 'currency' => 'EUR',
98
+ 'amount' => '160',
99
+ 'PM' => 'CreditCard',
100
+ 'ACCEPTANCE' => '',
101
+ 'STATUS' => '1',
102
+ 'CARDNO' => '',
103
+ 'ED' => '',
104
+ 'CN' => 'Sebastien Saunier',
105
+ 'TRXDATE' => '02/13/13',
106
+ 'PAYID' => '19113975',
107
+ 'NCERROR' => '',
108
+ 'BRAND' => '',
109
+ 'COMPLUS' => 'registration_511b52f7230b430b3f000003',
110
+ 'IP' => '80.12.86.33',
111
+ 'SHASIGN' => 'F3F5F963C700F56B69EA36173F5BFB3B28CA25E5'
115
112
  }
116
113
  end
114
+ # rubocop:enable Metrics/MethodLength
117
115
  end
118
- end
116
+ end
@@ -4,4 +4,4 @@ require 'bundler/setup'
4
4
  require 'ogone'
5
5
 
6
6
  # RSpec.configure do |config|
7
- # end
7
+ # end
metadata CHANGED
@@ -1,58 +1,86 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ogone
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sebastien Saunier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-09-11 00:00:00.000000000 Z
11
+ date: 2018-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ~>
17
+ - - "~>"
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ~>
24
+ - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ! '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ! '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ! '>='
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
47
  version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ! '>='
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
- description: ! "Flexible Ogone ecommerce wrapper\n\nDeal simply with multiple ogone
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: httparty
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: "Flexible Ogone ecommerce wrapper\n\nDeal simply with multiple ogone
56
84
  ecommerce account within your application.\nNo hard coded configuration read from
57
85
  a *.yml file.\n "
58
86
  email:
@@ -61,14 +89,18 @@ executables: []
61
89
  extensions: []
62
90
  extra_rdoc_files: []
63
91
  files:
64
- - .gitignore
65
- - .rspec
92
+ - ".gitignore"
93
+ - ".rspec"
94
+ - ".rubocop.yml"
66
95
  - Gemfile
67
96
  - LICENSE.txt
68
97
  - README.md
69
98
  - Rakefile
70
99
  - lib/ogone.rb
100
+ - lib/ogone/base.rb
71
101
  - lib/ogone/ecommerce.rb
102
+ - lib/ogone/flexcheckout.rb
103
+ - lib/ogone/order_direct.rb
72
104
  - lib/ogone/status.rb
73
105
  - lib/ogone/version.rb
74
106
  - ogone.gemspec
@@ -84,17 +116,17 @@ require_paths:
84
116
  - lib
85
117
  required_ruby_version: !ruby/object:Gem::Requirement
86
118
  requirements:
87
- - - ! '>='
119
+ - - ">="
88
120
  - !ruby/object:Gem::Version
89
121
  version: '0'
90
122
  required_rubygems_version: !ruby/object:Gem::Requirement
91
123
  requirements:
92
- - - ! '>='
124
+ - - ">="
93
125
  - !ruby/object:Gem::Version
94
126
  version: '0'
95
127
  requirements: []
96
128
  rubyforge_project:
97
- rubygems_version: 2.1.0
129
+ rubygems_version: 2.7.3
98
130
  signing_key:
99
131
  specification_version: 4
100
132
  summary: Flexible Ogone ecommerce wrapper