activemerchant-payway 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +47 -0
- data/Rakefile +31 -0
- data/VERSION +1 -0
- data/activemerchant-payway.gemspec +56 -0
- data/config/credentials.txt +2 -0
- data/config/payway.pem +0 -0
- data/init.rb +1 -0
- data/lib/active_merchant/billing/gateways/pay_way.rb +232 -0
- data/lib/activemerchant-payway.rb +2 -0
- data/test/remote/gateways/remote_pay_way_test.rb +212 -0
- data/test/test_helper.rb +197 -0
- data/test/unit/gateways/pay_way_test.rb +227 -0
- metadata +97 -0
data/README.md
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# ECI VALUES
|
2
|
+
* *CCT* Call Centre Transaction
|
3
|
+
* *IVR* IVR Transaction
|
4
|
+
* *MTO* MOTO Transaction
|
5
|
+
* *SSL* Channel Encrypted Transaction (SSL or other)
|
6
|
+
* *1* 3D Secure transaction. This is the value returned from your MPI (Merchant Plugin Interface) software for 3D Secure transactions
|
7
|
+
|
8
|
+
# Usage
|
9
|
+
|
10
|
+
gateway = ActiveMerchant::Billing::PayWayGateway.new(
|
11
|
+
:username => 'abcdefgh',
|
12
|
+
:password => '12345678',
|
13
|
+
:pem => '/location/of/certificate.pem',
|
14
|
+
:eci => 'SSL'
|
15
|
+
)
|
16
|
+
|
17
|
+
card = ActiveMerchant::Billing::CreditCard.new(
|
18
|
+
:number => 1234123412341234,
|
19
|
+
:month => 05,
|
20
|
+
:year => 2010,
|
21
|
+
:first_name => 'Joe',
|
22
|
+
:last_name => 'Bloggs',
|
23
|
+
:verification_value => 123,
|
24
|
+
:type => 'visa'
|
25
|
+
)
|
26
|
+
|
27
|
+
options = {
|
28
|
+
:order_number => 'abc',
|
29
|
+
:original_order_number => 'xyz' # used to call on past authentications
|
30
|
+
}
|
31
|
+
|
32
|
+
gateway.purchase(amount, card, options)
|
33
|
+
|
34
|
+
# Note When Testing
|
35
|
+
|
36
|
+
Since the merchant has to enable Diners and Amex on the Payway side,
|
37
|
+
To run the tests for these two cards simply run with the `PAYWAY_TEST_DINERS` and
|
38
|
+
`PAYWAY_TEST_AMEX` environment variables.
|
39
|
+
|
40
|
+
You also need to fill out `credentials.txt` and `payway.pem` in the config directory
|
41
|
+
with your api login and certificate generated at [http://www.payway.com.au](http://www.payway.com.au)
|
42
|
+
|
43
|
+
## Contributors
|
44
|
+
|
45
|
+
Developed by [@dangalipo](http://twitter.com/dangalipo) and [@mlambie](http://twitter.com/mlambie), sponsored by [@frontiergroup](http://twitter.com/frontiergroup)
|
46
|
+
|
47
|
+
Released by [@dirkkelly](http://twitter.com/dirkkelly) so all of you can use it.
|
data/Rakefile
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler'
|
3
|
+
begin
|
4
|
+
Bundler.setup(:default, :development)
|
5
|
+
rescue Bundler::BundlerError => e
|
6
|
+
$stderr.puts e.message
|
7
|
+
$stderr.puts "Run `bundle install` to install missing gems"
|
8
|
+
exit e.status_code
|
9
|
+
end
|
10
|
+
require 'rake'
|
11
|
+
|
12
|
+
require 'jeweler'
|
13
|
+
Jeweler::Tasks.new do |gem|
|
14
|
+
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
15
|
+
gem.name = "activemerchant-payway"
|
16
|
+
gem.homepage = "http://github.com/thefrontiergroup/activemerchant-payway"
|
17
|
+
gem.license = "MIT"
|
18
|
+
gem.summary = %Q{ActiveMerchant PayWay Plugin}
|
19
|
+
gem.description = %Q{ActiveMerchant PayWay Plugin}
|
20
|
+
gem.email = "dk@dirkkelly.com"
|
21
|
+
gem.authors = ["Matt Lambie", "Dan Galipo", "Dirk Kelly"]
|
22
|
+
gem.add_dependency 'activemerchant', '>= 1.9.1'
|
23
|
+
end
|
24
|
+
Jeweler::RubygemsDotOrgTasks.new
|
25
|
+
|
26
|
+
require 'rake/testtask'
|
27
|
+
Rake::TestTask.new(:test) do |test|
|
28
|
+
test.libs << 'lib' << 'test'
|
29
|
+
test.pattern = 'test/**/test_*.rb'
|
30
|
+
test.verbose = true
|
31
|
+
end
|
data/VERSION
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
0.0.1
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{activemerchant-payway}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Matt Lambie", "Dan Galipo", "Dirk Kelly"]
|
12
|
+
s.date = %q{2010-12-01}
|
13
|
+
s.description = %q{ActiveMerchant PayWay Plugin}
|
14
|
+
s.email = %q{dk@dirkkelly.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"README.md",
|
20
|
+
"Rakefile",
|
21
|
+
"VERSION",
|
22
|
+
"activemerchant-payway.gemspec",
|
23
|
+
"config/credentials.txt",
|
24
|
+
"config/payway.pem",
|
25
|
+
"init.rb",
|
26
|
+
"lib/active_merchant/billing/gateways/pay_way.rb",
|
27
|
+
"lib/activemerchant-payway.rb",
|
28
|
+
"test/remote/gateways/remote_pay_way_test.rb",
|
29
|
+
"test/test_helper.rb",
|
30
|
+
"test/unit/gateways/pay_way_test.rb"
|
31
|
+
]
|
32
|
+
s.homepage = %q{http://github.com/thefrontiergroup/activemerchant-payway}
|
33
|
+
s.licenses = ["MIT"]
|
34
|
+
s.require_paths = ["lib"]
|
35
|
+
s.rubygems_version = %q{1.3.7}
|
36
|
+
s.summary = %q{ActiveMerchant PayWay Plugin}
|
37
|
+
s.test_files = [
|
38
|
+
"test/remote/gateways/remote_pay_way_test.rb",
|
39
|
+
"test/test_helper.rb",
|
40
|
+
"test/unit/gateways/pay_way_test.rb"
|
41
|
+
]
|
42
|
+
|
43
|
+
if s.respond_to? :specification_version then
|
44
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
45
|
+
s.specification_version = 3
|
46
|
+
|
47
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
48
|
+
s.add_runtime_dependency(%q<activemerchant>, [">= 1.9.1"])
|
49
|
+
else
|
50
|
+
s.add_dependency(%q<activemerchant>, [">= 1.9.1"])
|
51
|
+
end
|
52
|
+
else
|
53
|
+
s.add_dependency(%q<activemerchant>, [">= 1.9.1"])
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
data/config/payway.pem
ADDED
File without changes
|
data/init.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require 'activemerchant_pay_way'
|
@@ -0,0 +1,232 @@
|
|
1
|
+
module ActiveMerchant
|
2
|
+
module Billing
|
3
|
+
|
4
|
+
class PayWayGateway < Gateway
|
5
|
+
|
6
|
+
URL = 'https://ccapi.client.qvalent.com/payway/ccapi'
|
7
|
+
|
8
|
+
SUMMARY_CODES = {
|
9
|
+
'0' => 'Approved',
|
10
|
+
'1' => 'Declined',
|
11
|
+
'2' => 'Erred',
|
12
|
+
'3' => 'Rejected'
|
13
|
+
}
|
14
|
+
|
15
|
+
RESPONSE_CODES= {
|
16
|
+
'00' => 'Completed Successfully',
|
17
|
+
'01' => 'Refer to card issuer',
|
18
|
+
'03' => 'Invalid merchant',
|
19
|
+
'04' => 'Pick-up card',
|
20
|
+
'05' => 'Do not honour',
|
21
|
+
'08' => 'Honour only with identification',
|
22
|
+
'12' => 'Invalid transaction',
|
23
|
+
'13' => 'Invalid amount',
|
24
|
+
'14' => 'Invalid card number (no such number)',
|
25
|
+
'30' => 'Format error',
|
26
|
+
'36' => 'Restricted card',
|
27
|
+
'41' => 'Lost card',
|
28
|
+
'42' => 'No universal card',
|
29
|
+
'43' => 'Stolen card',
|
30
|
+
'51' => 'Not sufficient funds',
|
31
|
+
'54' => 'Expired card',
|
32
|
+
'61' => 'Exceeds withdrawal amount limits',
|
33
|
+
'62' => 'Restricted card',
|
34
|
+
'65' => 'Exceeds withdrawal frequency limit',
|
35
|
+
'91' => 'Issuer or switch is inoperative',
|
36
|
+
'92' => 'Financial institution or intermediate network facility cannot be found for routing',
|
37
|
+
'94' => 'Duplicate transmission',
|
38
|
+
'Q1' => 'Unknown Buyer',
|
39
|
+
'Q2' => 'Transaction Pending',
|
40
|
+
'Q3' => 'Payment Gateway Connection Error',
|
41
|
+
'Q4' => 'Payment Gateway Unavailable',
|
42
|
+
'Q5' => 'Invalid Transaction',
|
43
|
+
'Q6' => 'Duplicate Transaction – requery to determine status',
|
44
|
+
'QA' => 'Invalid parameters or Initialisation failed',
|
45
|
+
'QB' => 'Order type not currently supported',
|
46
|
+
'QC' => 'Invalid Order Type',
|
47
|
+
'QD' => 'Invalid Payment Amount - Payment amount less than minimum/exceeds maximum allowed limit',
|
48
|
+
'QE' => 'Internal Error',
|
49
|
+
'QF' => 'Transaction Failed',
|
50
|
+
'QG' => 'Unknown Customer Order Number',
|
51
|
+
'QH' => 'Unknown Customer Username or Password',
|
52
|
+
'QI' => 'Transaction incomplete - contact Westpac to confirm reconciliation',
|
53
|
+
'QJ' => 'Invalid Client Certificate',
|
54
|
+
'QK' => 'Unknown Customer Merchant',
|
55
|
+
'QL' => 'Business Group not configured for customer',
|
56
|
+
'QM' => 'Payment Instrument not configured for customer',
|
57
|
+
'QN' => 'Configuration Error',
|
58
|
+
'QO' => 'Missing Payment Instrument',
|
59
|
+
'QP' => 'Missing Supplier Account',
|
60
|
+
'QQ' => 'Invalid Credit Card Verification Number',
|
61
|
+
'QR' => 'Transaction Retry',
|
62
|
+
'QS' => 'Transaction Successful',
|
63
|
+
'QT' => 'Invalid currency',
|
64
|
+
'QU' => 'Unknown Customer IP Address',
|
65
|
+
'QV' => 'Invalid Original Order Number specified for Refund, Refund amount exceeds capture amount, or Previous capture was not approved',
|
66
|
+
'QW' => 'Invalid Reference Number',
|
67
|
+
'QX' => 'Network Error has occurred',
|
68
|
+
'QY' => 'Card Type Not Accepted',
|
69
|
+
'QZ' => 'Zero value transaction'
|
70
|
+
}
|
71
|
+
|
72
|
+
TRANSACTIONS = {
|
73
|
+
:authorization => 'preauth',
|
74
|
+
:purchase => 'capture',
|
75
|
+
:capture => 'captureWithoutAuth',
|
76
|
+
:status => 'query',
|
77
|
+
:credit => 'refund'
|
78
|
+
}
|
79
|
+
|
80
|
+
self.supported_countries = [ 'AU' ]
|
81
|
+
self.supported_cardtypes = [ :visa, :master, :diners_club, :american_express, :bankcard ]
|
82
|
+
self.display_name = 'Pay Way'
|
83
|
+
self.homepage_url = 'http://www.payway.com.au'
|
84
|
+
self.default_currency = 'AUD'
|
85
|
+
self.money_format = :cents
|
86
|
+
|
87
|
+
# Create a new Payway gateway.
|
88
|
+
def initialize(options = {})
|
89
|
+
requires!(options, :username, :password, :pem)
|
90
|
+
@options = options
|
91
|
+
|
92
|
+
@options[:eci] ||= 'SSL'
|
93
|
+
@options[:currency] ||= default_currency
|
94
|
+
@options[:merchant] ||= 'TEST'
|
95
|
+
@options[:pem] = File.read(options[:pem])
|
96
|
+
|
97
|
+
@post = {}
|
98
|
+
@transaction = {}
|
99
|
+
|
100
|
+
super
|
101
|
+
end
|
102
|
+
|
103
|
+
# Build the string and send it
|
104
|
+
def process(action, amount, credit_card)
|
105
|
+
@transaction.merge!({
|
106
|
+
:type => action,
|
107
|
+
:amount => amount,
|
108
|
+
:credit_card => credit_card
|
109
|
+
})
|
110
|
+
|
111
|
+
build_card
|
112
|
+
build_order
|
113
|
+
build_customer
|
114
|
+
|
115
|
+
send_post
|
116
|
+
end
|
117
|
+
|
118
|
+
def authorize(amount, credit_card, options = {})
|
119
|
+
requires!(options, :order_number)
|
120
|
+
|
121
|
+
@transaction.merge!({ :order_number => options[:order_number] })
|
122
|
+
|
123
|
+
process(:authorize, amount, credit_card)
|
124
|
+
end
|
125
|
+
|
126
|
+
def capture(amount, credit_card, options = {})
|
127
|
+
requires!(options, :order_number, :original_order_number)
|
128
|
+
|
129
|
+
@transaction.merge!({
|
130
|
+
:order_number => options[:order_number],
|
131
|
+
:original_order_number => options[:original_order_number]
|
132
|
+
})
|
133
|
+
|
134
|
+
process(:capture, amount, credit_card)
|
135
|
+
end
|
136
|
+
|
137
|
+
def purchase(amount, credit_card, options = {})
|
138
|
+
requires!(options, :order_number)
|
139
|
+
|
140
|
+
@transaction.merge!({ :order_number => options[:order_number] })
|
141
|
+
|
142
|
+
process(:purchase, amount, credit_card)
|
143
|
+
end
|
144
|
+
|
145
|
+
def credit(amount, credit_card, options = {})
|
146
|
+
requires!(options, :order_number, :original_order_number)
|
147
|
+
|
148
|
+
|
149
|
+
@transaction.merge!({
|
150
|
+
:order_number => options[:order_number],
|
151
|
+
:original_order_number => options[:original_order_number]
|
152
|
+
})
|
153
|
+
|
154
|
+
process(:credit, amount, credit_card)
|
155
|
+
end
|
156
|
+
|
157
|
+
def status(options = {})
|
158
|
+
requires!(options, :order_number)
|
159
|
+
@transaction = transaction
|
160
|
+
@transaction[:type] = TRANSACTIONS[:status]
|
161
|
+
|
162
|
+
build_order
|
163
|
+
|
164
|
+
send_post
|
165
|
+
end
|
166
|
+
|
167
|
+
private
|
168
|
+
|
169
|
+
# Adds credit card details to the post hash
|
170
|
+
def build_card
|
171
|
+
card = @transaction[:credit_card]
|
172
|
+
@post.merge!({
|
173
|
+
'card.cardHolderName' => "#{card.first_name} #{card.last_name}",
|
174
|
+
'card.PAN' => card.number,
|
175
|
+
'card.CVN' => card.verification_value,
|
176
|
+
'card.expiryYear' => card.year.to_s[-2,2],
|
177
|
+
'card.expiryMonth' => sprintf('%02d', card.month),
|
178
|
+
'card.currency' => @options[:currency]
|
179
|
+
})
|
180
|
+
end
|
181
|
+
|
182
|
+
# Adds the order arguments to the post hash
|
183
|
+
def build_order
|
184
|
+
@post.merge!({
|
185
|
+
'order.ECI' => @options[:eci],
|
186
|
+
'order.amount' => @transaction[:amount],
|
187
|
+
'order.type' => TRANSACTIONS[@transaction[:type]]
|
188
|
+
})
|
189
|
+
|
190
|
+
if @transaction[:original_order_number].present?
|
191
|
+
@post['order.originalOrderNumber'] = @transaction[:original_order_number]
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Adds the customer arguments to the post hash
|
196
|
+
def build_customer
|
197
|
+
@post.merge!({
|
198
|
+
'customer.username' => @options[:username],
|
199
|
+
'customer.password' => @options[:password],
|
200
|
+
'customer.merchant' => @options[:merchant],
|
201
|
+
'customer.orderNumber'=> "#{@transaction[:order_number]} - #{Time.new.to_i.to_s}",
|
202
|
+
})
|
203
|
+
end
|
204
|
+
|
205
|
+
# Creates the request and returns the sumarised result
|
206
|
+
def send_post
|
207
|
+
@request = URI.encode(@post.map {|k,v| "#{k}=#{v}"}.join('&'))
|
208
|
+
|
209
|
+
@response = ssl_post(URL, @request)
|
210
|
+
|
211
|
+
result = process_response
|
212
|
+
end
|
213
|
+
|
214
|
+
def process_response
|
215
|
+
params = {}
|
216
|
+
|
217
|
+
@response.split("&").each do |items|
|
218
|
+
key, value = items.split("=")
|
219
|
+
key = key.split('.')[1]
|
220
|
+
params[key.underscore.to_sym] = value
|
221
|
+
end
|
222
|
+
|
223
|
+
msg = "#{SUMMARY_CODES[params[:summary_code]]} - #{RESPONSE_CODES[params[:response_code]]}"
|
224
|
+
|
225
|
+
success = params[:summary_code].to_s == "0"
|
226
|
+
options = { :test => @options[:merchant].to_s == "TEST" }
|
227
|
+
|
228
|
+
result = Response.new(success, msg, params, options)
|
229
|
+
end
|
230
|
+
end
|
231
|
+
end
|
232
|
+
end
|
@@ -0,0 +1,212 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'activemerchant_pay_way'
|
3
|
+
|
4
|
+
USERNAME = File.new('config/credentials.txt').readlines[0].gsub("\n","")
|
5
|
+
PASSWORD = File.new('config/credentials.txt').readlines[1].gsub("\n","")
|
6
|
+
PEM_FILE = 'config/payway.pem'
|
7
|
+
|
8
|
+
class RemotePayWayTest < Test::Unit::TestCase
|
9
|
+
|
10
|
+
def setup
|
11
|
+
@amount = 1100
|
12
|
+
|
13
|
+
@options = {
|
14
|
+
:order_number => (Time.now.to_f * 1000).round,
|
15
|
+
:original_order_number => 'xyz'
|
16
|
+
}
|
17
|
+
|
18
|
+
@gateway = ActiveMerchant::Billing::PayWayGateway.new(
|
19
|
+
:username => USERNAME,
|
20
|
+
:password => PASSWORD,
|
21
|
+
:merchant => 'TEST',
|
22
|
+
:pem => PEM_FILE
|
23
|
+
)
|
24
|
+
|
25
|
+
@visa = ActiveMerchant::Billing::CreditCard.new(
|
26
|
+
:number => 4564710000000004,
|
27
|
+
:month => 2,
|
28
|
+
:year => 2019,
|
29
|
+
:first_name => 'Bob',
|
30
|
+
:last_name => 'Smith',
|
31
|
+
:verification_value => 847,
|
32
|
+
:type => 'visa'
|
33
|
+
)
|
34
|
+
|
35
|
+
@mastercard = ActiveMerchant::Billing::CreditCard.new(
|
36
|
+
:number => 5163200000000008,
|
37
|
+
:month => 8,
|
38
|
+
:year => 2020,
|
39
|
+
:first_name => 'Bob',
|
40
|
+
:last_name => 'Smith',
|
41
|
+
:verification_value => '070',
|
42
|
+
:type => 'master'
|
43
|
+
)
|
44
|
+
|
45
|
+
@amex = ActiveMerchant::Billing::CreditCard.new(
|
46
|
+
:number => 376000000000006,
|
47
|
+
:month => 6,
|
48
|
+
:year => 2020,
|
49
|
+
:first_name => 'Bob',
|
50
|
+
:last_name => 'Smith',
|
51
|
+
:verification_value => 2349,
|
52
|
+
:type => 'american_express'
|
53
|
+
)
|
54
|
+
|
55
|
+
@diners = ActiveMerchant::Billing::CreditCard.new(
|
56
|
+
:number => 36430000000007,
|
57
|
+
:month => 6,
|
58
|
+
:year => 2022,
|
59
|
+
:first_name => 'Bob',
|
60
|
+
:last_name => 'Smith',
|
61
|
+
:verification_value => 348,
|
62
|
+
:type => 'diners_club'
|
63
|
+
)
|
64
|
+
|
65
|
+
@expired = ActiveMerchant::Billing::CreditCard.new(
|
66
|
+
:number => 4564710000000012,
|
67
|
+
:month => 2,
|
68
|
+
:year => 2005,
|
69
|
+
:first_name => 'Bob',
|
70
|
+
:last_name => 'Smith',
|
71
|
+
:verification_value => 963,
|
72
|
+
:type => 'visa'
|
73
|
+
)
|
74
|
+
|
75
|
+
@low = ActiveMerchant::Billing::CreditCard.new(
|
76
|
+
:number => 4564710000000020,
|
77
|
+
:month => 5,
|
78
|
+
:year => 2020,
|
79
|
+
:first_name => 'Bob',
|
80
|
+
:last_name => 'Smith',
|
81
|
+
:verification_value => 234,
|
82
|
+
:type => 'visa'
|
83
|
+
)
|
84
|
+
|
85
|
+
@stolen_mastercard = ActiveMerchant::Billing::CreditCard.new(
|
86
|
+
:number => 5163200000000016,
|
87
|
+
:month => 12,
|
88
|
+
:year => 2019,
|
89
|
+
:first_name => 'Bob',
|
90
|
+
:last_name => 'Smith',
|
91
|
+
:verification_value => 728,
|
92
|
+
:type => 'master'
|
93
|
+
)
|
94
|
+
|
95
|
+
@invalid = ActiveMerchant::Billing::CreditCard.new(
|
96
|
+
:number => 4564720000000037,
|
97
|
+
:month => 9,
|
98
|
+
:year => 2019,
|
99
|
+
:first_name => 'Bob',
|
100
|
+
:last_name => 'Smith',
|
101
|
+
:verification_value => '030',
|
102
|
+
:type => 'visa'
|
103
|
+
)
|
104
|
+
|
105
|
+
@restricted = ActiveMerchant::Billing::CreditCard.new(
|
106
|
+
:number => 343400000000016,
|
107
|
+
:month => 1,
|
108
|
+
:year => 2019,
|
109
|
+
:first_name => 'Bob',
|
110
|
+
:last_name => 'Smith',
|
111
|
+
:verification_value => 9023,
|
112
|
+
:type => 'american_express'
|
113
|
+
)
|
114
|
+
|
115
|
+
@stolen_diners = ActiveMerchant::Billing::CreditCard.new(
|
116
|
+
:number => 36430000000015,
|
117
|
+
:month => 8,
|
118
|
+
:year => 2021,
|
119
|
+
:first_name => 'Bob',
|
120
|
+
:last_name => 'Smith',
|
121
|
+
:verification_value => 988,
|
122
|
+
:type => 'diners_club'
|
123
|
+
)
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_successful_visa
|
127
|
+
assert response = @gateway.purchase(@amount, @visa, @options)
|
128
|
+
assert_success response
|
129
|
+
assert_response_message_prefix 'Approved', response
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_successful_mastercard
|
133
|
+
assert response = @gateway.purchase(@amount, @mastercard, @options)
|
134
|
+
assert_success response
|
135
|
+
assert_response_message_prefix 'Approved', response
|
136
|
+
end
|
137
|
+
|
138
|
+
if ENV['PAYWAY_TEST_AMEX'].present?
|
139
|
+
def test_successful_amex
|
140
|
+
assert response = @gateway.purchase(@amount, @amex, @options)
|
141
|
+
assert_success response
|
142
|
+
assert_response_message_prefix 'Approved', response
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
if ENV['PAYWAY_TEST_DINERS'].present?
|
147
|
+
def test_successful_diners
|
148
|
+
assert response = @gateway.purchase(@amount, @diners, @options)
|
149
|
+
assert_success response
|
150
|
+
assert_response_message_prefix 'Approved', response
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_expired_visa
|
155
|
+
assert response = @gateway.purchase(@amount, @expired, @options)
|
156
|
+
assert_failure response
|
157
|
+
assert_equal 'Declined - Expired card', response.message
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_low_visa
|
161
|
+
assert response = @gateway.purchase(@amount, @low, @options)
|
162
|
+
assert_failure response
|
163
|
+
assert_equal 'Declined - Not sufficient funds', response.message
|
164
|
+
end
|
165
|
+
|
166
|
+
def test_stolen_mastercard
|
167
|
+
assert response = @gateway.purchase(@amount, @stolen_mastercard, @options)
|
168
|
+
assert_failure response
|
169
|
+
assert_equal 'Declined - Pick-up card', response.message
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_invalid_visa
|
173
|
+
assert response = @gateway.purchase(@amount, @invalid, @options)
|
174
|
+
assert_failure response
|
175
|
+
assert_equal 'Declined - Do not honour', response.message
|
176
|
+
end
|
177
|
+
|
178
|
+
if ENV['PAYWAY_TEST_AMEX'].present?
|
179
|
+
def test_restricted_amex
|
180
|
+
assert response = @gateway.purchase(@amount, @restricted, @options)
|
181
|
+
assert_failure response
|
182
|
+
assert_equal 'Rejected - Restricted card', response.message
|
183
|
+
end
|
184
|
+
end
|
185
|
+
|
186
|
+
if ENV['PAYWAY_TEST_DINERS'].present?
|
187
|
+
def test_stolen_diners
|
188
|
+
assert response = @gateway.purchase(@amount, @stolen_diners, @options)
|
189
|
+
assert_failure response
|
190
|
+
assert_equal 'Declined - Pick-up card', response.message
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_invalid_login
|
195
|
+
gateway = ActiveMerchant::Billing::PayWayGateway.new(
|
196
|
+
:username => '',
|
197
|
+
:password => '',
|
198
|
+
:merchant => 'TEST',
|
199
|
+
:pem => PEM_FILE
|
200
|
+
)
|
201
|
+
assert response = gateway.purchase(@amount, @visa, @options)
|
202
|
+
assert_failure response
|
203
|
+
assert_equal 'Rejected - Unknown Customer Username or Password', response.message
|
204
|
+
end
|
205
|
+
|
206
|
+
protected
|
207
|
+
|
208
|
+
def assert_response_message_prefix(prefix, response)
|
209
|
+
assert_equal prefix, response.message.split(' - ', 2).first
|
210
|
+
end
|
211
|
+
|
212
|
+
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,197 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'test/unit'
|
6
|
+
require 'money'
|
7
|
+
require 'mocha'
|
8
|
+
require 'yaml'
|
9
|
+
require 'active_merchant'
|
10
|
+
|
11
|
+
require 'active_support/core_ext/integer/time'
|
12
|
+
require 'active_support/core_ext/numeric/time'
|
13
|
+
|
14
|
+
begin
|
15
|
+
require 'active_support/core_ext/time/acts_like'
|
16
|
+
rescue LoadError
|
17
|
+
end
|
18
|
+
|
19
|
+
begin
|
20
|
+
gem 'actionpack'
|
21
|
+
rescue LoadError
|
22
|
+
raise StandardError, "The view tests need ActionPack installed as gem to run"
|
23
|
+
end
|
24
|
+
|
25
|
+
require 'action_controller'
|
26
|
+
require "action_view/template"
|
27
|
+
begin
|
28
|
+
require 'action_dispatch/testing/test_process'
|
29
|
+
rescue LoadError
|
30
|
+
require 'action_controller/test_process'
|
31
|
+
end
|
32
|
+
require 'active_merchant/billing/integrations/action_view_helper'
|
33
|
+
|
34
|
+
ActiveMerchant::Billing::Base.mode = :test
|
35
|
+
|
36
|
+
# Test gateways
|
37
|
+
class SimpleTestGateway < ActiveMerchant::Billing::Gateway
|
38
|
+
end
|
39
|
+
|
40
|
+
class SubclassGateway < SimpleTestGateway
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
module ActiveMerchant
|
45
|
+
module Assertions
|
46
|
+
AssertionClass = RUBY_VERSION > '1.9' ? MiniTest::Assertion : Test::Unit::AssertionFailedError
|
47
|
+
|
48
|
+
def assert_field(field, value)
|
49
|
+
clean_backtrace do
|
50
|
+
assert_equal value, @helper.fields[field]
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# Allows the testing of you to check for negative assertions:
|
55
|
+
#
|
56
|
+
# # Instead of
|
57
|
+
# assert !something_that_is_false
|
58
|
+
#
|
59
|
+
# # Do this
|
60
|
+
# assert_false something_that_should_be_false
|
61
|
+
#
|
62
|
+
# An optional +msg+ parameter is available to help you debug.
|
63
|
+
def assert_false(boolean, message = nil)
|
64
|
+
message = build_message message, '<?> is not false or nil.', boolean
|
65
|
+
|
66
|
+
clean_backtrace do
|
67
|
+
assert_block message do
|
68
|
+
not boolean
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
# A handy little assertion to check for a successful response:
|
74
|
+
#
|
75
|
+
# # Instead of
|
76
|
+
# assert_success response
|
77
|
+
#
|
78
|
+
# # DRY that up with
|
79
|
+
# assert_success response
|
80
|
+
#
|
81
|
+
# A message will automatically show the inspection of the response
|
82
|
+
# object if things go afoul.
|
83
|
+
def assert_success(response)
|
84
|
+
clean_backtrace do
|
85
|
+
assert response.success?, "Response failed: #{response.inspect}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# The negative of +assert_success+
|
90
|
+
def assert_failure(response)
|
91
|
+
clean_backtrace do
|
92
|
+
assert_false response.success?, "Response expected to fail: #{response.inspect}"
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
def assert_valid(validateable)
|
97
|
+
clean_backtrace do
|
98
|
+
assert validateable.valid?, "Expected to be valid"
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def assert_not_valid(validateable)
|
103
|
+
clean_backtrace do
|
104
|
+
assert_false validateable.valid?, "Expected to not be valid"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
private
|
109
|
+
def clean_backtrace(&block)
|
110
|
+
yield
|
111
|
+
rescue AssertionClass => e
|
112
|
+
path = File.expand_path(__FILE__)
|
113
|
+
raise AssertionClass, e.message, e.backtrace.reject { |line| File.expand_path(line) =~ /#{path}/ }
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
module Fixtures
|
118
|
+
HOME_DIR = RUBY_PLATFORM =~ /mswin32/ ? ENV['HOMEPATH'] : ENV['HOME'] unless defined?(HOME_DIR)
|
119
|
+
LOCAL_CREDENTIALS = File.join(HOME_DIR.to_s, '.active_merchant/fixtures.yml') unless defined?(LOCAL_CREDENTIALS)
|
120
|
+
DEFAULT_CREDENTIALS = File.join(File.dirname(__FILE__), 'fixtures.yml') unless defined?(DEFAULT_CREDENTIALS)
|
121
|
+
|
122
|
+
private
|
123
|
+
def credit_card(number = '4242424242424242', options = {})
|
124
|
+
defaults = {
|
125
|
+
:number => number,
|
126
|
+
:month => 9,
|
127
|
+
:year => Time.now.year + 1,
|
128
|
+
:first_name => 'Longbob',
|
129
|
+
:last_name => 'Longsen',
|
130
|
+
:verification_value => '123',
|
131
|
+
:type => 'visa'
|
132
|
+
}.update(options)
|
133
|
+
|
134
|
+
Billing::CreditCard.new(defaults)
|
135
|
+
end
|
136
|
+
|
137
|
+
def check(options = {})
|
138
|
+
defaults = {
|
139
|
+
:name => 'Jim Smith',
|
140
|
+
:routing_number => '244183602',
|
141
|
+
:account_number => '15378535',
|
142
|
+
:account_holder_type => 'personal',
|
143
|
+
:account_type => 'checking',
|
144
|
+
:number => '1'
|
145
|
+
}.update(options)
|
146
|
+
|
147
|
+
Billing::Check.new(defaults)
|
148
|
+
end
|
149
|
+
|
150
|
+
def address(options = {})
|
151
|
+
{
|
152
|
+
:name => 'Jim Smith',
|
153
|
+
:address1 => '1234 My Street',
|
154
|
+
:address2 => 'Apt 1',
|
155
|
+
:company => 'Widgets Inc',
|
156
|
+
:city => 'Ottawa',
|
157
|
+
:state => 'ON',
|
158
|
+
:zip => 'K1C2N6',
|
159
|
+
:country => 'CA',
|
160
|
+
:phone => '(555)555-5555',
|
161
|
+
:fax => '(555)555-6666'
|
162
|
+
}.update(options)
|
163
|
+
end
|
164
|
+
|
165
|
+
def all_fixtures
|
166
|
+
@@fixtures ||= load_fixtures
|
167
|
+
end
|
168
|
+
|
169
|
+
def fixtures(key)
|
170
|
+
data = all_fixtures[key] || raise(StandardError, "No fixture data was found for '#{key}'")
|
171
|
+
|
172
|
+
data.dup
|
173
|
+
end
|
174
|
+
|
175
|
+
def load_fixtures
|
176
|
+
file = File.exists?(LOCAL_CREDENTIALS) ? LOCAL_CREDENTIALS : DEFAULT_CREDENTIALS
|
177
|
+
yaml_data = YAML.load(File.read(file))
|
178
|
+
symbolize_keys(yaml_data)
|
179
|
+
|
180
|
+
yaml_data
|
181
|
+
end
|
182
|
+
|
183
|
+
def symbolize_keys(hash)
|
184
|
+
return unless hash.is_a?(Hash)
|
185
|
+
|
186
|
+
hash.symbolize_keys!
|
187
|
+
hash.each{|k,v| symbolize_keys(v)}
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
Test::Unit::TestCase.class_eval do
|
193
|
+
include ActiveMerchant::Billing
|
194
|
+
include ActiveMerchant::Assertions
|
195
|
+
include ActiveMerchant::Utils
|
196
|
+
include ActiveMerchant::Fixtures
|
197
|
+
end
|
@@ -0,0 +1,227 @@
|
|
1
|
+
require 'test/test_helper'
|
2
|
+
require 'active_merchant/billing/gateways/pay_way'
|
3
|
+
|
4
|
+
class PayWayTest < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
@gateway = ActiveMerchant::Billing::PayWayGateway.new(
|
8
|
+
:username => '12341234',
|
9
|
+
:password => 'abcdabcd',
|
10
|
+
:pem => 'config/payway.pem'
|
11
|
+
)
|
12
|
+
|
13
|
+
@amount = 1000
|
14
|
+
|
15
|
+
@credit_card = ActiveMerchant::Billing::CreditCard.new(
|
16
|
+
:number => 4564710000000004,
|
17
|
+
:month => 2,
|
18
|
+
:year => 2019,
|
19
|
+
:first_name => 'Bob',
|
20
|
+
:last_name => 'Smith',
|
21
|
+
:verification_value => '847',
|
22
|
+
:type => 'visa'
|
23
|
+
)
|
24
|
+
|
25
|
+
@options = {
|
26
|
+
:order_number => 'abc',
|
27
|
+
:orginal_order_number => 'xyz'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_successful_purchase_visa
|
32
|
+
@gateway.stubs(:ssl_post).returns(successful_response_visa)
|
33
|
+
|
34
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
35
|
+
|
36
|
+
assert_instance_of Response, response
|
37
|
+
assert_success response
|
38
|
+
|
39
|
+
assert_match '0', response.params['summary_code']
|
40
|
+
assert_match '08', response.params['response_code']
|
41
|
+
assert_match 'VISA', response.params['card_scheme_name']
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_successful_purchase_master_card
|
45
|
+
@gateway.stubs(:ssl_post).returns(successful_response_master_card)
|
46
|
+
|
47
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
48
|
+
|
49
|
+
assert_instance_of Response, response
|
50
|
+
assert_success response
|
51
|
+
|
52
|
+
assert_match '0', response.params['summary_code']
|
53
|
+
assert_match '08', response.params['response_code']
|
54
|
+
assert_match 'MASTERCARD', response.params['card_scheme_name']
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_successful_authorize_visa
|
58
|
+
@gateway.stubs(:ssl_post).returns(successful_response_visa)
|
59
|
+
|
60
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
61
|
+
|
62
|
+
assert_instance_of Response, response
|
63
|
+
assert_success response
|
64
|
+
|
65
|
+
assert_match '0', response.params['summary_code']
|
66
|
+
assert_match '08', response.params['response_code']
|
67
|
+
assert_match 'VISA', response.params['card_scheme_name']
|
68
|
+
end
|
69
|
+
|
70
|
+
def test_successful_authorize_master_card
|
71
|
+
@gateway.stubs(:ssl_post).returns(successful_response_master_card)
|
72
|
+
|
73
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
74
|
+
|
75
|
+
assert_instance_of Response, response
|
76
|
+
assert_success response
|
77
|
+
|
78
|
+
assert_match '0', response.params['summary_code']
|
79
|
+
assert_match '08', response.params['response_code']
|
80
|
+
assert_match 'MASTERCARD', response.params['card_scheme_name']
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_successful_capture_visa
|
84
|
+
@gateway.stubs(:ssl_post).returns(successful_response_visa)
|
85
|
+
|
86
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
87
|
+
|
88
|
+
assert_instance_of Response, response
|
89
|
+
assert_success response
|
90
|
+
|
91
|
+
assert_match '0', response.params['summary_code']
|
92
|
+
assert_match '08', response.params['response_code']
|
93
|
+
assert_match 'VISA', response.params['card_scheme_name']
|
94
|
+
end
|
95
|
+
|
96
|
+
def test_successful_capture_master_card
|
97
|
+
@gateway.stubs(:ssl_post).returns(successful_response_master_card)
|
98
|
+
|
99
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
100
|
+
|
101
|
+
assert_instance_of Response, response
|
102
|
+
assert_success response
|
103
|
+
|
104
|
+
assert_match '0', response.params['summary_code']
|
105
|
+
assert_match '08', response.params['response_code']
|
106
|
+
assert_match 'MASTERCARD', response.params['card_scheme_name']
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_successful_credit_visa
|
110
|
+
@gateway.stubs(:ssl_post).returns(successful_response_visa)
|
111
|
+
|
112
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
113
|
+
|
114
|
+
assert_instance_of Response, response
|
115
|
+
assert_success response
|
116
|
+
|
117
|
+
assert_match '0', response.params['summary_code']
|
118
|
+
assert_match '08', response.params['response_code']
|
119
|
+
assert_match 'VISA', response.params['card_scheme_name']
|
120
|
+
end
|
121
|
+
|
122
|
+
def test_successful_credit_master_card
|
123
|
+
@gateway.stubs(:ssl_post).returns(successful_response_master_card)
|
124
|
+
|
125
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
126
|
+
|
127
|
+
assert_instance_of Response, response
|
128
|
+
assert_success response
|
129
|
+
|
130
|
+
assert_match '0', response.params['summary_code']
|
131
|
+
assert_match '08', response.params['response_code']
|
132
|
+
assert_match 'MASTERCARD', response.params['card_scheme_name']
|
133
|
+
end
|
134
|
+
|
135
|
+
def test_purchase_with_invalid_credit_card
|
136
|
+
@gateway.stubs(:ssl_post).returns(purchase_with_invalid_credit_card_response)
|
137
|
+
|
138
|
+
credit_card.number = 4444333322221111
|
139
|
+
|
140
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
141
|
+
|
142
|
+
assert_instance_of Response, response
|
143
|
+
assert_failure response
|
144
|
+
|
145
|
+
assert_match '1', response.params['summary_code']
|
146
|
+
assert_match '14', response.params['response_code']
|
147
|
+
end
|
148
|
+
|
149
|
+
def test_purchase_with_expired_credit_card
|
150
|
+
@gateway.stubs(:ssl_post).returns(purchase_with_expired_credit_card_response)
|
151
|
+
|
152
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
153
|
+
|
154
|
+
assert_instance_of Response, response
|
155
|
+
assert_failure response
|
156
|
+
|
157
|
+
assert_match '1', response.params['summary_code']
|
158
|
+
assert_match '54', response.params['response_code']
|
159
|
+
end
|
160
|
+
|
161
|
+
def test_purchase_with_invalid_month
|
162
|
+
@gateway.stubs(:ssl_post).returns(purchase_with_invalid_month_response)
|
163
|
+
@credit_card.month = 13
|
164
|
+
|
165
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
166
|
+
|
167
|
+
assert_instance_of Response, response
|
168
|
+
assert_failure response
|
169
|
+
|
170
|
+
assert_match '3', response.params['summary_code']
|
171
|
+
assert_match 'QA', response.params['response_code']
|
172
|
+
end
|
173
|
+
|
174
|
+
def test_bad_login
|
175
|
+
@gateway.stubs(:ssl_post).returns(bad_login_response)
|
176
|
+
|
177
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
178
|
+
|
179
|
+
assert_instance_of Response, response
|
180
|
+
assert_failure response
|
181
|
+
|
182
|
+
assert_match '3', response.params['summary_code']
|
183
|
+
assert_match 'QH', response.params['response_code']
|
184
|
+
end
|
185
|
+
|
186
|
+
def test_bad_merchant
|
187
|
+
@gateway.stubs(:ssl_post).returns(bad_merchant_response)
|
188
|
+
|
189
|
+
response = @gateway.purchase(@amount, @credit_card, @options)
|
190
|
+
|
191
|
+
assert_instance_of Response, response
|
192
|
+
assert_failure response
|
193
|
+
|
194
|
+
assert_match '3', response.params['summary_code']
|
195
|
+
assert_match 'QK', response.params['response_code']
|
196
|
+
end
|
197
|
+
|
198
|
+
private
|
199
|
+
|
200
|
+
def successful_response_visa
|
201
|
+
"response.summaryCode=0&response.responseCode=08&response.cardSchemeName=VISA"
|
202
|
+
end
|
203
|
+
|
204
|
+
def successful_response_master_card
|
205
|
+
"response.summaryCode=0&response.responseCode=08&response.cardSchemeName=MASTERCARD"
|
206
|
+
end
|
207
|
+
|
208
|
+
def purchase_with_invalid_credit_card_response
|
209
|
+
"response.summaryCode=1&response.responseCode=14"
|
210
|
+
end
|
211
|
+
|
212
|
+
def purchase_with_expired_credit_card_response
|
213
|
+
"response.summaryCode=1&response.responseCode=54"
|
214
|
+
end
|
215
|
+
|
216
|
+
def purchase_with_invalid_month_response
|
217
|
+
"response.summaryCode=3&response.responseCode=QA"
|
218
|
+
end
|
219
|
+
|
220
|
+
def bad_login_response
|
221
|
+
"response.summaryCode=3&response.responseCode=QH"
|
222
|
+
end
|
223
|
+
|
224
|
+
def bad_merchant_response
|
225
|
+
"response.summaryCode=3&response.responseCode=QK"
|
226
|
+
end
|
227
|
+
end
|
metadata
ADDED
@@ -0,0 +1,97 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: activemerchant-payway
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 29
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 0
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
|
+
platform: ruby
|
12
|
+
authors:
|
13
|
+
- Matt Lambie
|
14
|
+
- Dan Galipo
|
15
|
+
- Dirk Kelly
|
16
|
+
autorequire:
|
17
|
+
bindir: bin
|
18
|
+
cert_chain: []
|
19
|
+
|
20
|
+
date: 2010-12-01 00:00:00 +08:00
|
21
|
+
default_executable:
|
22
|
+
dependencies:
|
23
|
+
- !ruby/object:Gem::Dependency
|
24
|
+
type: :runtime
|
25
|
+
prerelease: false
|
26
|
+
version_requirements: &id001 !ruby/object:Gem::Requirement
|
27
|
+
none: false
|
28
|
+
requirements:
|
29
|
+
- - ">="
|
30
|
+
- !ruby/object:Gem::Version
|
31
|
+
hash: 49
|
32
|
+
segments:
|
33
|
+
- 1
|
34
|
+
- 9
|
35
|
+
- 1
|
36
|
+
version: 1.9.1
|
37
|
+
name: activemerchant
|
38
|
+
requirement: *id001
|
39
|
+
description: ActiveMerchant PayWay Plugin
|
40
|
+
email: dk@dirkkelly.com
|
41
|
+
executables: []
|
42
|
+
|
43
|
+
extensions: []
|
44
|
+
|
45
|
+
extra_rdoc_files:
|
46
|
+
- README.md
|
47
|
+
files:
|
48
|
+
- README.md
|
49
|
+
- Rakefile
|
50
|
+
- VERSION
|
51
|
+
- activemerchant-payway.gemspec
|
52
|
+
- config/credentials.txt
|
53
|
+
- config/payway.pem
|
54
|
+
- init.rb
|
55
|
+
- lib/active_merchant/billing/gateways/pay_way.rb
|
56
|
+
- lib/activemerchant-payway.rb
|
57
|
+
- test/remote/gateways/remote_pay_way_test.rb
|
58
|
+
- test/test_helper.rb
|
59
|
+
- test/unit/gateways/pay_way_test.rb
|
60
|
+
has_rdoc: true
|
61
|
+
homepage: http://github.com/thefrontiergroup/activemerchant-payway
|
62
|
+
licenses:
|
63
|
+
- MIT
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
|
67
|
+
require_paths:
|
68
|
+
- lib
|
69
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
70
|
+
none: false
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
hash: 3
|
75
|
+
segments:
|
76
|
+
- 0
|
77
|
+
version: "0"
|
78
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ">="
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
hash: 3
|
84
|
+
segments:
|
85
|
+
- 0
|
86
|
+
version: "0"
|
87
|
+
requirements: []
|
88
|
+
|
89
|
+
rubyforge_project:
|
90
|
+
rubygems_version: 1.3.7
|
91
|
+
signing_key:
|
92
|
+
specification_version: 3
|
93
|
+
summary: ActiveMerchant PayWay Plugin
|
94
|
+
test_files:
|
95
|
+
- test/remote/gateways/remote_pay_way_test.rb
|
96
|
+
- test/test_helper.rb
|
97
|
+
- test/unit/gateways/pay_way_test.rb
|