wirecard 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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