active_merchant_first_data 1.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.
- data/LICENSE +20 -0
- data/README.md +53 -0
- data/lib/active_merchant/billing/first_data_gateway.rb +171 -0
- data/lib/active_merchant_first_data.rb +1 -0
- metadata +106 -0
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2011 Edgars Beigarts
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
First Data gateway for Active Merchant
|
2
|
+
======================================
|
3
|
+
|
4
|
+
[](http://travis-ci.org/ebeigarts/active_merchant_first_data)
|
5
|
+
|
6
|
+
## Install
|
7
|
+
|
8
|
+
```bash
|
9
|
+
$ gem install active_merchant_first_data
|
10
|
+
```
|
11
|
+
|
12
|
+
## Usage
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
require "active_merchant_first_data"
|
16
|
+
@gateway = ActiveMerchant::Billing::FirstDataGateway.new(
|
17
|
+
:pem => "1234567_keystore.pem"
|
18
|
+
:pem_password => "5x64jq8n234c"
|
19
|
+
)
|
20
|
+
```
|
21
|
+
|
22
|
+
## First Data test environment setup
|
23
|
+
|
24
|
+
1. Generate a new certificate
|
25
|
+
|
26
|
+
```bash
|
27
|
+
$ openssl req -newkey rsa:1024 -keyout spec/certs/1234567_key.pem -out spec/certs/1234567_req.pem -subj "/C=lv/O=example.com/CN=1234567" -outform PEM
|
28
|
+
Enter PEM pass phrase: 81f174259v45
|
29
|
+
```
|
30
|
+
|
31
|
+
2. [Request your certificate using `1234567_req.pem`](https://secureshop-test.firstdata.lv/report/keystore_.do)
|
32
|
+
|
33
|
+
3. Copy the 3 files you received in e-mail to `spec/certs/`:
|
34
|
+
|
35
|
+
* 1234567.pem
|
36
|
+
* 1234567_certificate_chain.p7.pem
|
37
|
+
* ECOMM.pem
|
38
|
+
|
39
|
+
4. Convert the certificates and keys to `1234567_keystore.pem`
|
40
|
+
|
41
|
+
```bash
|
42
|
+
$ openssl pkcs12 -export -in 1234567.pem -out spec/certs/1234567_keystore.p12 -certfile spec/certs/ECOMM.pem -inkey spec/certs/1234567_key.pem
|
43
|
+
Enter pass phrase for 1234567_key.pem: 81f174259v45
|
44
|
+
Enter Export Password: <empty>
|
45
|
+
```
|
46
|
+
|
47
|
+
```bash
|
48
|
+
$ openssl pkcs12 -in spec/certs/1234567_keystore.p12 > spec/certs/1234567_keystore.pem
|
49
|
+
Enter Import Password: <empty>
|
50
|
+
Enter PEM pass phrase: 5x64jq8n234c
|
51
|
+
```
|
52
|
+
|
53
|
+
5. [Set your WAN IP address](https://secureshop-test.firstdata.lv/report/merchantlist.do)
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require "active_merchant"
|
2
|
+
|
3
|
+
module ActiveMerchant #:nodoc:
|
4
|
+
module Billing #:nodoc:
|
5
|
+
class FirstDataGateway < Gateway
|
6
|
+
class_attribute :test_url, :live_url, :test_redirect_url, :live_redirect_url, :pem_file, :pem_password
|
7
|
+
|
8
|
+
self.test_redirect_url = 'https://secureshop-test.firstdata.lv/ecomm/ClientHandler'
|
9
|
+
self.live_redirect_url = 'https://secureshop.firstdata.lv/ecomm/ClientHandler'
|
10
|
+
|
11
|
+
self.test_url = 'https://secureshop-test.firstdata.lv:8443/ecomm/MerchantHandler'
|
12
|
+
self.live_url = 'https://secureshop.firstdata.lv:8443/ecomm/MerchantHandler'
|
13
|
+
|
14
|
+
self.homepage_url = 'http://www.firstdata.lv/'
|
15
|
+
self.display_name = 'First Data'
|
16
|
+
|
17
|
+
self.ssl_strict = false
|
18
|
+
self.default_currency = '428' # LVL (http://en.wikipedia.org/wiki/ISO_4217)
|
19
|
+
self.money_format = :cents
|
20
|
+
|
21
|
+
# Creates a new FirstDataGateway
|
22
|
+
#
|
23
|
+
# The gateway requires that a valid pem and password be passed
|
24
|
+
# in the +options+ hash.
|
25
|
+
#
|
26
|
+
# Options:
|
27
|
+
#
|
28
|
+
# * <tt>:pem</tt> -- The First Data cert/key (REQUIRED)
|
29
|
+
# * <tt>:pem_password</tt> -- The First Data password. (REQUIRED)
|
30
|
+
#
|
31
|
+
def initialize(options = {})
|
32
|
+
requires!(options, :pem, :pem_password)
|
33
|
+
@options = options
|
34
|
+
super
|
35
|
+
end
|
36
|
+
|
37
|
+
# Perform a purchase, which is essentially an authorization and capture in a single operation.
|
38
|
+
#
|
39
|
+
# Registering of SMS transaction
|
40
|
+
# @param int $amount transaction amount in minor units, mandatory
|
41
|
+
# @param int $currency transaction currency code, mandatory
|
42
|
+
# @param string $ip clientís IP address, mandatory
|
43
|
+
# @param string $desc description of transaction, optional
|
44
|
+
# @param string $language authorization language identificator, optional
|
45
|
+
# @return string TRANSACTION_ID
|
46
|
+
#
|
47
|
+
def purchase(amount, params = {})
|
48
|
+
params = params.reverse_merge(
|
49
|
+
:command => :v,
|
50
|
+
:amount => amount,
|
51
|
+
:currency => default_currency
|
52
|
+
)
|
53
|
+
requires!(params, :amount, :currency, :client_ip_addr)
|
54
|
+
commit(params)
|
55
|
+
end
|
56
|
+
|
57
|
+
# Performs an authorization, which reserves the funds on the customer's credit card, but does not
|
58
|
+
# charge the card.
|
59
|
+
#
|
60
|
+
# Registering of DMS authorisation
|
61
|
+
# @param int $amount transaction amount in minor units, mandatory
|
62
|
+
# @param int $currency transaction currency code, mandatory
|
63
|
+
# @param string $ip clientís IP address, mandatory
|
64
|
+
# @param string $desc description of transaction, optional
|
65
|
+
# @param string $language authorization language identificator, optional
|
66
|
+
# @return string TRANSACTION_ID
|
67
|
+
#
|
68
|
+
def authorize(amount, params = {})
|
69
|
+
params = params.reverse_merge(
|
70
|
+
:command => :a,
|
71
|
+
:msg_type => 'DMS',
|
72
|
+
:amount => amount,
|
73
|
+
:currency => default_currency
|
74
|
+
)
|
75
|
+
requires!(params, :amount, :currency, :client_ip_addr, :msg_type)
|
76
|
+
commit(params)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Captures the funds from an authorized transaction.
|
80
|
+
#
|
81
|
+
# Making of DMS transaction
|
82
|
+
# @param int $auth_id id of previously made successeful authorisation
|
83
|
+
# @param int $amount transaction amount in minor units, mandatory
|
84
|
+
# @param int $currency transaction currency code, mandatory
|
85
|
+
# @param string $ip clientís IP address, mandatory
|
86
|
+
# @param string $desc description of transaction, optional
|
87
|
+
# @return string RESULT, RESULT_CODE, RRN, APPROVAL_CODE
|
88
|
+
#
|
89
|
+
def capture(amount, trans_id, params = {})
|
90
|
+
params = params.reverse_merge(
|
91
|
+
:command => :t,
|
92
|
+
:msg_type => 'DMS',
|
93
|
+
:trans_id => trans_id,
|
94
|
+
:amount => amount,
|
95
|
+
:currency => default_currency
|
96
|
+
)
|
97
|
+
requires!(params, :trans_id, :amount, :currency, :client_ip_addr)
|
98
|
+
commit(params)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Transaction result
|
102
|
+
#
|
103
|
+
# @param int $trans_id transaction identifier, mandatory
|
104
|
+
# @param string $ip clientís IP address, mandatory
|
105
|
+
# @return string RESULT, RESULT_CODE, 3DSECURE, AAV, RRN, APPROVAL_CODE
|
106
|
+
#
|
107
|
+
def result(trans_id, params = {})
|
108
|
+
params = params.reverse_merge(
|
109
|
+
:command => :c,
|
110
|
+
:trans_id => trans_id
|
111
|
+
)
|
112
|
+
requires!(params, :trans_id, :client_ip_addr)
|
113
|
+
commit(params)
|
114
|
+
end
|
115
|
+
|
116
|
+
# credit() allows you to return money to a card that was previously billed.
|
117
|
+
#
|
118
|
+
# Transaction reversal
|
119
|
+
# @param int $trans_id transaction identifier, mandatory
|
120
|
+
# @param int $amount transaction amount in minor units, mandatory
|
121
|
+
# @return string RESULT, RESULT_CODE
|
122
|
+
#
|
123
|
+
def credit(amount, trans_id = nil)
|
124
|
+
params = {
|
125
|
+
:command => :r,
|
126
|
+
:trans_id => trans_id,
|
127
|
+
:amount => amount
|
128
|
+
}
|
129
|
+
requires!(params, :command, :trans_id, :amount)
|
130
|
+
commit(params)
|
131
|
+
end
|
132
|
+
|
133
|
+
# Close business day.
|
134
|
+
def close_day
|
135
|
+
commit({ :command => :b })
|
136
|
+
end
|
137
|
+
|
138
|
+
def endpoint_url
|
139
|
+
test? ? test_url : live_url
|
140
|
+
end
|
141
|
+
|
142
|
+
def redirect_url
|
143
|
+
test? ? test_redirect_url : live_redirect_url
|
144
|
+
end
|
145
|
+
|
146
|
+
private
|
147
|
+
|
148
|
+
# Convert HTTP response body to a Ruby Hash.
|
149
|
+
def parse(body)
|
150
|
+
results = ActiveSupport::HashWithIndifferentAccess.new
|
151
|
+
body.split(/[\r\n]+/).each do |pair|
|
152
|
+
key, val = pair.split(": ")
|
153
|
+
results[key.downcase] = val
|
154
|
+
end
|
155
|
+
results
|
156
|
+
end
|
157
|
+
|
158
|
+
def commit(params = {})
|
159
|
+
response = parse(ssl_post(endpoint_url, post_data(params)))
|
160
|
+
raise response[:error] unless response[:error].blank?
|
161
|
+
response
|
162
|
+
end
|
163
|
+
|
164
|
+
def post_data(params)
|
165
|
+
post = PostData.new
|
166
|
+
params.each { |k, v| post[k] = v }
|
167
|
+
post.to_s
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require "active_merchant/billing/first_data_gateway"
|
metadata
ADDED
@@ -0,0 +1,106 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: active_merchant_first_data
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Edgars Beigarts
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-07-08 00:00:00.000000000 +03:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: activemerchant
|
17
|
+
requirement: &2152366380 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ! '>='
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 1.15.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *2152366380
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: rake
|
28
|
+
requirement: &2152366000 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *2152366000
|
37
|
+
- !ruby/object:Gem::Dependency
|
38
|
+
name: rspec
|
39
|
+
requirement: &2152365440 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
version: 2.6.0
|
45
|
+
type: :development
|
46
|
+
prerelease: false
|
47
|
+
version_requirements: *2152365440
|
48
|
+
- !ruby/object:Gem::Dependency
|
49
|
+
name: vcr
|
50
|
+
requirement: &2152365020 !ruby/object:Gem::Requirement
|
51
|
+
none: false
|
52
|
+
requirements:
|
53
|
+
- - ! '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
type: :development
|
57
|
+
prerelease: false
|
58
|
+
version_requirements: *2152365020
|
59
|
+
- !ruby/object:Gem::Dependency
|
60
|
+
name: fakeweb
|
61
|
+
requirement: &2152364560 !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
type: :development
|
68
|
+
prerelease: false
|
69
|
+
version_requirements: *2152364560
|
70
|
+
description: First Data gateway for Active Merchant
|
71
|
+
email:
|
72
|
+
- edgars.beigarts@makit.lv
|
73
|
+
executables: []
|
74
|
+
extensions: []
|
75
|
+
extra_rdoc_files: []
|
76
|
+
files:
|
77
|
+
- lib/active_merchant/billing/first_data_gateway.rb
|
78
|
+
- lib/active_merchant_first_data.rb
|
79
|
+
- README.md
|
80
|
+
- LICENSE
|
81
|
+
has_rdoc: true
|
82
|
+
homepage: https://github.com/ebeigarts/active_merchant_first_data
|
83
|
+
licenses: []
|
84
|
+
post_install_message:
|
85
|
+
rdoc_options: []
|
86
|
+
require_paths:
|
87
|
+
- lib
|
88
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
95
|
+
none: false
|
96
|
+
requirements:
|
97
|
+
- - ! '>='
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubyforge_project:
|
102
|
+
rubygems_version: 1.6.2
|
103
|
+
signing_key:
|
104
|
+
specification_version: 3
|
105
|
+
summary: First Data gateway for Active Merchant
|
106
|
+
test_files: []
|