wirecard_checkout_page 0.0.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 +7 -0
- data/.gitignore +7 -0
- data/.rspec +1 -0
- data/.travis.yml +11 -0
- data/Gemfile +7 -0
- data/README.md +43 -0
- data/Rakefile +25 -0
- data/VERSION +1 -0
- data/lib/wirecard_checkout_page.rb +12 -0
- data/lib/wirecard_checkout_page/errors.rb +5 -0
- data/lib/wirecard_checkout_page/gateway.rb +29 -0
- data/lib/wirecard_checkout_page/init_response.rb +24 -0
- data/lib/wirecard_checkout_page/request_checksum.rb +88 -0
- data/lib/wirecard_checkout_page/response_checksum.rb +64 -0
- data/lib/wirecard_checkout_page/utils.rb +7 -0
- data/lib/wirecard_checkout_page/value_handling.rb +19 -0
- data/lib/wirecard_checkout_page/value_missing.rb +1 -0
- data/lib/wirecard_checkout_page/version.rb +8 -0
- data/lib/wirecard_checkout_page/wirecard_checkout_page_error.rb +1 -0
- data/spec/spec_helper.rb +27 -0
- data/spec/wirecard_checkout_page/gateway_spec.rb +60 -0
- data/spec/wirecard_checkout_page/init_response_spec.rb +42 -0
- data/spec/wirecard_checkout_page/request_checksum_spec.rb +96 -0
- data/spec/wirecard_checkout_page/response_checksum_spec.rb +128 -0
- data/wirecard_checkout_page.gemspec +48 -0
- metadata +167 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: d0470456a38f7276de6c835212ff32c0a23030f7
|
4
|
+
data.tar.gz: 65230a1899c686c624e02675bc7e428084906fef
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e93187a873b162d0bfb29829fb65b674ec018e9e5fb30698da7f0a0b97d80ec3a470d0990998a2c42795fb612c489202484ae33ce423ffd3b1923b860f2987af
|
7
|
+
data.tar.gz: 60e3f3db0ca60f7cea0f44fffd0d549de38d2ebbad9c4fadff422cf11252dd3c0edc89fce807a8abd8e1b2c4f70521a58c3c92b877a3cc9bd97890dffa3e8ad1
|
data/.gitignore
ADDED
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
# WirecardCheckoutPage
|
2
|
+
|
3
|
+
## Example usage
|
4
|
+
|
5
|
+
Gateway setup
|
6
|
+
```ruby
|
7
|
+
gateway = WirecardCheckoutPage::Gateway.new(
|
8
|
+
secret: YOUR_SECRET,
|
9
|
+
customerId: YOUR_ID
|
10
|
+
)
|
11
|
+
```
|
12
|
+
|
13
|
+
Init a new payment process
|
14
|
+
```ruby
|
15
|
+
params = {
|
16
|
+
fingerprint_keys: ["secret", "customerId", "amount", ..], # Put in all your fingerprint keys
|
17
|
+
currency: 'EUR',
|
18
|
+
language: 'en',
|
19
|
+
amount: '100.00',
|
20
|
+
paymentType: 'SELECT',
|
21
|
+
orderDescription: 'Your order no 1',
|
22
|
+
successURL: 'http://example.com/success',
|
23
|
+
cancelURL: 'http://example.com/cancel',
|
24
|
+
failureURL: 'http://example.com/failure',
|
25
|
+
serviceURL: 'http://example.com/service',
|
26
|
+
confirmURL: 'http://example.com/confirm',
|
27
|
+
orderReference: YOUR_UNIQUE_ORDER_REFERENCE,
|
28
|
+
}
|
29
|
+
|
30
|
+
response = gateway.init(params)
|
31
|
+
|
32
|
+
puts response.success?
|
33
|
+
#=> true
|
34
|
+
|
35
|
+
puts response.params
|
36
|
+
#=> { payment_url: 'http://example.com/redirect_your_user_to_here' }
|
37
|
+
```
|
38
|
+
|
39
|
+
## Badges
|
40
|
+
|
41
|
+
[](https://codeclimate.com/github/flori/wirecard_checkout_page)
|
42
|
+
|
43
|
+
[](https://codeclimate.com/github/flori/wirecard_checkout_page)
|
data/Rakefile
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# vim: set filetype=ruby et sw=2 ts=2:
|
2
|
+
|
3
|
+
require 'gem_hadar'
|
4
|
+
|
5
|
+
GemHadar do
|
6
|
+
name 'wirecard_checkout_page'
|
7
|
+
author 'Florian Frank'
|
8
|
+
email 'flori@ping.de'
|
9
|
+
homepage "http://flori.github.com/#{name}"
|
10
|
+
summary 'Library for using Wirecard Checkout Page'
|
11
|
+
description 'This library allows you to use the Wirecard Checkout Page service.'
|
12
|
+
test_dir 'tests'
|
13
|
+
ignore '.*.sw[pon]', 'pkg', 'Gemfile.lock', 'coverage', '.rvmrc', '.AppleDouble', '.DS_Store'
|
14
|
+
readme 'README.md'
|
15
|
+
title "#{name.camelize} -- Wirecard Checkout Page implementation"
|
16
|
+
licenses << 'Apache-2.0'
|
17
|
+
|
18
|
+
dependency 'typhoeus'
|
19
|
+
development_dependency 'rake'
|
20
|
+
development_dependency 'simplecov'
|
21
|
+
development_dependency 'rspec'
|
22
|
+
development_dependency 'byebug'
|
23
|
+
end
|
24
|
+
|
25
|
+
task :default => :spec
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.0
|
@@ -0,0 +1,12 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'uri'
|
3
|
+
require 'typhoeus'
|
4
|
+
require 'wirecard_checkout_page/errors'
|
5
|
+
require 'wirecard_checkout_page/gateway'
|
6
|
+
require 'wirecard_checkout_page/utils'
|
7
|
+
require 'wirecard_checkout_page/request_checksum'
|
8
|
+
require 'wirecard_checkout_page/response_checksum'
|
9
|
+
require 'wirecard_checkout_page/init_response'
|
10
|
+
|
11
|
+
module WirecardCheckoutPage
|
12
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module WirecardCheckoutPage
|
2
|
+
class Gateway
|
3
|
+
DEFAULT_INIT_URL = 'https://checkout.wirecard.com/page/init.php'
|
4
|
+
|
5
|
+
attr_accessor :customerId, :secret, :init_url
|
6
|
+
|
7
|
+
def initialize(customerId: nil, secret: nil, init_url: nil)
|
8
|
+
@customerId = customerId
|
9
|
+
@secret = secret
|
10
|
+
@init_url = init_url || DEFAULT_INIT_URL
|
11
|
+
end
|
12
|
+
|
13
|
+
def init(params = {})
|
14
|
+
checksum = WirecardCheckoutPage::RequestChecksum.new(params.merge(authentication_params))
|
15
|
+
InitResponse.new Typhoeus.post(init_url, body: checksum.request_parameters)
|
16
|
+
end
|
17
|
+
|
18
|
+
def response_valid?(params = {})
|
19
|
+
WirecardCheckoutPage::ResponseChecksum.new(params.merge(authentication_params)).valid?
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def authentication_params
|
25
|
+
{ secret: secret, customerId: customerId }
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# works like ActiveMerchant::Billing::Response to maintain compatibility to
|
2
|
+
# active merchant gateways
|
3
|
+
|
4
|
+
module WirecardCheckoutPage
|
5
|
+
class InitResponse
|
6
|
+
def initialize(response)
|
7
|
+
@original_response = response
|
8
|
+
end
|
9
|
+
|
10
|
+
def params
|
11
|
+
{
|
12
|
+
payment_url: @original_response.headers['Location']
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
def success?
|
17
|
+
!!params[:payment_url]
|
18
|
+
end
|
19
|
+
|
20
|
+
def message
|
21
|
+
@original_response.body
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'wirecard_checkout_page/value_handling'
|
2
|
+
|
3
|
+
module WirecardCheckoutPage
|
4
|
+
class RequestChecksum
|
5
|
+
include WirecardCheckoutPage::Utils
|
6
|
+
include WirecardCheckoutPage::ValueHandling
|
7
|
+
|
8
|
+
FINGERPRINT_KEYS = %w[
|
9
|
+
secret
|
10
|
+
customerId
|
11
|
+
amount
|
12
|
+
paymentType
|
13
|
+
currency
|
14
|
+
language
|
15
|
+
orderDescription
|
16
|
+
serviceURL
|
17
|
+
successURL
|
18
|
+
cancelURL
|
19
|
+
failureURL
|
20
|
+
confirmURL
|
21
|
+
orderReference
|
22
|
+
requestFingerprintOrder
|
23
|
+
].freeze
|
24
|
+
|
25
|
+
def initialize(values = {})
|
26
|
+
@values = stringify_keys(values)
|
27
|
+
@fingerprint_keys = @values.delete('fingerprint_keys') || FINGERPRINT_KEYS
|
28
|
+
@secret = @values.delete('secret') or
|
29
|
+
raise WirecardCheckoutPage::ValueMissing, 'value "secret" is missing'
|
30
|
+
@values = add_some_defaults @values
|
31
|
+
@values.freeze
|
32
|
+
@fingerprint_keys = fingerprint_keys
|
33
|
+
@secret = @secret
|
34
|
+
reset_missing_keys
|
35
|
+
end
|
36
|
+
|
37
|
+
attr_reader :fingerprint_keys
|
38
|
+
|
39
|
+
attr_reader :values
|
40
|
+
|
41
|
+
def request_parameters
|
42
|
+
reset_missing_keys
|
43
|
+
parameters = @values.dup
|
44
|
+
parameters['requestFingerprintOrder'] = requestFingerprintOrder
|
45
|
+
parameters['requestFingerprint'] = fingerprint
|
46
|
+
if missing_keys?
|
47
|
+
raise WirecardCheckoutPage::ValueMissing,
|
48
|
+
"values #{missing_keys * ', ' } are missing"
|
49
|
+
end
|
50
|
+
parameters
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def fingerprint
|
56
|
+
values = @values.dup
|
57
|
+
values.update(
|
58
|
+
'requestFingerprintOrder' => requestFingerprintOrder,
|
59
|
+
'secret' => @secret,
|
60
|
+
)
|
61
|
+
Digest::MD5.hexdigest requestFingerprintSeed(values)
|
62
|
+
end
|
63
|
+
|
64
|
+
def requestFingerprintSeed(values)
|
65
|
+
seed = fingerprint_keys.map { |k|
|
66
|
+
values.fetch(k) do
|
67
|
+
add_missing_key k
|
68
|
+
next
|
69
|
+
end
|
70
|
+
} * ''
|
71
|
+
end
|
72
|
+
|
73
|
+
def requestFingerprintOrder
|
74
|
+
@requestFingerprintOrder ||= fingerprint_keys.join(',').freeze
|
75
|
+
end
|
76
|
+
|
77
|
+
def add_some_defaults(values)
|
78
|
+
default_values = {
|
79
|
+
'paymentType' => 'SELECT',
|
80
|
+
'currency' => 'EUR',
|
81
|
+
'language' => 'de',
|
82
|
+
}
|
83
|
+
values.update(default_values) do |key,old,new|
|
84
|
+
old.nil? ? new : old
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'wirecard_checkout_page/value_handling'
|
4
|
+
|
5
|
+
module WirecardCheckoutPage
|
6
|
+
class ResponseChecksum
|
7
|
+
include WirecardCheckoutPage::Utils
|
8
|
+
include WirecardCheckoutPage::ValueHandling
|
9
|
+
|
10
|
+
def initialize(values = {})
|
11
|
+
@values = stringify_keys(values)
|
12
|
+
@secret = @values.delete('secret') or
|
13
|
+
raise WirecardCheckoutPage::ValueMissing, 'value "secret" is missing'
|
14
|
+
# This rails form value is escaped as an html entity by
|
15
|
+
# WirecardCheckoutPage, so set it back to the original UTF-8 here if it
|
16
|
+
# exists:
|
17
|
+
@values['utf8'] and @values['utf8'] = '✓'
|
18
|
+
@values.freeze
|
19
|
+
reset_missing_keys
|
20
|
+
end
|
21
|
+
|
22
|
+
attr_reader :values
|
23
|
+
|
24
|
+
attr_reader :expected_fingerprint
|
25
|
+
|
26
|
+
attr_reader :computed_fingerprint
|
27
|
+
|
28
|
+
def fingerprint
|
29
|
+
values = @values.dup
|
30
|
+
values['secret'] ||= @secret
|
31
|
+
if seed = responseFingerprintSeed(responseFingerprintOrder(values), values)
|
32
|
+
Digest::MD5.hexdigest seed
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def valid?
|
37
|
+
reset_missing_keys
|
38
|
+
@expected_fingerprint = values.fetch('responseFingerprint') do |k|
|
39
|
+
add_missing_key k
|
40
|
+
end
|
41
|
+
@computed_fingerprint = fingerprint
|
42
|
+
!missing_keys? && computed_fingerprint == @expected_fingerprint
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def responseFingerprintOrder(values)
|
48
|
+
order = values.fetch('responseFingerprintOrder') do |k|
|
49
|
+
add_missing_key k
|
50
|
+
return []
|
51
|
+
end
|
52
|
+
order.split(',')
|
53
|
+
end
|
54
|
+
|
55
|
+
def responseFingerprintSeed(keys, values)
|
56
|
+
fingerprint = keys.map do |k|
|
57
|
+
values.fetch(k) do
|
58
|
+
add_missing_key k
|
59
|
+
end
|
60
|
+
end * ''
|
61
|
+
fingerprint unless missing_keys?
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module WirecardCheckoutPage::ValueHandling
|
2
|
+
def missing_keys
|
3
|
+
@missing_keys ||= []
|
4
|
+
end
|
5
|
+
|
6
|
+
def missing_keys?
|
7
|
+
unless missing_keys.empty?
|
8
|
+
missing_keys
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def add_missing_key(key)
|
13
|
+
missing_keys << key
|
14
|
+
end
|
15
|
+
|
16
|
+
def reset_missing_keys
|
17
|
+
missing_keys.clear
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'wirecard_checkout_page/errors'
|
@@ -0,0 +1,8 @@
|
|
1
|
+
module WirecardCheckoutPage
|
2
|
+
# WirecardCheckoutPage version
|
3
|
+
VERSION = '0.0.0'
|
4
|
+
VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
|
5
|
+
VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
|
6
|
+
VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
|
7
|
+
VERSION_BUILD = VERSION_ARRAY[2] # :nodoc:
|
8
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'wirecard_checkout_page/errors'
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
if ENV['START_SIMPLECOV'].to_i == 1
|
2
|
+
require 'simplecov'
|
3
|
+
SimpleCov.start do
|
4
|
+
add_filter "#{File.basename(File.dirname(__FILE__))}/"
|
5
|
+
end
|
6
|
+
end
|
7
|
+
|
8
|
+
if ENV.key?('CODECLIMATE_REPO_TOKEN')
|
9
|
+
begin
|
10
|
+
require "codeclimate-test-reporter"
|
11
|
+
rescue LoadError => e
|
12
|
+
warn "Caught #{e.class}: #{e.message} loading codeclimate-test-reporter"
|
13
|
+
else
|
14
|
+
CodeClimate::TestReporter.start
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
require 'rspec'
|
19
|
+
require 'byebug'
|
20
|
+
require 'wirecard_checkout_page'
|
21
|
+
|
22
|
+
RSpec.configure do |config|
|
23
|
+
config.before(:all) do
|
24
|
+
response = Typhoeus::Response.new(code: 302, body: "", headers: { 'Location' => 'payment-url' })
|
25
|
+
Typhoeus.stub(/init/).and_return(response)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WirecardCheckoutPage::Gateway do
|
4
|
+
let(:gateway) { WirecardCheckoutPage::Gateway.new(customerId: 'foo', secret: 'bar') }
|
5
|
+
|
6
|
+
describe '#initialize' do
|
7
|
+
it 'stores secret, customerId and init_url if given' do
|
8
|
+
gateway = WirecardCheckoutPage::Gateway.new(customerId: 'foo', secret: 'bar', init_url: 'foobar')
|
9
|
+
expect(gateway.customerId).to eq 'foo'
|
10
|
+
expect(gateway.secret).to eq 'bar'
|
11
|
+
expect(gateway.init_url).to eq 'foobar'
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'takes the default init url if none was given' do
|
15
|
+
gateway = WirecardCheckoutPage::Gateway.new
|
16
|
+
expect(gateway.init_url).to be_a String
|
17
|
+
expect(gateway.init_url).to eq WirecardCheckoutPage::Gateway::DEFAULT_INIT_URL
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe '#init' do
|
22
|
+
let(:valid_params) do
|
23
|
+
{
|
24
|
+
amount: '100.00',
|
25
|
+
orderDescription: 'order',
|
26
|
+
serviceURL: 'service',
|
27
|
+
successURL: 'succes',
|
28
|
+
cancelURL: 'cancel',
|
29
|
+
failureURL: 'failure',
|
30
|
+
confirmURL: 'confirm',
|
31
|
+
orderReference: '123',
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'builds a checksum with the authorization params' do
|
36
|
+
expect(WirecardCheckoutPage::RequestChecksum).to receive(:new).
|
37
|
+
with(hash_including customerId: 'foo', secret: 'bar').and_call_original
|
38
|
+
gateway.init(valid_params)
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'returns a InitResponse with the correct payment url' do
|
42
|
+
response = gateway.init(valid_params)
|
43
|
+
expect(response).to be_a WirecardCheckoutPage::InitResponse
|
44
|
+
expect(response.params).to eq(payment_url: 'payment-url')
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#response_valid?' do
|
49
|
+
it 'builds a checksum with the authorization params' do
|
50
|
+
expect(WirecardCheckoutPage::ResponseChecksum).to receive(:new).
|
51
|
+
with(hash_including customerId: 'foo', secret: 'bar').and_call_original
|
52
|
+
gateway.response_valid?
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'returns true if the response was valid' do
|
56
|
+
allow_any_instance_of(WirecardCheckoutPage::ResponseChecksum).to receive(:valid?).and_return(true)
|
57
|
+
expect(gateway.response_valid?).to be true
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WirecardCheckoutPage::InitResponse do
|
4
|
+
|
5
|
+
let(:success_response) do
|
6
|
+
http_response = double(headers: { 'Location' => 'payment-url' }, body: '')
|
7
|
+
WirecardCheckoutPage::InitResponse.new(http_response)
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:failure_response) do
|
11
|
+
http_response = double(headers: {}, body: 'Error message')
|
12
|
+
WirecardCheckoutPage::InitResponse.new(http_response)
|
13
|
+
end
|
14
|
+
|
15
|
+
describe '#params' do
|
16
|
+
it 'extracts the payment_url from the headers' do
|
17
|
+
expect(success_response.params).to eq({ payment_url: 'payment-url' })
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'returns nil as payment_url on error' do
|
21
|
+
expect(failure_response.params).to eq({ payment_url: nil })
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
describe '#success?' do
|
26
|
+
it 'returns true if payment_url is present' do
|
27
|
+
expect(success_response).to be_success
|
28
|
+
end
|
29
|
+
|
30
|
+
it 'returns false if payment_url is blank' do
|
31
|
+
expect(failure_response).not_to be_success
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#message' do
|
36
|
+
it 'returns the response body' do
|
37
|
+
expect(success_response.message).to eq ''
|
38
|
+
expect(failure_response.message).to eq 'Error message'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe WirecardCheckoutPage::RequestChecksum do
|
4
|
+
let :secret do
|
5
|
+
'SOMESECRET'
|
6
|
+
end
|
7
|
+
|
8
|
+
let :customer_id do
|
9
|
+
'SOMECUSTOMERID'
|
10
|
+
end
|
11
|
+
|
12
|
+
let :shop_id do
|
13
|
+
'someshopid'
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.new' do
|
17
|
+
it "raises a WirecardCheckoutPage::ValueMissing if no values were passed" do
|
18
|
+
expect {
|
19
|
+
WirecardCheckoutPage::RequestChecksum.new
|
20
|
+
}.to raise_error WirecardCheckoutPage::ValueMissing
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#request_parameters' do
|
25
|
+
it "raises a WirecardCheckoutPage::ValueMissing if not all required values were passed" do
|
26
|
+
expect {
|
27
|
+
WirecardCheckoutPage::RequestChecksum.new(
|
28
|
+
secret: 'foo',
|
29
|
+
fingerprint_keys: %w[foo bar],
|
30
|
+
foo: 'foo'
|
31
|
+
).request_parameters
|
32
|
+
}.to raise_error WirecardCheckoutPage::ValueMissing
|
33
|
+
end
|
34
|
+
|
35
|
+
it "doesn't an error if all required values were passed" do
|
36
|
+
expect {
|
37
|
+
WirecardCheckoutPage::RequestChecksum.new(
|
38
|
+
secret: 'foo',
|
39
|
+
fingerprint_keys: %w[foo bar],
|
40
|
+
foo: 'foo',
|
41
|
+
bar: 'bar',
|
42
|
+
).request_parameters
|
43
|
+
}.not_to raise_error
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'uses its default parameters and unless they were passed' do
|
47
|
+
parameters = WirecardCheckoutPage::RequestChecksum.new(
|
48
|
+
secret: 'foo',
|
49
|
+
fingerprint_keys: [],
|
50
|
+
currency: 'USD'
|
51
|
+
).request_parameters
|
52
|
+
expect(parameters).to eq(
|
53
|
+
"currency" => "USD",
|
54
|
+
"language" => "de",
|
55
|
+
"paymentType" => "SELECT",
|
56
|
+
"requestFingerprint" => "d41d8cd98f00b204e9800998ecf8427e",
|
57
|
+
"requestFingerprintOrder" => "",
|
58
|
+
)
|
59
|
+
end
|
60
|
+
|
61
|
+
it "computes a checksum" do
|
62
|
+
checksum = WirecardCheckoutPage::RequestChecksum.new(
|
63
|
+
secret: secret,
|
64
|
+
fingerprint_keys: WirecardCheckoutPage::RequestChecksum::FINGERPRINT_KEYS + %w[shopId],
|
65
|
+
customerId: customer_id,
|
66
|
+
shopId: shop_id,
|
67
|
+
amount: '6.66',
|
68
|
+
orderDescription: 'Kauf einer Seele (billig)',
|
69
|
+
successURL: 'http://example.com/success',
|
70
|
+
cancelURL: 'http://example.com/cancel',
|
71
|
+
failureURL: 'http://example.com/failure',
|
72
|
+
serviceURL: 'http://example.com',
|
73
|
+
confirmURL: 'http://example.com/confirm',
|
74
|
+
orderReference: '475ae67f248578b92a701',
|
75
|
+
)
|
76
|
+
expect(checksum.__send__(:fingerprint)).to eq "10feda94a5db9f3e2fc7439d3c4c228b"
|
77
|
+
expect(checksum.request_parameters).to eq(
|
78
|
+
"customerId" => customer_id,
|
79
|
+
"shopId" => shop_id,
|
80
|
+
"paymentType" => "SELECT",
|
81
|
+
"currency" => "EUR",
|
82
|
+
"language" => "de",
|
83
|
+
"amount" => "6.66",
|
84
|
+
"orderDescription" => "Kauf einer Seele (billig)",
|
85
|
+
"successURL" => "http://example.com/success",
|
86
|
+
"cancelURL" => "http://example.com/cancel",
|
87
|
+
"failureURL" => "http://example.com/failure",
|
88
|
+
"serviceURL" => "http://example.com",
|
89
|
+
"confirmURL" => "http://example.com/confirm",
|
90
|
+
"orderReference" => "475ae67f248578b92a701",
|
91
|
+
"requestFingerprintOrder" => checksum.fingerprint_keys * ',',
|
92
|
+
"requestFingerprint" => "10feda94a5db9f3e2fc7439d3c4c228b"
|
93
|
+
)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'wirecard_checkout_page'
|
3
|
+
|
4
|
+
describe WirecardCheckoutPage::ResponseChecksum do
|
5
|
+
let :secret do
|
6
|
+
'SOMESECRET'
|
7
|
+
end
|
8
|
+
|
9
|
+
let :customer_id do
|
10
|
+
'SOMECUSTOMERID'
|
11
|
+
end
|
12
|
+
|
13
|
+
let :shop_id do
|
14
|
+
'someshopid'
|
15
|
+
end
|
16
|
+
|
17
|
+
it "recognizes a correct response" do
|
18
|
+
response_params = {
|
19
|
+
secret: secret,
|
20
|
+
fingerprint_keys: WirecardCheckoutPage::RequestChecksum::FINGERPRINT_KEYS + %w[shopId],
|
21
|
+
customerId: customer_id,
|
22
|
+
shopId: shop_id,
|
23
|
+
"amount" => "28.95",
|
24
|
+
"currency" => "EUR",
|
25
|
+
"paymentType" => "CCARD",
|
26
|
+
"financialInstitution" => "MC",
|
27
|
+
"language" => "de",
|
28
|
+
"orderNumber" => "7739491",
|
29
|
+
"paymentState" => "SUCCESS",
|
30
|
+
"utf8" => "✓",
|
31
|
+
"authenticity_token" => "bnz1fHxcCYD9jdPiNIEl7yJExRetWWAOQPopmjYksFc=",
|
32
|
+
"commit" => "Bezahlen",
|
33
|
+
"authenticated" => "No",
|
34
|
+
"anonymousPan" => "0002",
|
35
|
+
"expiry" => "01/2013",
|
36
|
+
"cardholder" => "Foorian Bar",
|
37
|
+
"maskedPan" => "950000******0002",
|
38
|
+
"gatewayReferenceNumber" => "DGW_7739491_RN",
|
39
|
+
"gatewayContractNumber" => "DemoContractNumber123",
|
40
|
+
"responseFingerprintOrder"=>"amount,currency,paymentType,"\
|
41
|
+
"financialInstitution,language,orderNumber,paymentState,utf8,"\
|
42
|
+
"authenticity_token,commit,authenticated,anonymousPan,expiry,"\
|
43
|
+
"cardholder,maskedPan,gatewayReferenceNumber,gatewayContractNumber,"\
|
44
|
+
"secret,responseFingerprintOrder",
|
45
|
+
"responseFingerprint" => "8a1319b4a097d5a9157f479b11e8f5ae",
|
46
|
+
"challenge_offer_id" => "0dd916e49abd1935c2dc084bae2a57b8"
|
47
|
+
}
|
48
|
+
checksum = WirecardCheckoutPage::ResponseChecksum.new(response_params)
|
49
|
+
checksum.valid?
|
50
|
+
expect(checksum.computed_fingerprint).to eq '8a1319b4a097d5a9157f479b11e8f5ae'
|
51
|
+
expect(checksum).to be_valid
|
52
|
+
end
|
53
|
+
|
54
|
+
it "fails check on an incorrect response" do
|
55
|
+
response_params = {
|
56
|
+
secret: secret,
|
57
|
+
fingerprint_keys: WirecardCheckoutPage::RequestChecksum::FINGERPRINT_KEYS + %w[shopId],
|
58
|
+
customerId: customer_id,
|
59
|
+
shopId: shop_id,
|
60
|
+
"amount" => "28.95",
|
61
|
+
"currency" => "EUR",
|
62
|
+
"paymentType" => "CCARD",
|
63
|
+
"financialInstitution" => "MC",
|
64
|
+
"language" => "de",
|
65
|
+
"orderNumber" => "7739491",
|
66
|
+
"paymentState" => "SUCCESS",
|
67
|
+
"utf8" => "✓",
|
68
|
+
"authenticity_token" => "bnz1fHxcCYD9jdPiNIEl7yJExRetWWAOQPopmjYksFc=",
|
69
|
+
"commit" => "Bezahlen",
|
70
|
+
"authenticated" => "No",
|
71
|
+
"anonymousPan" => "0002",
|
72
|
+
"expiry" => "01/2013",
|
73
|
+
"cardholder" => "Foorian Bar",
|
74
|
+
"maskedPan" => "950000******0002",
|
75
|
+
"gatewayReferenceNumber" => "DGW_7739491_RN",
|
76
|
+
"gatewayContractNumber" => "DemoContractNumber123",
|
77
|
+
"responseFingerprintOrder"=>"amount,currency,paymentType,"\
|
78
|
+
"financialInstitution,language,orderNumber,paymentState,utf8,"\
|
79
|
+
"authenticity_token,commit,authenticated,anonymousPan,expiry,"\
|
80
|
+
"cardholder,maskedPan,gatewayReferenceNumber,gatewayContractNumber,"\
|
81
|
+
"secret,responseFingerprintOrder",
|
82
|
+
"responseFingerprint" => "666c9c80495703dabfc08434d2e99af0",
|
83
|
+
"challenge_offer_id" => "0dd916e49abd1935c2dc084bae2a57b8"
|
84
|
+
}
|
85
|
+
expect(WirecardCheckoutPage::ResponseChecksum.new(response_params)).
|
86
|
+
to_not be_valid
|
87
|
+
end
|
88
|
+
|
89
|
+
it "fails check on a response with missing keys" do
|
90
|
+
response_params = {
|
91
|
+
secret: secret,
|
92
|
+
fingerprint_keys: WirecardCheckoutPage::RequestChecksum::FINGERPRINT_KEYS + %w[shopId],
|
93
|
+
customerId: customer_id,
|
94
|
+
shopId: shop_id,
|
95
|
+
"currency" => "EUR",
|
96
|
+
"paymentType" => "CCARD",
|
97
|
+
"financialInstitution" => "MC",
|
98
|
+
"language" => "de",
|
99
|
+
"orderNumber" => "7739491",
|
100
|
+
"paymentState" => "SUCCESS",
|
101
|
+
"utf8" => "✓",
|
102
|
+
"authenticity_token" => "bnz1fHxcCYD9jdPiNIEl7yJExRetWWAOQPopmjYksFc=",
|
103
|
+
"commit" => "Bezahlen",
|
104
|
+
"authenticated" => "No",
|
105
|
+
"anonymousPan" => "0002",
|
106
|
+
"expiry" => "01/2013",
|
107
|
+
"cardholder" => "Foorian Bar",
|
108
|
+
"maskedPan" => "950000******0002",
|
109
|
+
"gatewayReferenceNumber" => "DGW_7739491_RN",
|
110
|
+
"gatewayContractNumber" => "DemoContractNumber123",
|
111
|
+
"responseFingerprintOrder"=>"amount,currency,paymentType,"\
|
112
|
+
"financialInstitution,language,orderNumber,paymentState,utf8,"\
|
113
|
+
"authenticity_token,commit,authenticated,anonymousPan,expiry,"\
|
114
|
+
"cardholder,maskedPan,gatewayReferenceNumber,gatewayContractNumber,"\
|
115
|
+
"secret,responseFingerprintOrder",
|
116
|
+
"responseFingerprint" => "666c9c80495703dabfc08434d2e99af0",
|
117
|
+
"challenge_offer_id" => "0dd916e49abd1935c2dc084bae2a57b8"
|
118
|
+
}
|
119
|
+
checksum = WirecardCheckoutPage::ResponseChecksum.new(response_params)
|
120
|
+
expect(checksum).to_not be_valid
|
121
|
+
expect(checksum).to be_missing_keys
|
122
|
+
expect(checksum.missing_keys?).to eq %w[amount]
|
123
|
+
end
|
124
|
+
|
125
|
+
it "fails check in an empty response" do
|
126
|
+
expect(WirecardCheckoutPage::ResponseChecksum.new(secret: secret)).to_not be_valid
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
# stub: wirecard_checkout_page 0.0.0 ruby lib
|
3
|
+
|
4
|
+
Gem::Specification.new do |s|
|
5
|
+
s.name = "wirecard_checkout_page"
|
6
|
+
s.version = "0.0.0"
|
7
|
+
|
8
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
9
|
+
s.require_paths = ["lib"]
|
10
|
+
s.authors = ["Florian Frank"]
|
11
|
+
s.date = "2014-10-24"
|
12
|
+
s.description = "This library allows you to use the Wirecard Checkout Page service."
|
13
|
+
s.email = "flori@ping.de"
|
14
|
+
s.extra_rdoc_files = ["README.md", "lib/wirecard_checkout_page.rb", "lib/wirecard_checkout_page/errors.rb", "lib/wirecard_checkout_page/gateway.rb", "lib/wirecard_checkout_page/init_response.rb", "lib/wirecard_checkout_page/request_checksum.rb", "lib/wirecard_checkout_page/response_checksum.rb", "lib/wirecard_checkout_page/utils.rb", "lib/wirecard_checkout_page/value_handling.rb", "lib/wirecard_checkout_page/value_missing.rb", "lib/wirecard_checkout_page/version.rb", "lib/wirecard_checkout_page/wirecard_checkout_page_error.rb"]
|
15
|
+
s.files = [".gitignore", ".rspec", ".travis.yml", "Gemfile", "README.md", "Rakefile", "VERSION", "lib/wirecard_checkout_page.rb", "lib/wirecard_checkout_page/errors.rb", "lib/wirecard_checkout_page/gateway.rb", "lib/wirecard_checkout_page/init_response.rb", "lib/wirecard_checkout_page/request_checksum.rb", "lib/wirecard_checkout_page/response_checksum.rb", "lib/wirecard_checkout_page/utils.rb", "lib/wirecard_checkout_page/value_handling.rb", "lib/wirecard_checkout_page/value_missing.rb", "lib/wirecard_checkout_page/version.rb", "lib/wirecard_checkout_page/wirecard_checkout_page_error.rb", "spec/spec_helper.rb", "spec/wirecard_checkout_page/gateway_spec.rb", "spec/wirecard_checkout_page/init_response_spec.rb", "spec/wirecard_checkout_page/request_checksum_spec.rb", "spec/wirecard_checkout_page/response_checksum_spec.rb", "wirecard_checkout_page.gemspec"]
|
16
|
+
s.homepage = "http://flori.github.com/wirecard_checkout_page"
|
17
|
+
s.licenses = ["Apache-2.0"]
|
18
|
+
s.rdoc_options = ["--title", "WirecardCheckoutPage -- Wirecard Checkout Page implementation", "--main", "README.md"]
|
19
|
+
s.rubygems_version = "2.2.2"
|
20
|
+
s.summary = "Library for using Wirecard Checkout Page"
|
21
|
+
|
22
|
+
if s.respond_to? :specification_version then
|
23
|
+
s.specification_version = 4
|
24
|
+
|
25
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
26
|
+
s.add_development_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
27
|
+
s.add_development_dependency(%q<rake>, [">= 0"])
|
28
|
+
s.add_development_dependency(%q<simplecov>, [">= 0"])
|
29
|
+
s.add_development_dependency(%q<rspec>, [">= 0"])
|
30
|
+
s.add_development_dependency(%q<byebug>, [">= 0"])
|
31
|
+
s.add_runtime_dependency(%q<typhoeus>, [">= 0"])
|
32
|
+
else
|
33
|
+
s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
34
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
35
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
36
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
37
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
38
|
+
s.add_dependency(%q<typhoeus>, [">= 0"])
|
39
|
+
end
|
40
|
+
else
|
41
|
+
s.add_dependency(%q<gem_hadar>, ["~> 1.0.0"])
|
42
|
+
s.add_dependency(%q<rake>, [">= 0"])
|
43
|
+
s.add_dependency(%q<simplecov>, [">= 0"])
|
44
|
+
s.add_dependency(%q<rspec>, [">= 0"])
|
45
|
+
s.add_dependency(%q<byebug>, [">= 0"])
|
46
|
+
s.add_dependency(%q<typhoeus>, [">= 0"])
|
47
|
+
end
|
48
|
+
end
|
metadata
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: wirecard_checkout_page
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Florian Frank
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-24 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: gem_hadar
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 1.0.0
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 1.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: simplecov
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
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: byebug
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>='
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: typhoeus
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - '>='
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: This library allows you to use the Wirecard Checkout Page service.
|
98
|
+
email: flori@ping.de
|
99
|
+
executables: []
|
100
|
+
extensions: []
|
101
|
+
extra_rdoc_files:
|
102
|
+
- README.md
|
103
|
+
- lib/wirecard_checkout_page.rb
|
104
|
+
- lib/wirecard_checkout_page/errors.rb
|
105
|
+
- lib/wirecard_checkout_page/gateway.rb
|
106
|
+
- lib/wirecard_checkout_page/init_response.rb
|
107
|
+
- lib/wirecard_checkout_page/request_checksum.rb
|
108
|
+
- lib/wirecard_checkout_page/response_checksum.rb
|
109
|
+
- lib/wirecard_checkout_page/utils.rb
|
110
|
+
- lib/wirecard_checkout_page/value_handling.rb
|
111
|
+
- lib/wirecard_checkout_page/value_missing.rb
|
112
|
+
- lib/wirecard_checkout_page/version.rb
|
113
|
+
- lib/wirecard_checkout_page/wirecard_checkout_page_error.rb
|
114
|
+
files:
|
115
|
+
- .gitignore
|
116
|
+
- .rspec
|
117
|
+
- .travis.yml
|
118
|
+
- Gemfile
|
119
|
+
- README.md
|
120
|
+
- Rakefile
|
121
|
+
- VERSION
|
122
|
+
- lib/wirecard_checkout_page.rb
|
123
|
+
- lib/wirecard_checkout_page/errors.rb
|
124
|
+
- lib/wirecard_checkout_page/gateway.rb
|
125
|
+
- lib/wirecard_checkout_page/init_response.rb
|
126
|
+
- lib/wirecard_checkout_page/request_checksum.rb
|
127
|
+
- lib/wirecard_checkout_page/response_checksum.rb
|
128
|
+
- lib/wirecard_checkout_page/utils.rb
|
129
|
+
- lib/wirecard_checkout_page/value_handling.rb
|
130
|
+
- lib/wirecard_checkout_page/value_missing.rb
|
131
|
+
- lib/wirecard_checkout_page/version.rb
|
132
|
+
- lib/wirecard_checkout_page/wirecard_checkout_page_error.rb
|
133
|
+
- spec/spec_helper.rb
|
134
|
+
- spec/wirecard_checkout_page/gateway_spec.rb
|
135
|
+
- spec/wirecard_checkout_page/init_response_spec.rb
|
136
|
+
- spec/wirecard_checkout_page/request_checksum_spec.rb
|
137
|
+
- spec/wirecard_checkout_page/response_checksum_spec.rb
|
138
|
+
- wirecard_checkout_page.gemspec
|
139
|
+
homepage: http://flori.github.com/wirecard_checkout_page
|
140
|
+
licenses:
|
141
|
+
- Apache-2.0
|
142
|
+
metadata: {}
|
143
|
+
post_install_message:
|
144
|
+
rdoc_options:
|
145
|
+
- --title
|
146
|
+
- WirecardCheckoutPage -- Wirecard Checkout Page implementation
|
147
|
+
- --main
|
148
|
+
- README.md
|
149
|
+
require_paths:
|
150
|
+
- lib
|
151
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
152
|
+
requirements:
|
153
|
+
- - '>='
|
154
|
+
- !ruby/object:Gem::Version
|
155
|
+
version: '0'
|
156
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
requirements: []
|
162
|
+
rubyforge_project:
|
163
|
+
rubygems_version: 2.2.2
|
164
|
+
signing_key:
|
165
|
+
specification_version: 4
|
166
|
+
summary: Library for using Wirecard Checkout Page
|
167
|
+
test_files: []
|