hps 2.2.5 → 2.4.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.
Files changed (83) hide show
  1. checksums.yaml +5 -5
  2. data/Gemfile +4 -4
  3. data/Gemfile.lock +59 -0
  4. data/LICENSE.md +264 -0
  5. data/PRIVACY.txt +65 -65
  6. data/README.md +213 -216
  7. data/Rakefile +15 -15
  8. data/examples/sinatra-verify-only/Gemfile +4 -4
  9. data/examples/sinatra-verify-only/app.rb +32 -32
  10. data/examples/sinatra-verify-only/views/index.erb +478 -478
  11. data/examples/sinatra-verify-only/views/result.erb +39 -39
  12. data/hps.gemspec +28 -28
  13. data/lib/hps/configuration.rb +17 -17
  14. data/lib/hps/entities/hps_account_verify.rb +8 -8
  15. data/lib/hps/entities/hps_address.rb +6 -6
  16. data/lib/hps/entities/hps_authorization.rb +12 -12
  17. data/lib/hps/entities/hps_batch.rb +6 -6
  18. data/lib/hps/entities/hps_cardholder.rb +6 -6
  19. data/lib/hps/entities/hps_charge.rb +8 -8
  20. data/lib/hps/entities/hps_charge_exceptions.rb +6 -6
  21. data/lib/hps/entities/hps_check.rb +18 -18
  22. data/lib/hps/entities/hps_check_holder.rb +10 -10
  23. data/lib/hps/entities/hps_check_response.rb +45 -45
  24. data/lib/hps/entities/hps_check_response_details.rb +9 -9
  25. data/lib/hps/entities/hps_credit_card.rb +34 -34
  26. data/lib/hps/entities/hps_direct_market_data.rb +5 -5
  27. data/lib/hps/entities/hps_encryption_data.rb +6 -6
  28. data/lib/hps/entities/hps_gift_card.rb +133 -0
  29. data/lib/hps/entities/hps_manage_tokens.rb +8 -8
  30. data/lib/hps/entities/hps_refund.rb +8 -8
  31. data/lib/hps/entities/hps_report_transaction_details.rb +10 -10
  32. data/lib/hps/entities/hps_report_transaction_summary.rb +6 -6
  33. data/lib/hps/entities/hps_reversal.rb +10 -10
  34. data/lib/hps/entities/hps_token_data.rb +10 -10
  35. data/lib/hps/entities/hps_track_data.rb +5 -5
  36. data/lib/hps/entities/hps_transaction.rb +161 -161
  37. data/lib/hps/entities/hps_transaction_details.rb +6 -6
  38. data/lib/hps/entities/hps_transaction_header.rb +8 -8
  39. data/lib/hps/entities/hps_transaction_type.rb +16 -16
  40. data/lib/hps/entities/hps_void.rb +8 -8
  41. data/lib/hps/infrastructure/api_connection_exception.rb +11 -11
  42. data/lib/hps/infrastructure/authentication_exception.rb +11 -11
  43. data/lib/hps/infrastructure/card_exception.rb +15 -15
  44. data/lib/hps/infrastructure/exceptions.json +547 -468
  45. data/lib/hps/infrastructure/hps_account_type.rb +11 -11
  46. data/lib/hps/infrastructure/hps_check_exception.rb +13 -13
  47. data/lib/hps/infrastructure/hps_check_type.rb +11 -11
  48. data/lib/hps/infrastructure/hps_data_entry_mode.rb +11 -11
  49. data/lib/hps/infrastructure/hps_exception.rb +25 -25
  50. data/lib/hps/infrastructure/hps_exception_mapper.rb +145 -134
  51. data/lib/hps/infrastructure/hps_gateway_response_validation.rb +20 -20
  52. data/lib/hps/infrastructure/hps_input_validation.rb +13 -13
  53. data/lib/hps/infrastructure/hps_sdk_codes.rb +48 -48
  54. data/lib/hps/infrastructure/hps_sec_code.rb +27 -27
  55. data/lib/hps/infrastructure/hps_track_data_method.rb +6 -6
  56. data/lib/hps/infrastructure/invalid_request_exception.rb +15 -15
  57. data/lib/hps/services/hps_batch_service.rb +29 -29
  58. data/lib/hps/services/hps_charge_service.rb +773 -773
  59. data/lib/hps/services/hps_check_service.rb +110 -110
  60. data/lib/hps/services/hps_gift_card_service.rb +301 -0
  61. data/lib/hps/services/hps_service.rb +141 -136
  62. data/lib/hps/version.rb +3 -3
  63. data/lib/hps.rb +63 -61
  64. data/tests/amex_tests.rb +292 -292
  65. data/tests/cert_tests.rb +80 -80
  66. data/tests/certification/card_present_spec.rb +320 -320
  67. data/tests/certification/gift_card_certification_test.rb +107 -0
  68. data/tests/certification/gift_card_certification_tests.rb +107 -0
  69. data/tests/check_tests.rb +50 -50
  70. data/tests/discover_tests.rb +386 -386
  71. data/tests/exception_mapper_tests.rb +311 -244
  72. data/tests/general_tests.rb +140 -140
  73. data/tests/giftcard_tests.rb +212 -0
  74. data/tests/hps_token_service.rb +56 -56
  75. data/tests/mastercard_tests.rb +387 -387
  76. data/tests/secret_key.rb +11 -11
  77. data/tests/test_check.rb +77 -77
  78. data/tests/test_data.rb +138 -128
  79. data/tests/test_helper.rb +179 -116
  80. data/tests/token_tests.rb +512 -512
  81. data/tests/visa_tests.rb +445 -445
  82. metadata +40 -15
  83. data/LICENSE.txt +0 -32
@@ -1,39 +1,39 @@
1
- <!--[if IE]><![endif]-->
2
- <!--[if lt IE 7 ]> <html lang="en" class="ie6"> <![endif]-->
3
- <!--[if IE 7 ]> <html lang="en" class="ie7"> <![endif]-->
4
- <!--[if IE 8 ]> <html lang="en" class="ie8"> <![endif]-->
5
- <!--[if IE 9 ]> <html lang="en" class="ie9"> <![endif]-->
6
- <!--[if (gt IE 9)|!(IE)]><!-->
7
- <html lang="en"><!--<![endif]-->
8
- <head>
9
- <meta charset="utf-8">
10
- <meta http-equiv="X-UA-Compatible" content="IE=edge">
11
- <meta name="viewport" content="width=device-width, initial-scale=1">
12
- <meta name="description" content="SecureSubmit Ruby end-to-end payment example using tokenization.">
13
- <meta name="author" content="Mark Hagan">
14
- <title>Simple Payment Form Demo</title>
15
-
16
- <link src="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.css">
17
- <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
18
- </head>
19
- <body>
20
- <div class="container">
21
- <div class="row col-xs-12">
22
- <h1>Ruby SecureSubmit Example</h1>
23
- </div>
24
-
25
- <h2>Results</h2>
26
-
27
- <table>
28
- <tr>
29
- <td>Response Code</td>
30
- <td><%= verification.response_code %>
31
- </tr>
32
- <tr>
33
- <td>Multi-use Token</td>
34
- <td><%= verification.token_data.token_value unless verification.token_data.nil? %>
35
- </tr>
36
- </table>
37
- </div>
38
- </body>
39
- </html>
1
+ <!--[if IE]><![endif]-->
2
+ <!--[if lt IE 7 ]> <html lang="en" class="ie6"> <![endif]-->
3
+ <!--[if IE 7 ]> <html lang="en" class="ie7"> <![endif]-->
4
+ <!--[if IE 8 ]> <html lang="en" class="ie8"> <![endif]-->
5
+ <!--[if IE 9 ]> <html lang="en" class="ie9"> <![endif]-->
6
+ <!--[if (gt IE 9)|!(IE)]><!-->
7
+ <html lang="en"><!--<![endif]-->
8
+ <head>
9
+ <meta charset="utf-8">
10
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
11
+ <meta name="viewport" content="width=device-width, initial-scale=1">
12
+ <meta name="description" content="SecureSubmit Ruby end-to-end payment example using tokenization.">
13
+ <meta name="author" content="Mark Hagan">
14
+ <title>Simple Payment Form Demo</title>
15
+
16
+ <link src="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.css">
17
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
18
+ </head>
19
+ <body>
20
+ <div class="container">
21
+ <div class="row col-xs-12">
22
+ <h1>Ruby SecureSubmit Example</h1>
23
+ </div>
24
+
25
+ <h2>Results</h2>
26
+
27
+ <table>
28
+ <tr>
29
+ <td>Response Code</td>
30
+ <td><%= verification.response_code %>
31
+ </tr>
32
+ <tr>
33
+ <td>Multi-use Token</td>
34
+ <td><%= verification.token_data.token_value unless verification.token_data.nil? %>
35
+ </tr>
36
+ </table>
37
+ </div>
38
+ </body>
39
+ </html>
data/hps.gemspec CHANGED
@@ -1,28 +1,28 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'hps/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "hps"
8
- spec.version = Hps::VERSION
9
- spec.authors = ["Heartland Payment Systems"]
10
- spec.email = ["IntegrationSupportTeam@e-hps.com"]
11
- spec.description = %q{Ruby SDK for processing payments via Portico Gateway}
12
- spec.summary = %q{Heartland Payment Systems - Portico Gateway SDK}
13
- spec.homepage = ""
14
- spec.license = "MIT"
15
-
16
- spec.files = `git ls-files`.split($/)
17
- spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
- spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
-
21
- spec.add_development_dependency "bundler", "~> 1.3"
22
- spec.add_development_dependency "rake"
23
- spec.add_development_dependency "rspec"
24
- spec.add_development_dependency "pry"
25
- spec.add_dependency('builder', '>= 2.1.2', '< 4.0.0')
26
- spec.add_dependency('activesupport', '>= 2.3.14', '< 5.0.0')
27
-
28
- end
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'hps/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "hps"
8
+ spec.version = Hps::VERSION
9
+ spec.authors = ["Heartland Payment Systems"]
10
+ spec.email = ["IntegrationSupportTeam@e-hps.com"]
11
+ spec.description = %q{Ruby SDK for processing payments via Portico Gateway}
12
+ spec.summary = %q{Heartland Payment Systems - Portico Gateway SDK}
13
+ spec.homepage = ""
14
+ spec.license = "GPL-2.0"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 2.5.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec"
24
+ spec.add_development_dependency "pry"
25
+ spec.add_dependency('builder', '>= 2.1.2', '< 4.0.0')
26
+ spec.add_dependency('activesupport', '>= 2.3.14', '<= 7.1.3')
27
+ spec.add_dependency('rexml', '~> 3.2', '>= 3.2.4')
28
+ end
@@ -1,17 +1,17 @@
1
- module Hps
2
- module Configuration
3
-
4
- VALID_CONFIG_KEYS = [ :service_uri, :user_name, :password, :developer_id, :version_number, :license_id, :device_id, :site_id, :site_trace, :secret_api_key, :http_options ].freeze
5
-
6
- attr_accessor *VALID_CONFIG_KEYS
7
-
8
- def configure
9
- yield self
10
- end
11
-
12
- def options
13
- Hash[ * VALID_CONFIG_KEYS.map { |key| [key, send(key)] }.flatten ]
14
- end
15
-
16
- end
17
- end
1
+ module Hps
2
+ module Configuration
3
+
4
+ VALID_CONFIG_KEYS = [ :service_uri, :user_name, :password, :developer_id, :version_number, :license_id, :device_id, :site_id, :site_trace, :secret_api_key, :http_options ].freeze
5
+
6
+ attr_accessor *VALID_CONFIG_KEYS
7
+
8
+ def configure
9
+ yield self
10
+ end
11
+
12
+ def options
13
+ Hash[ * VALID_CONFIG_KEYS.map { |key| [key, send(key)] }.flatten ]
14
+ end
15
+
16
+ end
17
+ end
@@ -1,9 +1,9 @@
1
- module Hps
2
- class HpsAccountVerify < HpsAuthorization
3
-
4
- def initialize(header)
5
- super(header)
6
- end
7
-
8
- end
1
+ module Hps
2
+ class HpsAccountVerify < HpsAuthorization
3
+
4
+ def initialize(header)
5
+ super(header)
6
+ end
7
+
8
+ end
9
9
  end
@@ -1,7 +1,7 @@
1
- module Hps
2
- class HpsAddress
3
-
4
- attr_accessor :address, :city, :state, :zip, :country
5
-
6
- end
1
+ module Hps
2
+ class HpsAddress
3
+
4
+ attr_accessor :address, :city, :state, :zip, :country
5
+
6
+ end
7
7
  end
@@ -1,13 +1,13 @@
1
- module Hps
2
- class HpsAuthorization < HpsTransaction
3
-
4
- attr_accessor :avs_result_code, :avs_result_text, :cvv_result_code,
5
- :cvv_result_text, :cpc_indicator, :authorization_code,
6
- :authorized_amount, :card_type, :token_data
7
-
8
- def initialize(header)
9
- super(header)
10
- end
11
-
12
- end
1
+ module Hps
2
+ class HpsAuthorization < HpsTransaction
3
+
4
+ attr_accessor :avs_result_code, :avs_result_text, :cvv_result_code,
5
+ :cvv_result_text, :cpc_indicator, :authorization_code,
6
+ :authorized_amount, :card_type, :token_data
7
+
8
+ def initialize(header)
9
+ super(header)
10
+ end
11
+
12
+ end
13
13
  end
@@ -1,7 +1,7 @@
1
- module Hps
2
- class HpsBatch
3
-
4
- attr_accessor :id, :transaction_count, :total_amount, :sequence_number
5
-
6
- end
1
+ module Hps
2
+ class HpsBatch
3
+
4
+ attr_accessor :id, :transaction_count, :total_amount, :sequence_number
5
+
6
+ end
7
7
  end
@@ -1,7 +1,7 @@
1
- module Hps
2
- class HpsCardHolder
3
-
4
- attr_accessor :first_name, :last_name, :phone, :email_address, :address
5
-
6
- end
1
+ module Hps
2
+ class HpsCardHolder
3
+
4
+ attr_accessor :first_name, :last_name, :phone, :email_address, :address
5
+
6
+ end
7
7
  end
@@ -1,9 +1,9 @@
1
- module Hps
2
- class HpsCharge < HpsAuthorization
3
-
4
- def initialize(header)
5
- super(header)
6
- end
7
-
8
- end
1
+ module Hps
2
+ class HpsCharge < HpsAuthorization
3
+
4
+ def initialize(header)
5
+ super(header)
6
+ end
7
+
8
+ end
9
9
  end
@@ -1,7 +1,7 @@
1
- module Hps
2
- class HpsChargeExceptions
3
-
4
- attr_accessor :card_exception, :hps_exception
5
-
6
- end
1
+ module Hps
2
+ class HpsChargeExceptions
3
+
4
+ attr_accessor :card_exception, :hps_exception
5
+
6
+ end
7
7
  end
@@ -1,18 +1,18 @@
1
- module Hps
2
- class HpsCheck
3
- attr_accessor :routing_number,
4
- :account_number,
5
- :check_number,
6
- :check_type,
7
- :check_holder,
8
- :micr_number,
9
- :account_type,
10
- :data_entry_mode,
11
- :check_verify,
12
- :sec_code
13
-
14
- def initialize
15
- @data_entry_mode = HpsDataEntryMode.manual
16
- end
17
- end
18
- end
1
+ module Hps
2
+ class HpsCheck
3
+ attr_accessor :routing_number,
4
+ :account_number,
5
+ :check_number,
6
+ :check_type,
7
+ :check_holder,
8
+ :micr_number,
9
+ :account_type,
10
+ :data_entry_mode,
11
+ :check_verify,
12
+ :sec_code
13
+
14
+ def initialize
15
+ @data_entry_mode = HpsDataEntryMode.manual
16
+ end
17
+ end
18
+ end
@@ -1,10 +1,10 @@
1
- module Hps
2
- class HpsCheckHolder < HpsCardHolder
3
- attr_accessor :check_name,
4
- :dl_state,
5
- :dl_number,
6
- :ssl4,
7
- :dob_year,
8
- :courtesy_card
9
- end
10
- end
1
+ module Hps
2
+ class HpsCheckHolder < HpsCardHolder
3
+ attr_accessor :check_name,
4
+ :dl_state,
5
+ :dl_number,
6
+ :ssl4,
7
+ :dob_year,
8
+ :courtesy_card
9
+ end
10
+ end
@@ -1,45 +1,45 @@
1
- module Hps
2
- class HpsCheckResponse < HpsTransaction
3
- attr_accessor :authorization_code,
4
- :customer_id,
5
- :details
6
-
7
- def self.from_hash(rsp, txn_type)
8
- header = rsp["Header"]
9
- data = rsp["Transaction"][txn_type.to_s]
10
-
11
- result = HpsCheckResponse.new(HpsService.new.hydrate_transaction_header(header))
12
- result.transaction_id = header["GatewayTxnId"]
13
- result.authorization_code = data["AuthCode"]
14
- result.reference_number = data["RefNbr"]
15
- result.response_code = data["RspCode"]
16
- result.response_text = data["RspMessage"]
17
-
18
- if data["CheckRspInfo"]
19
- result.details = []
20
- check_info = data["CheckRspInfo"]
21
- if check_info.is_a? Hash
22
- result.details = HpsCheckResponse.hydrate_rsp_details(check_info)
23
- else
24
- check_info.map { |details|
25
- result.details.push HpsCheckResponse.hydrate_rsp_details(details)
26
- }
27
- end
28
- end
29
-
30
- result
31
- end
32
-
33
- private
34
-
35
- def self.hydrate_rsp_details(check_info)
36
- details = HpsCheckResponseDetails.new
37
- details.message_type = check_info["Type"]
38
- details.code = check_info["Code"]
39
- details.message = check_info["Message"]
40
- details.field_number = check_info["FieldNumber"]
41
- details.field_name = check_info["FieldName"]
42
- details
43
- end
44
- end
45
- end
1
+ module Hps
2
+ class HpsCheckResponse < HpsTransaction
3
+ attr_accessor :authorization_code,
4
+ :customer_id,
5
+ :details
6
+
7
+ def self.from_hash(rsp, txn_type)
8
+ header = rsp["Header"]
9
+ data = rsp["Transaction"][txn_type.to_s]
10
+
11
+ result = HpsCheckResponse.new(HpsService.new.hydrate_transaction_header(header))
12
+ result.transaction_id = header["GatewayTxnId"]
13
+ result.authorization_code = data["AuthCode"]
14
+ result.reference_number = data["RefNbr"]
15
+ result.response_code = data["RspCode"]
16
+ result.response_text = data["RspMessage"]
17
+
18
+ if data["CheckRspInfo"]
19
+ result.details = []
20
+ check_info = data["CheckRspInfo"]
21
+ if check_info.is_a? Hash
22
+ result.details = HpsCheckResponse.hydrate_rsp_details(check_info)
23
+ else
24
+ check_info.map { |details|
25
+ result.details.push HpsCheckResponse.hydrate_rsp_details(details)
26
+ }
27
+ end
28
+ end
29
+
30
+ result
31
+ end
32
+
33
+ private
34
+
35
+ def self.hydrate_rsp_details(check_info)
36
+ details = HpsCheckResponseDetails.new
37
+ details.message_type = check_info["Type"]
38
+ details.code = check_info["Code"]
39
+ details.message = check_info["Message"]
40
+ details.field_number = check_info["FieldNumber"]
41
+ details.field_name = check_info["FieldName"]
42
+ details
43
+ end
44
+ end
45
+ end
@@ -1,9 +1,9 @@
1
- module Hps
2
- class HpsCheckResponseDetails
3
- attr_accessor :message_type,
4
- :code,
5
- :message,
6
- :field_number,
7
- :field_name
8
- end
9
- end
1
+ module Hps
2
+ class HpsCheckResponseDetails
3
+ attr_accessor :message_type,
4
+ :code,
5
+ :message,
6
+ :field_number,
7
+ :field_name
8
+ end
9
+ end
@@ -1,34 +1,34 @@
1
- module Hps
2
- class HpsCreditCard
3
-
4
- attr_accessor :number, :cvv, :exp_month,
5
- :exp_year, :card_present, :reader_present
6
-
7
- def initialize
8
-
9
- @regex_map = {
10
- :Amex => /^3[47][0-9]{13}$/,
11
- :MasterCard => /^5[1-5][0-9]{14}$/,
12
- :Visa => /^4[0-9]{12}(?:[0-9]{3})?$/,
13
- :DinersClub => /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
14
- :EnRoute => /^(2014|2149)/,
15
- :Discover => /^6(?:011|5[0-9]{2})[0-9]{12}$/,
16
- :Jcb => /^(?:2131|1800|35\\d{3})\\d{11}$/
17
- }
18
-
19
- end
20
-
21
- def card_type
22
-
23
- @regex_map.each { |key, value|
24
- unless value.match(number.to_s).nil?
25
- return key
26
- end
27
- }
28
-
29
- "Unknown"
30
-
31
- end
32
-
33
- end
34
- end
1
+ module Hps
2
+ class HpsCreditCard
3
+
4
+ attr_accessor :number, :cvv, :exp_month,
5
+ :exp_year, :card_present, :reader_present
6
+
7
+ def initialize
8
+
9
+ @regex_map = {
10
+ :Amex => /^3[47][0-9]{13}$/,
11
+ :MasterCard => /^5[1-5][0-9]{14}$/,
12
+ :Visa => /^4[0-9]{12}(?:[0-9]{3})?$/,
13
+ :DinersClub => /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
14
+ :EnRoute => /^(2014|2149)/,
15
+ :Discover => /^6(?:011|5[0-9]{2})[0-9]{12}$/,
16
+ :Jcb => /^(?:2131|1800|35\\d{3})\\d{11}$/
17
+ }
18
+
19
+ end
20
+
21
+ def card_type
22
+
23
+ @regex_map.each { |key, value|
24
+ unless value.match(number.to_s).nil?
25
+ return key
26
+ end
27
+ }
28
+
29
+ "Unknown"
30
+
31
+ end
32
+
33
+ end
34
+ end
@@ -1,5 +1,5 @@
1
- module Hps
2
- class HpsDirectMarketData
3
- attr_accessor :invoice_number, :ship_month, :ship_day
4
- end
5
- end
1
+ module Hps
2
+ class HpsDirectMarketData
3
+ attr_accessor :invoice_number, :ship_month, :ship_day
4
+ end
5
+ end
@@ -1,6 +1,6 @@
1
- module Hps
2
- class HpsEncryptionData
3
- attr_accessor :version, :encrypted_track_number,
4
- :ktb, :ksn
5
- end
6
- end
1
+ module Hps
2
+ class HpsEncryptionData
3
+ attr_accessor :version, :encrypted_track_number,
4
+ :ktb, :ksn
5
+ end
6
+ end