payex 0.1.2 → 0.3
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/.travis.yml +7 -0
- data/Gemfile +5 -2
- data/Gemfile.lock +15 -17
- data/README.md +59 -0
- data/Rakefile +5 -0
- data/lib/payex.rb +17 -69
- data/lib/payex/api.rb +13 -0
- data/lib/payex/{pxorder.rb → api/pxorder.rb} +1 -1
- data/lib/payex/credit_card_redirect.rb +43 -0
- data/payex.gemspec +8 -1
- data/spec/{api_unit_spec.rb → api_spec.rb} +0 -0
- data/spec/credit_card_redirect_spec.rb +96 -0
- data/spec/fixtures/complete/complete_declined.xml +52 -0
- data/spec/fixtures/complete/complete_failed.xml +52 -0
- data/spec/fixtures/complete/complete_ok.xml +46 -0
- data/spec/fixtures/initialize7/initialize_ok.xml +14 -14
- data/spec/spec_helper.rb +3 -0
- metadata +58 -29
- data/README +0 -34
- data/spec/integration_spec.rb +0 -45
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 87add971c273b10a05fd489a701184e47a414eca
|
4
|
+
data.tar.gz: 20605334607f26c3c2c4b57cda30b81d2f936cfb
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d36d402b2631b2fa06d160c3a5e14d64aef3fa0cbc1da2c34342e06936a862476ecd726db5d31462e276288f84938e2bc6614e7d3ca76b9e12c5f9a1cb2a81cf
|
7
|
+
data.tar.gz: 85e3655ff8a0d84df2560169831460a5a55f34c5899706f044f389d6ff4cf684b11910073104df74890432f7aef18a5a1439b0cb1beb5df03e046eb69ef5da1b
|
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
payex (0.
|
4
|
+
payex (0.3)
|
5
|
+
httpclient (~> 2.2)
|
5
6
|
nori (~> 1.1)
|
6
7
|
savon (~> 1.1)
|
7
8
|
|
8
9
|
GEM
|
9
|
-
remote:
|
10
|
+
remote: https://rubygems.org/
|
10
11
|
specs:
|
11
12
|
akami (1.2.0)
|
12
13
|
gyoku (>= 0.4.0)
|
13
14
|
nokogiri (>= 1.4.0)
|
14
|
-
builder (3.
|
15
|
+
builder (3.1.3)
|
15
16
|
diff-lcs (1.1.3)
|
16
|
-
|
17
|
-
guard (1.3.2)
|
17
|
+
guard (1.3.3)
|
18
18
|
listen (>= 0.4.2)
|
19
19
|
thor (>= 0.14.6)
|
20
20
|
guard-bundler (1.0.0)
|
@@ -24,29 +24,24 @@ GEM
|
|
24
24
|
guard (>= 1.1)
|
25
25
|
gyoku (0.4.6)
|
26
26
|
builder (>= 2.1.2)
|
27
|
+
httpclient (2.3.4.1)
|
27
28
|
httpi (1.1.1)
|
28
29
|
rack
|
29
|
-
listen (0.
|
30
|
-
rb-fchange (~> 0.0.5)
|
31
|
-
rb-fsevent (~> 0.9.1)
|
32
|
-
rb-inotify (~> 0.8.8)
|
30
|
+
listen (0.5.2)
|
33
31
|
nokogiri (1.5.5)
|
34
32
|
nori (1.1.3)
|
35
33
|
rack (1.4.1)
|
36
|
-
|
37
|
-
|
38
|
-
rb-fsevent (0.9.1)
|
39
|
-
rb-inotify (0.8.8)
|
40
|
-
ffi (>= 0.5.0)
|
34
|
+
rake (0.9.2.2)
|
35
|
+
rb-fsevent (0.9.2)
|
41
36
|
rspec (2.11.0)
|
42
37
|
rspec-core (~> 2.11.0)
|
43
38
|
rspec-expectations (~> 2.11.0)
|
44
39
|
rspec-mocks (~> 2.11.0)
|
45
40
|
rspec-core (2.11.1)
|
46
|
-
rspec-expectations (2.11.
|
41
|
+
rspec-expectations (2.11.3)
|
47
42
|
diff-lcs (~> 1.1.3)
|
48
|
-
rspec-mocks (2.11.
|
49
|
-
savon (1.
|
43
|
+
rspec-mocks (2.11.3)
|
44
|
+
savon (1.2.0)
|
50
45
|
akami (~> 1.2.0)
|
51
46
|
builder (>= 2.1.2)
|
52
47
|
gyoku (~> 0.4.5)
|
@@ -70,7 +65,10 @@ DEPENDENCIES
|
|
70
65
|
guard (~> 1.3)
|
71
66
|
guard-bundler (~> 1.0)
|
72
67
|
guard-rspec (~> 1.2)
|
68
|
+
jruby-openssl (~> 0.7)
|
73
69
|
payex!
|
70
|
+
rake (~> 0.9)
|
71
|
+
rb-fsevent (~> 0.9)
|
74
72
|
rspec (~> 2.11)
|
75
73
|
savon_spec (~> 1.3)
|
76
74
|
terminal-notifier-guard (~> 1.5)
|
data/README.md
ADDED
@@ -0,0 +1,59 @@
|
|
1
|
+
[](https://travis-ci.org/gointeractive/payex-ruby)
|
2
|
+
|
3
|
+
## Installation
|
4
|
+
|
5
|
+
This is a rudimentary Ruby binding for the [PayEx API]. You can
|
6
|
+
install it using RubyGems.
|
7
|
+
|
8
|
+
[PayEx API]: http://pim.payex.com/section3/section3_4_2.htm
|
9
|
+
|
10
|
+
```
|
11
|
+
gem install payex
|
12
|
+
```
|
13
|
+
|
14
|
+
## Usage
|
15
|
+
|
16
|
+
This library only implements the "credit card redirect" method.
|
17
|
+
|
18
|
+
Here's how a basic credit card transaction works:
|
19
|
+
|
20
|
+
```ruby
|
21
|
+
require 'payex'
|
22
|
+
|
23
|
+
PayEx.account_number = 123456789
|
24
|
+
PayEx.encryption_key = 'e4939be3910ebu194'
|
25
|
+
PayEx.default_currency = 'SEK'
|
26
|
+
#PayEx.base_url = PayEx::TEST_URL # (use this for testing)
|
27
|
+
|
28
|
+
# (an arbitrary string you can use to identify this transaction)
|
29
|
+
my_order_id = 'c704acc45a4bec4c8cd50b73fb01a7c7'
|
30
|
+
|
31
|
+
payment_url = PayEx::CreditCardRedirect.initialize_transaction!
|
32
|
+
order_id: my_order_id,
|
33
|
+
product_number: '123456',
|
34
|
+
product_description: 'Brief product description',
|
35
|
+
price: 14900, # (in cents)
|
36
|
+
customer_ip: '12.34.56.78',
|
37
|
+
return_url: 'http://example.com/payex-return',
|
38
|
+
cancel_url: 'http://example.com/payex-cancel'
|
39
|
+
```
|
40
|
+
|
41
|
+
After redirecting the customer to `payment_url`, they'll enter their
|
42
|
+
payment details and then PayEx will redirect them back to `return_url`
|
43
|
+
with a parameter called `orderRef` appended to the query string.
|
44
|
+
|
45
|
+
The `PayEx::CreditCardRedirect.complete_transaction!` method takes
|
46
|
+
this `orderRef` string as input and returns your order ID as output.
|
47
|
+
|
48
|
+
```ruby
|
49
|
+
order_id, error, raw_response =
|
50
|
+
PayEx.complete_transaction! '9b4031c19960da92d'
|
51
|
+
case error
|
52
|
+
when nil
|
53
|
+
# The transaction succeeded (use `order_id` to proceed).
|
54
|
+
when PayEx::Error::CardDeclined
|
55
|
+
# The transaction was declined by the credit card company.
|
56
|
+
else
|
57
|
+
# The transaction failed (look at `raw_response` for details).
|
58
|
+
end
|
59
|
+
```
|
data/Rakefile
CHANGED
data/lib/payex.rb
CHANGED
@@ -4,82 +4,30 @@ module PayEx
|
|
4
4
|
TEST_URL = 'https://test-external.payex.com'
|
5
5
|
LIVE_URL = 'https://external.payex.com'
|
6
6
|
|
7
|
-
class Error < StandardError; end
|
8
|
-
|
9
|
-
attr_accessor :default_currency
|
10
7
|
attr_accessor :base_url
|
11
8
|
|
9
|
+
self.base_url = PayEx::TEST_URL
|
10
|
+
|
12
11
|
attr_accessor :account_number
|
13
12
|
attr_accessor :encryption_key
|
13
|
+
attr_accessor :default_currency
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
PayEx.default_currency = 'SEK'
|
20
|
-
PayEx.base_url = PayEx::TEST_URL
|
21
|
-
|
22
|
-
require 'payex/api'
|
23
|
-
require 'payex/pxorder'
|
24
|
-
|
25
|
-
def PayEx.account_number!
|
26
|
-
PayEx.account_number or fail 'Please set PayEx.account_number'
|
27
|
-
end
|
28
|
-
|
29
|
-
def PayEx.encryption_key!
|
30
|
-
PayEx.encryption_key or fail 'Please set PayEx.encryption_key'
|
31
|
-
end
|
32
|
-
|
33
|
-
def PayEx.authorize_transaction! order_id, params
|
34
|
-
response = PayEx::PxOrder.Initialize7 \
|
35
|
-
orderID: order_id,
|
36
|
-
purchaseOperation: 'AUTHORIZATION',
|
37
|
-
productNumber: params[:product_number],
|
38
|
-
description: params[:product_description],
|
39
|
-
price: params[:price],
|
40
|
-
clientIPAddress: params[:customer_ip],
|
41
|
-
returnUrl: PayEx.return_url,
|
42
|
-
cancelUrl: PayEx.cancel_url
|
43
|
-
|
44
|
-
response[:redirect_url]
|
45
|
-
end
|
46
|
-
|
47
|
-
def PayEx.complete_transaction! id
|
48
|
-
response = PayEx::PxOrder.Complete(orderRef: id)
|
49
|
-
|
50
|
-
status = response[:transaction_status]
|
51
|
-
status = PayEx.parse_transaction_status(status)
|
52
|
-
error = nil
|
53
|
-
|
54
|
-
case status
|
55
|
-
when :sale, :authorize
|
56
|
-
if response[:already_completed] == 'True'
|
57
|
-
error = 'Transaction already completed'
|
58
|
-
end
|
59
|
-
when :initialize
|
60
|
-
error = 'Transaction not completed'
|
61
|
-
when :failure
|
62
|
-
begin
|
63
|
-
error = response[:error_details][:third_party_error]
|
64
|
-
rescue
|
65
|
-
error = 'Transaction failed'
|
66
|
-
end
|
67
|
-
else
|
68
|
-
error = 'Unexpected transaction status: ' + status.to_s.upcase
|
15
|
+
def account_number!
|
16
|
+
account_number or fail 'Please set PayEx.account_number'
|
69
17
|
end
|
70
18
|
|
71
|
-
|
72
|
-
|
19
|
+
def encryption_key!
|
20
|
+
encryption_key or fail 'Please set PayEx.encryption_key'
|
21
|
+
end
|
73
22
|
|
74
|
-
def
|
75
|
-
|
76
|
-
when '0' then :sale
|
77
|
-
when '1' then :initialize
|
78
|
-
when '2' then :credit
|
79
|
-
when '3' then :authorize
|
80
|
-
when '4' then :cancel
|
81
|
-
when '5' then :failure
|
82
|
-
when '6' then :capture
|
83
|
-
else status.to_s
|
23
|
+
def default_currency!
|
24
|
+
default_currency or fail 'Please set PayEx.default_currency'
|
84
25
|
end
|
85
26
|
end
|
27
|
+
|
28
|
+
class PayEx::Error < StandardError; end
|
29
|
+
class PayEx::Error::CardDeclined < PayEx::Error; end
|
30
|
+
|
31
|
+
require 'payex/api'
|
32
|
+
require 'payex/api/pxorder'
|
33
|
+
require 'payex/credit_card_redirect'
|
data/lib/payex/api.rb
CHANGED
@@ -98,4 +98,17 @@ module PayEx::API
|
|
98
98
|
def param_error! message
|
99
99
|
raise ParamError, message
|
100
100
|
end
|
101
|
+
|
102
|
+
def parse_transaction_status(status)
|
103
|
+
case status.to_s
|
104
|
+
when '0' then :sale
|
105
|
+
when '1' then :initialize
|
106
|
+
when '2' then :credit
|
107
|
+
when '3' then :authorize
|
108
|
+
when '4' then :cancel
|
109
|
+
when '5' then :failure
|
110
|
+
when '6' then :capture
|
111
|
+
else status.to_s
|
112
|
+
end
|
113
|
+
end
|
101
114
|
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module PayEx::CreditCardRedirect
|
2
|
+
extend self
|
3
|
+
|
4
|
+
def initialize_transaction! params
|
5
|
+
response = PayEx::PxOrder.Initialize7 \
|
6
|
+
orderID: params[:order_id],
|
7
|
+
purchaseOperation: 'AUTHORIZATION',
|
8
|
+
productNumber: params[:product_number],
|
9
|
+
description: params[:product_description],
|
10
|
+
price: params[:price],
|
11
|
+
clientIPAddress: params[:customer_ip],
|
12
|
+
returnUrl: params[:return_url],
|
13
|
+
cancelUrl: params[:cancel_url]
|
14
|
+
|
15
|
+
response[:redirect_url]
|
16
|
+
end
|
17
|
+
|
18
|
+
def complete_transaction! id
|
19
|
+
response = PayEx::PxOrder.Complete(orderRef: id)
|
20
|
+
|
21
|
+
status = response[:transaction_status]
|
22
|
+
status = PayEx::API.parse_transaction_status(status)
|
23
|
+
|
24
|
+
case status
|
25
|
+
when :authorize
|
26
|
+
error = nil
|
27
|
+
when :initialize
|
28
|
+
error = PayEx::Error.new('Transaction not completed')
|
29
|
+
when :failure
|
30
|
+
details = response[:error_details].inspect
|
31
|
+
case details
|
32
|
+
when /declined/i
|
33
|
+
error = PayEx::Error::CardDeclined.new('Card declined')
|
34
|
+
else
|
35
|
+
error = PayEx::Error.new('Transaction failed')
|
36
|
+
end
|
37
|
+
else
|
38
|
+
error = PayEx::Error.new('Transaction failed')
|
39
|
+
end
|
40
|
+
|
41
|
+
[response[:order_id], error, response]
|
42
|
+
end
|
43
|
+
end
|
data/payex.gemspec
CHANGED
@@ -2,17 +2,24 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = 'payex'
|
5
|
-
gem.version = '0.
|
5
|
+
gem.version = '0.3'
|
6
6
|
gem.summary = 'PayEx SOAP API glue'
|
7
7
|
gem.author = 'Daniel Brockman'
|
8
8
|
gem.files = `git ls-files 2>/dev/null`.split($\)
|
9
9
|
|
10
|
+
gem.add_dependency 'httpclient', '~> 2.2'
|
10
11
|
gem.add_dependency 'nori', '~> 1.1'
|
11
12
|
gem.add_dependency 'savon', '~> 1.1'
|
12
13
|
|
14
|
+
if RUBY_PLATFORM == 'java'
|
15
|
+
gem.add_dependency 'jruby-openssl', '~> 0.7'
|
16
|
+
end
|
17
|
+
|
13
18
|
gem.add_development_dependency 'guard', '~> 1.3'
|
14
19
|
gem.add_development_dependency 'guard-bundler', '~> 1.0'
|
15
20
|
gem.add_development_dependency 'guard-rspec', '~> 1.2'
|
21
|
+
gem.add_development_dependency 'rake', '~> 0.9'
|
22
|
+
gem.add_development_dependency 'rb-fsevent', '~> 0.9'
|
16
23
|
gem.add_development_dependency 'rspec', '~> 2.11'
|
17
24
|
gem.add_development_dependency 'savon_spec', '~> 1.3'
|
18
25
|
gem.add_development_dependency 'terminal-notifier-guard', '~> 1.5'
|
File without changes
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
require 'payex'
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe PayEx::CreditCardRedirect do
|
6
|
+
SAMPLE_ACCOUNT_NUMBER = 'SAMPLEACCOUNTNUMBER0001'
|
7
|
+
SAMPLE_ENCRYPTION_KEY = 'SAMPLEENCRYPTIONKEY0001'
|
8
|
+
SAMPLE_DEFAULT_CURRENCY = 'SEK'
|
9
|
+
|
10
|
+
before {
|
11
|
+
PayEx.account_number = SAMPLE_ACCOUNT_NUMBER
|
12
|
+
PayEx.encryption_key = SAMPLE_ENCRYPTION_KEY
|
13
|
+
PayEx.default_currency = SAMPLE_DEFAULT_CURRENCY
|
14
|
+
}
|
15
|
+
|
16
|
+
SAMPLE_PRICE_CENTS = 12300
|
17
|
+
SAMPLE_ORDER_ID = 'SAMPLEORDERID0001'
|
18
|
+
SAMPLE_PRODUCT_NUMBER = 'SAMPLEPRODUCTNUMBER0001'
|
19
|
+
SAMPLE_PRODUCT_DESCRIPTION = 'Sample product description 0001'
|
20
|
+
SAMPLE_IP_ADDRESS = '12.34.56.78'
|
21
|
+
SAMPLE_RETURN_URL = 'http://example.com/payex-return'
|
22
|
+
SAMPLE_CANCEL_URL = 'http://example.com/payex-cancel'
|
23
|
+
|
24
|
+
describe :initialize_transaction! do
|
25
|
+
example 'successful initialization' do
|
26
|
+
expected = {
|
27
|
+
'accountNumber' => SAMPLE_ACCOUNT_NUMBER,
|
28
|
+
'purchaseOperation' => 'AUTHORIZATION',
|
29
|
+
'price' => SAMPLE_PRICE_CENTS,
|
30
|
+
'priceArgList' => '',
|
31
|
+
'currency' => SAMPLE_DEFAULT_CURRENCY,
|
32
|
+
'vat' => 0,
|
33
|
+
'orderID' => SAMPLE_ORDER_ID,
|
34
|
+
'productNumber' => SAMPLE_PRODUCT_NUMBER,
|
35
|
+
'description' => SAMPLE_PRODUCT_DESCRIPTION,
|
36
|
+
'clientIPAddress' => SAMPLE_IP_ADDRESS,
|
37
|
+
'clientIdentifier' => '',
|
38
|
+
'additionalValues' => '',
|
39
|
+
'externalID' => '',
|
40
|
+
'returnUrl' => SAMPLE_RETURN_URL,
|
41
|
+
'view' => 'CREDITCARD',
|
42
|
+
'agreementRef' => '',
|
43
|
+
'cancelUrl' => SAMPLE_CANCEL_URL,
|
44
|
+
'clientLanguage' => ''
|
45
|
+
}
|
46
|
+
|
47
|
+
expected['hash'] = PayEx::API.signed_hash(expected.values.join)
|
48
|
+
savon.expects('Initialize7').with(expected).returns(:initialize_ok)
|
49
|
+
|
50
|
+
href = PayEx::CreditCardRedirect.initialize_transaction! \
|
51
|
+
order_id: SAMPLE_ORDER_ID,
|
52
|
+
product_number: SAMPLE_PRODUCT_NUMBER,
|
53
|
+
product_description: SAMPLE_PRODUCT_DESCRIPTION,
|
54
|
+
price: SAMPLE_PRICE_CENTS,
|
55
|
+
customer_ip: SAMPLE_IP_ADDRESS,
|
56
|
+
return_url: SAMPLE_RETURN_URL,
|
57
|
+
cancel_url: SAMPLE_CANCEL_URL
|
58
|
+
|
59
|
+
href.should include 'http'
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
SAMPLE_ORDER_REF = 'SAMPLEORDERREF0001'
|
64
|
+
|
65
|
+
describe :complete_transaction! do
|
66
|
+
def invoke_complete! response_fixture
|
67
|
+
expected = {
|
68
|
+
'accountNumber' => SAMPLE_ACCOUNT_NUMBER,
|
69
|
+
'orderRef' => SAMPLE_ORDER_REF
|
70
|
+
}
|
71
|
+
|
72
|
+
expected['hash'] = PayEx::API.signed_hash(expected.values.join)
|
73
|
+
savon.expects('Complete').with(expected).returns(response_fixture)
|
74
|
+
PayEx::CreditCardRedirect.complete_transaction! SAMPLE_ORDER_REF
|
75
|
+
end
|
76
|
+
|
77
|
+
example 'successful completion' do
|
78
|
+
order_id, error, data = invoke_complete! :complete_ok
|
79
|
+
order_id.should == SAMPLE_ORDER_ID
|
80
|
+
error.should == nil
|
81
|
+
end
|
82
|
+
|
83
|
+
example 'unexpected failure' do
|
84
|
+
order_id, error, data = invoke_complete! :complete_failed
|
85
|
+
order_id.should == SAMPLE_ORDER_ID
|
86
|
+
error.should be_a PayEx::Error
|
87
|
+
end
|
88
|
+
|
89
|
+
example 'card declined' do
|
90
|
+
order_id, error, data = invoke_complete! :complete_declined
|
91
|
+
order_id.should == SAMPLE_ORDER_ID
|
92
|
+
error.should be_a PayEx::Error
|
93
|
+
error.should be_a PayEx::Error::CardDeclined
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
5
|
+
<soap:Body>
|
6
|
+
<CompleteResponse xmlns="http://external.payex.com/PxOrder/">
|
7
|
+
<CompleteResult>
|
8
|
+
<![CDATA[
|
9
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
10
|
+
<payex>
|
11
|
+
<header name="Payex Header v1.0">
|
12
|
+
<id>dd473e0a40f54596b6db441b34bf54d9</id>
|
13
|
+
<date>2012-09-26 14:08:09</date>
|
14
|
+
</header>
|
15
|
+
<status>
|
16
|
+
<code>OK</code>
|
17
|
+
<description>OK</description>
|
18
|
+
<errorCode>OK</errorCode>
|
19
|
+
<paramName />
|
20
|
+
<thirdPartyError />
|
21
|
+
</status>
|
22
|
+
<transactionStatus>5</transactionStatus>
|
23
|
+
<orderStatus>0</orderStatus>
|
24
|
+
<transactionRef>6d0b1a8e7ab2480583b32f52dba782fe</transactionRef>
|
25
|
+
<transactionNumber>1024377</transactionNumber>
|
26
|
+
<orderId>SAMPLEORDERID0001</orderId>
|
27
|
+
<productId>SAMPLEPRODUCTNUMBER0001</productId>
|
28
|
+
<paymentMethod>VISA</paymentMethod>
|
29
|
+
<amount>12300</amount>
|
30
|
+
<alreadyCompleted>False</alreadyCompleted>
|
31
|
+
<Csid>00000001-4581-0903-5682-000000000000</Csid>
|
32
|
+
<errorDetails>
|
33
|
+
<transactionErrorCode>CardNotAcceptedForThisPurchase</transactionErrorCode>
|
34
|
+
<transactionErrorDescription>Accomplish3rdParty</transactionErrorDescription>
|
35
|
+
<transactionThirdPartyError>CARD_DECLINED</transactionThirdPartyError>
|
36
|
+
</errorDetails>
|
37
|
+
<clientAccount>0</clientAccount>
|
38
|
+
<productNumber>SAMPLEPRODUCTNUMBER0001</productNumber>
|
39
|
+
<clientGsmNumber />
|
40
|
+
<transactionFailedReason />
|
41
|
+
<BankHash>00000001-4581-0903-5682-000000000000</BankHash>
|
42
|
+
<AuthenticatedWith>N</AuthenticatedWith>
|
43
|
+
<AuthenticatedStatus />
|
44
|
+
<maskedNumber>45**********5682</maskedNumber>
|
45
|
+
<fraudData>false</fraudData>
|
46
|
+
<pending>false</pending>
|
47
|
+
</payex>
|
48
|
+
]]>
|
49
|
+
</CompleteResult>
|
50
|
+
</CompleteResponse>
|
51
|
+
</soap:Body>
|
52
|
+
</soap:Envelope>
|
@@ -0,0 +1,52 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
5
|
+
<soap:Body>
|
6
|
+
<CompleteResponse xmlns="http://external.payex.com/PxOrder/">
|
7
|
+
<CompleteResult>
|
8
|
+
<![CDATA[
|
9
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
10
|
+
<payex>
|
11
|
+
<header name="Payex Header v1.0">
|
12
|
+
<id>dd473e0a40f54596b6db441b34bf54d9</id>
|
13
|
+
<date>2012-09-26 14:08:09</date>
|
14
|
+
</header>
|
15
|
+
<status>
|
16
|
+
<code>OK</code>
|
17
|
+
<description>OK</description>
|
18
|
+
<errorCode>OK</errorCode>
|
19
|
+
<paramName />
|
20
|
+
<thirdPartyError />
|
21
|
+
</status>
|
22
|
+
<transactionStatus>5</transactionStatus>
|
23
|
+
<orderStatus>0</orderStatus>
|
24
|
+
<transactionRef>6d0b1a8e7ab2480583b32f52dba782fe</transactionRef>
|
25
|
+
<transactionNumber>1024377</transactionNumber>
|
26
|
+
<orderId>SAMPLEORDERID0001</orderId>
|
27
|
+
<productId>SAMPLEPRODUCTNUMBER0001</productId>
|
28
|
+
<paymentMethod>VISA</paymentMethod>
|
29
|
+
<amount>12300</amount>
|
30
|
+
<alreadyCompleted>False</alreadyCompleted>
|
31
|
+
<Csid>00000001-4581-0903-5682-000000000000</Csid>
|
32
|
+
<errorDetails>
|
33
|
+
<transactionErrorCode>Error_Generic</transactionErrorCode>
|
34
|
+
<transactionErrorDescription>Accomplish3rdParty</transactionErrorDescription>
|
35
|
+
<transactionThirdPartyError>9098</transactionThirdPartyError>
|
36
|
+
</errorDetails>
|
37
|
+
<clientAccount>0</clientAccount>
|
38
|
+
<productNumber>SAMPLEPRODUCTNUMBER0001</productNumber>
|
39
|
+
<clientGsmNumber />
|
40
|
+
<transactionFailedReason />
|
41
|
+
<BankHash>00000001-4581-0903-5682-000000000000</BankHash>
|
42
|
+
<AuthenticatedWith>N</AuthenticatedWith>
|
43
|
+
<AuthenticatedStatus />
|
44
|
+
<maskedNumber>45**********5682</maskedNumber>
|
45
|
+
<fraudData>false</fraudData>
|
46
|
+
<pending>false</pending>
|
47
|
+
</payex>
|
48
|
+
]]>
|
49
|
+
</CompleteResult>
|
50
|
+
</CompleteResponse>
|
51
|
+
</soap:Body>
|
52
|
+
</soap:Envelope>
|
@@ -0,0 +1,46 @@
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
2
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
5
|
+
<soap:Body>
|
6
|
+
<CompleteResponse xmlns="http://external.payex.com/PxOrder/">
|
7
|
+
<CompleteResult>
|
8
|
+
<![CDATA[
|
9
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
10
|
+
<payex>
|
11
|
+
<header name="Payex Header v1.0">
|
12
|
+
<id>dd473e0a40f54596b6db441b34bf54d9</id>
|
13
|
+
<date>2012-09-26 14:08:09</date>
|
14
|
+
</header>
|
15
|
+
<status>
|
16
|
+
<code>OK</code>
|
17
|
+
<description>OK</description>
|
18
|
+
<errorCode>OK</errorCode>
|
19
|
+
<paramName />
|
20
|
+
<thirdPartyError />
|
21
|
+
</status>
|
22
|
+
<transactionStatus>3</transactionStatus>
|
23
|
+
<orderStatus>0</orderStatus>
|
24
|
+
<transactionRef>6d0b1a8e7ab2480583b32f52dba782fe</transactionRef>
|
25
|
+
<transactionNumber>1024377</transactionNumber>
|
26
|
+
<orderId>SAMPLEORDERID0001</orderId>
|
27
|
+
<productId>SAMPLEPRODUCTNUMBER0001</productId>
|
28
|
+
<paymentMethod>VISA</paymentMethod>
|
29
|
+
<amount>12300</amount>
|
30
|
+
<alreadyCompleted>False</alreadyCompleted>
|
31
|
+
<Csid>00000001-4581-0903-5682-000000000000</Csid>
|
32
|
+
<clientAccount>0</clientAccount>
|
33
|
+
<productNumber>SAMPLEPRODUCTNUMBER0001</productNumber>
|
34
|
+
<clientGsmNumber />
|
35
|
+
<BankHash>00000001-4581-0903-5682-000000000000</BankHash>
|
36
|
+
<AuthenticatedWith>Y</AuthenticatedWith>
|
37
|
+
<AuthenticatedStatus>3DSecure</AuthenticatedStatus>
|
38
|
+
<maskedNumber>45**********5682</maskedNumber>
|
39
|
+
<fraudData>false</fraudData>
|
40
|
+
<pending>false</pending>
|
41
|
+
</payex>
|
42
|
+
]]>
|
43
|
+
</CompleteResult>
|
44
|
+
</CompleteResponse>
|
45
|
+
</soap:Body>
|
46
|
+
</soap:Envelope>
|
@@ -1,30 +1,30 @@
|
|
1
1
|
<?xml version="1.0" encoding="utf-8"?>
|
2
|
-
<
|
3
|
-
|
4
|
-
|
5
|
-
<
|
2
|
+
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
4
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
|
5
|
+
<soap:Body>
|
6
6
|
<Initialize7Response xmlns="http://external.payex.com/PxOrder/">
|
7
7
|
<Initialize7Result>
|
8
8
|
<![CDATA[
|
9
|
-
<?xml version="1.0" encoding="utf-8"?>
|
9
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
10
10
|
<payex>
|
11
11
|
<header name="Payex Header v1.0">
|
12
|
-
<id>
|
13
|
-
<date>
|
12
|
+
<id>07507411082c45aaa8a58f961a47b0f8</id>
|
13
|
+
<date>2012-09-26 14:07:42</date>
|
14
14
|
</header>
|
15
15
|
<status>
|
16
16
|
<code>OK</code>
|
17
17
|
<description>OK</description>
|
18
18
|
<errorCode>OK</errorCode>
|
19
|
-
<paramName/>
|
20
|
-
<thirdPartyError/>
|
19
|
+
<paramName />
|
20
|
+
<thirdPartyError />
|
21
21
|
</status>
|
22
|
-
<orderRef>
|
23
|
-
<sessionRef>
|
24
|
-
<redirectUrl>https://test-confined.payex.com/PxOrderCC.aspx?orderRef=
|
22
|
+
<orderRef>67d7e7d3b4134741a3297480dca6d899</orderRef>
|
23
|
+
<sessionRef>d22235c662eb45bfa524a1319903a434</sessionRef>
|
24
|
+
<redirectUrl>https://test-confined.payex.com/PxOrderCC.aspx?orderRef=67d7e7d3b4134741a3297480dca6d899</redirectUrl>
|
25
25
|
</payex>
|
26
26
|
]]>
|
27
27
|
</Initialize7Result>
|
28
28
|
</Initialize7Response>
|
29
|
-
</
|
30
|
-
</
|
29
|
+
</soap:Body>
|
30
|
+
</soap:Envelope>
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,20 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: payex
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: '0.3'
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Daniel Brockman
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-05-06 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: httpclient
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.2'
|
14
27
|
- !ruby/object:Gem::Dependency
|
15
28
|
name: nori
|
16
29
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
30
|
requirements:
|
19
31
|
- - ~>
|
20
32
|
- !ruby/object:Gem::Version
|
@@ -22,7 +34,6 @@ dependencies:
|
|
22
34
|
type: :runtime
|
23
35
|
prerelease: false
|
24
36
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
37
|
requirements:
|
27
38
|
- - ~>
|
28
39
|
- !ruby/object:Gem::Version
|
@@ -30,7 +41,6 @@ dependencies:
|
|
30
41
|
- !ruby/object:Gem::Dependency
|
31
42
|
name: savon
|
32
43
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
44
|
requirements:
|
35
45
|
- - ~>
|
36
46
|
- !ruby/object:Gem::Version
|
@@ -38,7 +48,6 @@ dependencies:
|
|
38
48
|
type: :runtime
|
39
49
|
prerelease: false
|
40
50
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
51
|
requirements:
|
43
52
|
- - ~>
|
44
53
|
- !ruby/object:Gem::Version
|
@@ -46,7 +55,6 @@ dependencies:
|
|
46
55
|
- !ruby/object:Gem::Dependency
|
47
56
|
name: guard
|
48
57
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
58
|
requirements:
|
51
59
|
- - ~>
|
52
60
|
- !ruby/object:Gem::Version
|
@@ -54,7 +62,6 @@ dependencies:
|
|
54
62
|
type: :development
|
55
63
|
prerelease: false
|
56
64
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
65
|
requirements:
|
59
66
|
- - ~>
|
60
67
|
- !ruby/object:Gem::Version
|
@@ -62,7 +69,6 @@ dependencies:
|
|
62
69
|
- !ruby/object:Gem::Dependency
|
63
70
|
name: guard-bundler
|
64
71
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
72
|
requirements:
|
67
73
|
- - ~>
|
68
74
|
- !ruby/object:Gem::Version
|
@@ -70,7 +76,6 @@ dependencies:
|
|
70
76
|
type: :development
|
71
77
|
prerelease: false
|
72
78
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
79
|
requirements:
|
75
80
|
- - ~>
|
76
81
|
- !ruby/object:Gem::Version
|
@@ -78,7 +83,6 @@ dependencies:
|
|
78
83
|
- !ruby/object:Gem::Dependency
|
79
84
|
name: guard-rspec
|
80
85
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
86
|
requirements:
|
83
87
|
- - ~>
|
84
88
|
- !ruby/object:Gem::Version
|
@@ -86,15 +90,41 @@ dependencies:
|
|
86
90
|
type: :development
|
87
91
|
prerelease: false
|
88
92
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
93
|
requirements:
|
91
94
|
- - ~>
|
92
95
|
- !ruby/object:Gem::Version
|
93
96
|
version: '1.2'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rake
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ~>
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0.9'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ~>
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0.9'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rb-fsevent
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0.9'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ~>
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0.9'
|
94
125
|
- !ruby/object:Gem::Dependency
|
95
126
|
name: rspec
|
96
127
|
requirement: !ruby/object:Gem::Requirement
|
97
|
-
none: false
|
98
128
|
requirements:
|
99
129
|
- - ~>
|
100
130
|
- !ruby/object:Gem::Version
|
@@ -102,7 +132,6 @@ dependencies:
|
|
102
132
|
type: :development
|
103
133
|
prerelease: false
|
104
134
|
version_requirements: !ruby/object:Gem::Requirement
|
105
|
-
none: false
|
106
135
|
requirements:
|
107
136
|
- - ~>
|
108
137
|
- !ruby/object:Gem::Version
|
@@ -110,7 +139,6 @@ dependencies:
|
|
110
139
|
- !ruby/object:Gem::Dependency
|
111
140
|
name: savon_spec
|
112
141
|
requirement: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
142
|
requirements:
|
115
143
|
- - ~>
|
116
144
|
- !ruby/object:Gem::Version
|
@@ -118,7 +146,6 @@ dependencies:
|
|
118
146
|
type: :development
|
119
147
|
prerelease: false
|
120
148
|
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
149
|
requirements:
|
123
150
|
- - ~>
|
124
151
|
- !ruby/object:Gem::Version
|
@@ -126,7 +153,6 @@ dependencies:
|
|
126
153
|
- !ruby/object:Gem::Dependency
|
127
154
|
name: terminal-notifier-guard
|
128
155
|
requirement: !ruby/object:Gem::Requirement
|
129
|
-
none: false
|
130
156
|
requirements:
|
131
157
|
- - ~>
|
132
158
|
- !ruby/object:Gem::Version
|
@@ -134,7 +160,6 @@ dependencies:
|
|
134
160
|
type: :development
|
135
161
|
prerelease: false
|
136
162
|
version_requirements: !ruby/object:Gem::Requirement
|
137
|
-
none: false
|
138
163
|
requirements:
|
139
164
|
- - ~>
|
140
165
|
- !ruby/object:Gem::Version
|
@@ -146,41 +171,45 @@ extensions: []
|
|
146
171
|
extra_rdoc_files: []
|
147
172
|
files:
|
148
173
|
- .gitignore
|
174
|
+
- .travis.yml
|
149
175
|
- Gemfile
|
150
176
|
- Gemfile.lock
|
151
177
|
- Guardfile
|
152
|
-
- README
|
178
|
+
- README.md
|
153
179
|
- Rakefile
|
154
180
|
- lib/payex.rb
|
155
181
|
- lib/payex/api.rb
|
156
|
-
- lib/payex/pxorder.rb
|
182
|
+
- lib/payex/api/pxorder.rb
|
183
|
+
- lib/payex/credit_card_redirect.rb
|
157
184
|
- payex.gemspec
|
158
|
-
- spec/
|
185
|
+
- spec/api_spec.rb
|
186
|
+
- spec/credit_card_redirect_spec.rb
|
187
|
+
- spec/fixtures/complete/complete_declined.xml
|
188
|
+
- spec/fixtures/complete/complete_failed.xml
|
189
|
+
- spec/fixtures/complete/complete_ok.xml
|
159
190
|
- spec/fixtures/initialize7/initialize_ok.xml
|
160
|
-
- spec/integration_spec.rb
|
161
191
|
- spec/spec_helper.rb
|
162
192
|
homepage:
|
163
193
|
licenses: []
|
194
|
+
metadata: {}
|
164
195
|
post_install_message:
|
165
196
|
rdoc_options: []
|
166
197
|
require_paths:
|
167
198
|
- lib
|
168
199
|
required_ruby_version: !ruby/object:Gem::Requirement
|
169
|
-
none: false
|
170
200
|
requirements:
|
171
|
-
- -
|
201
|
+
- - '>='
|
172
202
|
- !ruby/object:Gem::Version
|
173
203
|
version: '0'
|
174
204
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
175
|
-
none: false
|
176
205
|
requirements:
|
177
|
-
- -
|
206
|
+
- - '>='
|
178
207
|
- !ruby/object:Gem::Version
|
179
208
|
version: '0'
|
180
209
|
requirements: []
|
181
210
|
rubyforge_project:
|
182
|
-
rubygems_version:
|
211
|
+
rubygems_version: 2.0.14
|
183
212
|
signing_key:
|
184
|
-
specification_version:
|
213
|
+
specification_version: 4
|
185
214
|
summary: PayEx SOAP API glue
|
186
215
|
test_files: []
|
data/README
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
# -*- ruby -*-
|
2
|
-
require 'payex'
|
3
|
-
|
4
|
-
# This is how a basic PayEx transaction works:
|
5
|
-
|
6
|
-
PayEx.account_number = 123456789
|
7
|
-
PayEx.encryption_key = 'e4939be3910ebu194'
|
8
|
-
|
9
|
-
PayEx.return_url = 'http://example.com/payex-return'
|
10
|
-
PayEx.cancel_url = 'http://example.com/payex-cancel'
|
11
|
-
|
12
|
-
local_order_id = 'c704acc45a4bec4c8cd50b73fb01a7c7'
|
13
|
-
|
14
|
-
payment_url = PayEx.authorize_transaction! local_order_id,
|
15
|
-
product_number: '123456',
|
16
|
-
product_description: 'Brief product description',
|
17
|
-
price: 14900, # Price in cents
|
18
|
-
customer_ip: '12.34.56.78'
|
19
|
-
|
20
|
-
# After sending the customer to `payment_url`, they will enter their
|
21
|
-
# payment details before being redirected back to `PayEx.return_url`
|
22
|
-
# with an `orderRef` parameter appended to the query string:
|
23
|
-
#
|
24
|
-
# <http://example.com/payex-return?orderRef=9b4031c19960da92d>
|
25
|
-
#
|
26
|
-
# By giving the `orderRef` value to `PayEx.complete_transaction!` you
|
27
|
-
# retreive your local order ID and your app can proceed from there.
|
28
|
-
|
29
|
-
begin
|
30
|
-
local_order_id = PayEx.complete_transaction! '9b4031c19960da92d'
|
31
|
-
# [transaction successful]
|
32
|
-
rescue PayEx::Error => error
|
33
|
-
# [transaction unsucessful]
|
34
|
-
end
|
data/spec/integration_spec.rb
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'payex'
|
3
|
-
require 'spec_helper'
|
4
|
-
|
5
|
-
describe PayEx do
|
6
|
-
before {
|
7
|
-
PayEx.account_number = 'foo-account'
|
8
|
-
PayEx.encryption_key = 'foo-secret'
|
9
|
-
PayEx.return_url = 'http://example.com/payex-callback'
|
10
|
-
}
|
11
|
-
|
12
|
-
it 'should send request and parse response' do
|
13
|
-
expected = {
|
14
|
-
'accountNumber' => 'foo-account',
|
15
|
-
'purchaseOperation' => 'AUTHORIZATION',
|
16
|
-
'price' => 12300,
|
17
|
-
'priceArgList' => '',
|
18
|
-
'currency' => 'SEK',
|
19
|
-
'vat' => 0,
|
20
|
-
'orderID' => 'order123',
|
21
|
-
'productNumber' => 'PRODUCT123',
|
22
|
-
'description' => 'Product description',
|
23
|
-
'clientIPAddress' => '12.34.56.78',
|
24
|
-
'clientIdentifier' => '',
|
25
|
-
'additionalValues' => '',
|
26
|
-
'externalID' => '',
|
27
|
-
'returnUrl' => 'http://example.com/payex-callback',
|
28
|
-
'view' => 'CREDITCARD',
|
29
|
-
'agreementRef' => '',
|
30
|
-
'cancelUrl' => '',
|
31
|
-
'clientLanguage' => ''
|
32
|
-
}
|
33
|
-
|
34
|
-
expected['hash'] = PayEx::API.signed_hash(expected.values.join)
|
35
|
-
savon.expects('Initialize7').with(expected).returns(:initialize_ok)
|
36
|
-
|
37
|
-
href = PayEx.authorize_transaction! 'order123',
|
38
|
-
product_number: 'PRODUCT123',
|
39
|
-
product_description: 'Product description',
|
40
|
-
price: 12300,
|
41
|
-
customer_ip: '12.34.56.78'
|
42
|
-
|
43
|
-
href.should include 'http'
|
44
|
-
end
|
45
|
-
end
|