wirecard 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/README.md +2 -0
- data/README.rdoc +3 -0
- data/circle.yml +7 -0
- data/lib/wirecard.rb +22 -0
- data/lib/wirecard/backend/approve_reversal.rb +9 -0
- data/lib/wirecard/backend/base.rb +20 -0
- data/lib/wirecard/backend/deposit.rb +9 -0
- data/lib/wirecard/backend/deposit_reversal.rb +9 -0
- data/lib/wirecard/backend/generate_order_number.rb +12 -0
- data/lib/wirecard/backend/get_order_details.rb +9 -0
- data/lib/wirecard/backend/recur_payment.rb +9 -0
- data/lib/wirecard/backend/refund.rb +9 -0
- data/lib/wirecard/backend/refund_reversal.rb +9 -0
- data/lib/wirecard/backend/transfer_fund/base.rb +15 -0
- data/lib/wirecard/backend/transfer_fund/existing_order.rb +11 -0
- data/lib/wirecard/base.rb +26 -11
- data/lib/wirecard/callback.rb +3 -8
- data/lib/wirecard/configuration.rb +4 -0
- data/lib/wirecard/data_storage/init.rb +1 -3
- data/lib/wirecard/fingerprint/base.rb +13 -2
- data/lib/wirecard/payment_process/init.rb +11 -0
- data/lib/wirecard/request.rb +2 -6
- data/lib/wirecard/response.rb +0 -4
- data/lib/wirecard/version.rb +1 -1
- data/spec/spec_helper.rb +10 -1
- data/spec/unit_tests/backend/approve_reversal_spec.rb +54 -0
- data/spec/unit_tests/backend/deposit_reversal_spec.rb +91 -0
- data/spec/unit_tests/backend/deposit_spec.rb +79 -0
- data/spec/unit_tests/backend/generate_order_number_spec.rb +37 -0
- data/spec/unit_tests/backend/get_order_details_spec.rb +233 -0
- data/spec/unit_tests/backend/recur_payment_spec.rb +86 -0
- data/spec/unit_tests/backend/refund_reversal.rb +60 -0
- data/spec/unit_tests/backend/refund_spec.rb +66 -0
- data/spec/unit_tests/backend/transfer_fund/existing_order_spec.rb +88 -0
- data/spec/unit_tests/callback_spec.rb +101 -0
- data/spec/unit_tests/data_storage/init_spec.rb +39 -25
- data/spec/unit_tests/data_storage/read_spec.rb +47 -0
- data/spec/unit_tests/fingerprint/sha_512_spec.rb +69 -0
- data/spec/unit_tests/payment_process/init_spec.rb +94 -0
- data/spec/unit_tests/support/shared_context.rb +235 -0
- data/spec/unit_tests/support/shared_examples.rb +7 -33
- data/spec/unit_tests/support/webserver.rb +29 -0
- data/spec/wirecard_spec.rb +133 -133
- data/wirecard.gemspec +5 -0
- metadata +115 -4
- data/spec/unit_tests/base_shared.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c845b18d84b8d4a271d8a7b2a68db4dfc59cea6
|
4
|
+
data.tar.gz: b0d00c34a64556a0b9c512d63f485156a29fae8a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d3b7c5ba7ec269ce9a18f7b86686b71504458e76008a3a4cdbc736162b50a297a910f301fc0b1b269371df3c66a34a75c0aba4a917c555a6949be1c1f0fa412b
|
7
|
+
data.tar.gz: 4f6e36a4082cb7232197752aeefa3515850899530f8c362dbae7775ed177313d9596be7ca958487639162975e863a61181512f5175dee2b5bebff204252701fc
|
data/.gitignore
CHANGED
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
|
|
data/README.rdoc
ADDED
data/circle.yml
ADDED
data/lib/wirecard.rb
CHANGED
@@ -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,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 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,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
|
data/lib/wirecard/base.rb
CHANGED
@@ -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
|
-
|
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
|
39
|
-
|
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
|
data/lib/wirecard/callback.rb
CHANGED
@@ -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
|
42
|
-
|
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
|
-
|
34
|
-
|
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
|
data/lib/wirecard/request.rb
CHANGED
@@ -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
|
16
|
-
raise ArgumentError 'Options must contain 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)
|
data/lib/wirecard/response.rb
CHANGED
@@ -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)
|
data/lib/wirecard/version.rb
CHANGED