wirecard 0.0.1 → 0.0.2

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/README.md +2 -0
  4. data/README.rdoc +3 -0
  5. data/circle.yml +7 -0
  6. data/lib/wirecard.rb +22 -0
  7. data/lib/wirecard/backend/approve_reversal.rb +9 -0
  8. data/lib/wirecard/backend/base.rb +20 -0
  9. data/lib/wirecard/backend/deposit.rb +9 -0
  10. data/lib/wirecard/backend/deposit_reversal.rb +9 -0
  11. data/lib/wirecard/backend/generate_order_number.rb +12 -0
  12. data/lib/wirecard/backend/get_order_details.rb +9 -0
  13. data/lib/wirecard/backend/recur_payment.rb +9 -0
  14. data/lib/wirecard/backend/refund.rb +9 -0
  15. data/lib/wirecard/backend/refund_reversal.rb +9 -0
  16. data/lib/wirecard/backend/transfer_fund/base.rb +15 -0
  17. data/lib/wirecard/backend/transfer_fund/existing_order.rb +11 -0
  18. data/lib/wirecard/base.rb +26 -11
  19. data/lib/wirecard/callback.rb +3 -8
  20. data/lib/wirecard/configuration.rb +4 -0
  21. data/lib/wirecard/data_storage/init.rb +1 -3
  22. data/lib/wirecard/fingerprint/base.rb +13 -2
  23. data/lib/wirecard/payment_process/init.rb +11 -0
  24. data/lib/wirecard/request.rb +2 -6
  25. data/lib/wirecard/response.rb +0 -4
  26. data/lib/wirecard/version.rb +1 -1
  27. data/spec/spec_helper.rb +10 -1
  28. data/spec/unit_tests/backend/approve_reversal_spec.rb +54 -0
  29. data/spec/unit_tests/backend/deposit_reversal_spec.rb +91 -0
  30. data/spec/unit_tests/backend/deposit_spec.rb +79 -0
  31. data/spec/unit_tests/backend/generate_order_number_spec.rb +37 -0
  32. data/spec/unit_tests/backend/get_order_details_spec.rb +233 -0
  33. data/spec/unit_tests/backend/recur_payment_spec.rb +86 -0
  34. data/spec/unit_tests/backend/refund_reversal.rb +60 -0
  35. data/spec/unit_tests/backend/refund_spec.rb +66 -0
  36. data/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb +88 -0
  37. data/spec/unit_tests/callback_spec.rb +101 -0
  38. data/spec/unit_tests/data_storage/init_spec.rb +39 -25
  39. data/spec/unit_tests/data_storage/read_spec.rb +47 -0
  40. data/spec/unit_tests/fingerprint/sha_512_spec.rb +69 -0
  41. data/spec/unit_tests/payment_process/init_spec.rb +94 -0
  42. data/spec/unit_tests/support/shared_context.rb +235 -0
  43. data/spec/unit_tests/support/shared_examples.rb +7 -33
  44. data/spec/unit_tests/support/webserver.rb +29 -0
  45. data/spec/wirecard_spec.rb +133 -133
  46. data/wirecard.gemspec +5 -0
  47. metadata +115 -4
  48. data/spec/unit_tests/base_shared.rb +0 -34
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 33a010befa5f036f4cab9eb4655b23b71e8c5a20
4
- data.tar.gz: 52c073c41d4b78d7712160fcd1648f10fdb89810
3
+ metadata.gz: 8c845b18d84b8d4a271d8a7b2a68db4dfc59cea6
4
+ data.tar.gz: b0d00c34a64556a0b9c512d63f485156a29fae8a
5
5
  SHA512:
6
- metadata.gz: 2da2e6633594d1b33d9a27ef9c942a35c8913d51a5257f7aaee49fb5eafee492d2efbbd24ef95cab0f30f80f74e3fa418130106573828ce969ea17c9ec6a7ba2
7
- data.tar.gz: 67dff048e38eae1222cbfd83b842d265fd120ad652770a9c8fb162b397fe438a4e7ca1dff0f2d1780c3b553e1a17c17cfadb2157a6054dd53698dd31aaf8ba48
6
+ metadata.gz: d3b7c5ba7ec269ce9a18f7b86686b71504458e76008a3a4cdbc736162b50a297a910f301fc0b1b269371df3c66a34a75c0aba4a917c555a6949be1c1f0fa412b
7
+ data.tar.gz: 4f6e36a4082cb7232197752aeefa3515850899530f8c362dbae7775ed177313d9596be7ca958487639162975e863a61181512f5175dee2b5bebff204252701fc
data/.gitignore CHANGED
@@ -11,4 +11,5 @@
11
11
  *.so
12
12
  *.o
13
13
  *.a
14
- mkmf.log
14
+ mkmf.log
15
+ .env
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # Wirecard
2
2
 
3
+ [![Circle CI](https://circleci.com/gh/HitFox/wirecard.svg?style=svg)](https://circleci.com/gh/HitFox/wirecard)
3
4
  [![Code Climate](https://codeclimate.com/github/DominicBreuker/wirecard/badges/gpa.svg)](https://codeclimate.com/github/DominicBreuker/wirecard)
5
+ [![Test Coverage](https://codeclimate.com/github/DominicBreuker/wirecard/badges/coverage.svg)](https://codeclimate.com/github/DominicBreuker/wirecard/coverage)
4
6
 
5
7
  Implements wirecard API
6
8
 
@@ -0,0 +1,3 @@
1
+ = Wirecard
2
+
3
+ This project rocks and uses MIT-LICENSE.
@@ -0,0 +1,7 @@
1
+ machine:
2
+ ruby:
3
+ version: 2.2.2
4
+
5
+ test:
6
+ override:
7
+ - bundle exec rspec
@@ -4,6 +4,17 @@ require 'wirecard/configuration'
4
4
  require 'wirecard/request'
5
5
  require 'wirecard/response'
6
6
  require 'wirecard/callback'
7
+ require 'wirecard/backend/base'
8
+ require 'wirecard/backend/approve_reversal'
9
+ require 'wirecard/backend/deposit_reversal'
10
+ require 'wirecard/backend/deposit'
11
+ require 'wirecard/backend/generate_order_number'
12
+ require 'wirecard/backend/get_order_details'
13
+ require 'wirecard/backend/recur_payment'
14
+ require 'wirecard/backend/refund'
15
+ require 'wirecard/backend/refund_reversal'
16
+ require 'wirecard/backend/transfer_fund/base'
17
+ require 'wirecard/backend/transfer_fund/existing_order'
7
18
  require 'wirecard/data_storage/base'
8
19
  require 'wirecard/data_storage/init'
9
20
  require 'wirecard/data_storage/read'
@@ -16,6 +27,17 @@ module Wirecard
16
27
  autoload :Request, 'wirecard/request'
17
28
  autoload :Response, 'wirecard/response'
18
29
  autoload :Callback, 'wirecard/callback'
30
+ autoload :Base, 'wirecard/backend/base'
31
+ autoload :ApproveReversal, 'wirecard/backend/approve_reversal'
32
+ autoload :DepositReversal, 'wirecard/backend/deposit_reversal'
33
+ autoload :Deposit, 'wirecard/backend/deposit'
34
+ autoload :GenerateOrderNumber, 'wirecard/backend/generate_order_number'
35
+ autoload :GetOrderDetails, 'wirecard/backend/get_order_details'
36
+ autoload :RecurPayment, 'wirecard/backend/recur_payment'
37
+ autoload :Refund, 'wirecard/backend/refund'
38
+ autoload :RefundReversal, 'wirecard/backend/refund_reversal'
39
+ autoload :Base, 'wirecard/backend/transfer_fund/base'
40
+ autoload :ExistingOrder, 'wirecard/backend/transfer_fund/existing_order'
19
41
  autoload :Base, 'wirecard/data_storage/base'
20
42
  autoload :Init, 'wirecard/data_storage/init'
21
43
  autoload :Read, 'wirecard/data_storage/read'
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class ApproveReversal < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,20 @@
1
+ module Wirecard
2
+ module Backend
3
+ class Base < Wirecard::Base
4
+ def url
5
+ @url ||= [Wirecard.config.endpoint, :backend, self.class.to_s.split('::').last.downcase].join('/')
6
+ end
7
+
8
+ def implicit_fingerprint_order
9
+ @implicit_fingerprint_order ||= [:customer_id, :shop_id, :password, :secret, :language]
10
+ end
11
+
12
+ def defaults
13
+ super.merge(
14
+ password: Wirecard.config.password,
15
+ language: Wirecard.config.language
16
+ )
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class Deposit < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number, :amount, :currency]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class DepositReversal < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number, :payment_number]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,12 @@
1
+ module Wirecard
2
+ module Backend
3
+ class GenerateOrderNumber < Base
4
+
5
+ def self.create(attributes = {})
6
+ object = super
7
+ object.order_number.to_i
8
+ end
9
+
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class GetOrderDetails < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class RecurPayment < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number, :source_order_number, :auto_deposit, :order_description, :amount, :currency, :order_reference, :customer_statement]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class Refund < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number, :amount, :currency]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,9 @@
1
+ module Wirecard
2
+ module Backend
3
+ class RefundReversal < Base
4
+ def implicit_fingerprint_order
5
+ @implicit_fingerprint_order ||= super + [:order_number, :credit_number]
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,15 @@
1
+ module Wirecard
2
+ module Backend
3
+ module TransferFund
4
+ class Base < Wirecard::Backend::Base
5
+ def url
6
+ @url ||= [Wirecard.config.endpoint, :backend, :transferfund].join('/')
7
+ end
8
+
9
+ def implicit_fingerprint_order
10
+ @implicit_fingerprint_order ||= super + [:order_number, :credit_number, :order_description, :amount, :currency, :order_reference, :customer_statement, :fund_transfer_type]
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,11 @@
1
+ module Wirecard
2
+ module Backend
3
+ module TransferFund
4
+ class ExistingOrder < Base
5
+ def implicit_fingerprint_order
6
+ @implicit_fingerprint_order ||= super + [:source_order_number]
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -3,6 +3,8 @@ module Wirecard
3
3
 
4
4
  attr_reader :request
5
5
 
6
+ attr_accessor :response, :params
7
+
6
8
  def defaults
7
9
  @defaults ||= {
8
10
  customer_id: Wirecard.config.customer_id,
@@ -18,31 +20,44 @@ module Wirecard
18
20
  )
19
21
  end
20
22
 
21
- ### ------------------------------------------ ###
22
- ### -------------- API request --------------- ###
23
- ### ------------------------------------------ ###
24
-
25
23
  def post
26
24
  http = Net::HTTP.new(uri.host, uri.port)
27
25
  http.use_ssl = true
28
26
 
29
- Wirecard::Response.new(http.request(request.to_post)).to_hash
27
+ self.response = Wirecard::Response.new(http.request(request.to_post)).to_hash
28
+ self
30
29
  end
31
30
 
32
- ### ------------------------------------------ ###
33
- ### ---------------- Helpers ----------------- ###
34
- ### ------------------------------------------ ###
31
+ alias_method :save, :post
35
32
 
36
- private
33
+ def method_missing(method_name, *args, &block)
34
+ if response && (response.key?(method_name.to_sym) || response.key?(method_name))
35
+ response[method_name.to_sym] || response[method_name]
36
+ else
37
+ super
38
+ end
39
+ end
37
40
 
38
- def uri
39
- @uri ||= URI.parse(url)
41
+ def respond_to_missing?(method_name, include_private = false)
42
+ response && (response.key?(method_name.to_sym) || response.key?(method_name)) || super
40
43
  end
41
44
 
42
45
  def implicit_fingerprint_order
43
46
  nil
44
47
  end
45
48
 
49
+ def self.create(attributes = {})
50
+ object = new(attributes)
51
+ object.save
52
+ object
53
+ end
54
+
55
+ private
56
+
57
+ def uri
58
+ @uri ||= URI.parse(url)
59
+ end
60
+
46
61
  def url
47
62
  raise NotImplementedError, 'A URL must be given to make a call'
48
63
  end
@@ -5,11 +5,6 @@ module Wirecard
5
5
 
6
6
  def initialize(params)
7
7
  @params = params
8
-
9
- raise ArgumentError, 'fingerprint order and fingerprint must both be set' unless response_fingerprint && response_fingerprint_order
10
- raise ArgumentError, 'parameter hash contain parameters not covered in the fingerprint: ' + unfingerprinted_params.join(',') if unfingerprinted_params.size > 0
11
-
12
- truncate_params!
13
8
  end
14
9
 
15
10
  def to_hash
@@ -17,7 +12,7 @@ module Wirecard
17
12
  end
18
13
 
19
14
  def fingerprint_valid?
20
- computed_fingerprint == response_fingerprint
15
+ !!response_fingerprint && !!response_fingerprint_order && !unfingerprinted_params? && (computed_fingerprint == response_fingerprint)
21
16
  end
22
17
 
23
18
  private
@@ -38,8 +33,8 @@ module Wirecard
38
33
  @unfingerprinted_params ||= params.keys - fingerprinted_params - ['responseFingerprint']
39
34
  end
40
35
 
41
- def truncate_params!
42
- params.keys.each{ |key| params.delete(key) unless fingerprinted_params.include?(key) || key == 'responseFingerprint' }
36
+ def unfingerprinted_params?
37
+ unfingerprinted_params.size > 0
43
38
  end
44
39
 
45
40
  def underscore(s)
@@ -5,6 +5,8 @@ module Wirecard
5
5
 
6
6
  attr_accessor :shop_id
7
7
 
8
+ attr_accessor :password
9
+
8
10
  attr_accessor :host
9
11
 
10
12
  attr_accessor :user_agent
@@ -32,6 +34,8 @@ module Wirecard
32
34
  def initialize
33
35
  @user_agent = '### User Agent ###'
34
36
  @endpoint = 'https://checkout.wirecard.com/seamless'
37
+ @host = 'checkout.wirecard.com'
38
+ @language = defined?(I18n) ? I18n.default_locale[0..1] : 'en'
35
39
  end
36
40
 
37
41
  end
@@ -9,9 +9,7 @@ module Wirecard
9
9
  super.merge(
10
10
  javascript_script_version: 'pci3',
11
11
  language: Wirecard.config.language,
12
- return_url: Wirecard.config.return_url,
13
- # don't forget to add custom styles for the iFrame
14
- # post_params['iframeCssUrl'] ActionController::Base.helpers.asset_url('credit_card_form.css')
12
+ return_url: Wirecard.config.return_url
15
13
  )
16
14
  end
17
15
  end
@@ -30,13 +30,24 @@ module Wirecard
30
30
  end
31
31
 
32
32
  def fingerprint_string
33
- keys = implicit_fingerprint_order || (params['requestFingerprintOrder'] || params['responseFingerprintOrder']).split(',')
34
- keys.map{ |key| key == 'secret' ? Wirecard.config.secret : params[key] }.compact.join
33
+ raise NoFingerprintOrderGivenError unless fingerprint_order = fingerprint_order_from_params
34
+
35
+ fingerprint_order.split(',').map{ |key| key == 'secret' ? Wirecard.config.secret : params[key] }.compact.join
36
+ end
37
+
38
+ def fingerprint_order_from_params
39
+ if implicit_fingerprint_order
40
+ implicit_fingerprint_order.join(',')
41
+ else
42
+ params['requestFingerprintOrder'] || params['responseFingerprintOrder']
43
+ end
35
44
  end
36
45
 
37
46
  def fingerprint
38
47
  raise NotImplementedError, 'Choose a subclass that specifies the method for digest (MD5/SHA512)'
39
48
  end
40
49
  end
50
+
51
+ class NoFingerprintOrderGivenError < StandardError; end
41
52
  end
42
53
  end
@@ -1,12 +1,22 @@
1
1
  module Wirecard
2
2
  module PaymentProcess
3
3
  class Init < Wirecard::Base
4
+
5
+ def order_number
6
+ @order_number ||= Wirecard::Backend::GenerateOrderNumber.create
7
+ end
8
+
4
9
  def url
5
10
  @url ||= [Wirecard.config.endpoint, :frontend, :init].join('/')
6
11
  end
7
12
 
13
+ def redirect_url
14
+ response[:redirect_url]
15
+ end
16
+
8
17
  def defaults
9
18
  super.merge(
19
+ order_number: order_number,
10
20
  language: Wirecard.config.language,
11
21
  currency: Wirecard.config.currency,
12
22
  success_url: Wirecard.config.success_url,
@@ -16,6 +26,7 @@ module Wirecard
16
26
  confirm_url: Wirecard.config.confirm_url
17
27
  )
18
28
  end
29
+
19
30
  end
20
31
  end
21
32
  end
@@ -12,8 +12,8 @@ module Wirecard
12
12
 
13
13
  def initialize(options)
14
14
  options = defaults.merge(options)
15
- raise ArgumentError 'Options must contain parameters: {params: <parameters hash>' unless options[:params]
16
- raise ArgumentError 'Options must contain uri: {uri: <wirecard API uri>' unless options[:uri]
15
+ raise ArgumentError 'Options must contain params: <parameters hash>' unless options[:params]
16
+ raise ArgumentError 'Options must contain uri: <wirecard API uri>' unless options[:uri]
17
17
 
18
18
  @params = params_to_wirecard(options[:params])
19
19
  @implicit_fingerprint_order = keys_to_wirecard(options[:implicit_fingerprint_order])
@@ -34,10 +34,6 @@ module Wirecard
34
34
  post
35
35
  end
36
36
 
37
- ### ------------------------------------------ ###
38
- ### ---------------- Helpers ----------------- ###
39
- ### ------------------------------------------ ###
40
-
41
37
  private
42
38
 
43
39
  def params_to_wirecard(params)
@@ -10,10 +10,6 @@ module Wirecard
10
10
  Hash[CGI.parse(body).map{ |param| extract_key_value(param) }]
11
11
  end
12
12
 
13
- ### ------------------------------------------ ###
14
- ### ---------------- Helpers ----------------- ###
15
- ### ------------------------------------------ ###
16
-
17
13
  private
18
14
 
19
15
  def underscore(s)
@@ -1,3 +1,3 @@
1
1
  module Wirecard
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end