activemerchant 1.1.0 → 1.2.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.tar.gz.sig +0 -0
- data/CHANGELOG +226 -0
- data/CONTRIBUTERS +52 -0
- data/README +34 -24
- data/Rakefile +152 -0
- data/gem-public_cert.pem +20 -0
- data/init.rb +3 -0
- data/lib/active_merchant.rb +3 -1
- data/lib/active_merchant/billing/credit_card.rb +21 -17
- data/lib/active_merchant/billing/credit_card_methods.rb +17 -19
- data/lib/active_merchant/billing/gateway.rb +160 -44
- data/lib/active_merchant/billing/gateways.rb +2 -15
- data/lib/active_merchant/billing/gateways/authorize_net.rb +21 -21
- data/lib/active_merchant/billing/gateways/bogus.rb +6 -6
- data/lib/active_merchant/billing/gateways/brain_tree.rb +191 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +207 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +402 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +41 -97
- data/lib/active_merchant/billing/gateways/efsnet.rb +256 -0
- data/lib/active_merchant/billing/gateways/eway.rb +77 -29
- data/lib/active_merchant/billing/gateways/exact.rb +230 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +6 -33
- data/lib/active_merchant/billing/gateways/moneris.rb +155 -125
- data/lib/active_merchant/billing/gateways/net_registry.rb +257 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +407 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +163 -25
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +56 -38
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +10 -1
- data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +9 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +36 -11
- data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +6 -0
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +7 -3
- data/lib/active_merchant/billing/gateways/payment_express.rb +261 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +18 -4
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +31 -15
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +8 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +33 -8
- data/lib/active_merchant/billing/gateways/plugnpay.rb +300 -0
- data/lib/active_merchant/billing/gateways/protx.rb +285 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +13 -12
- data/lib/active_merchant/billing/gateways/psl_card.rb +297 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +197 -0
- data/lib/active_merchant/billing/gateways/realex.rb +212 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +136 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +43 -20
- data/lib/active_merchant/billing/gateways/usa_epay.rb +6 -5
- data/lib/active_merchant/billing/gateways/verifi.rb +235 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +171 -0
- data/lib/active_merchant/billing/integrations/gestpay/helper.rb +0 -2
- data/lib/active_merchant/billing/integrations/helper.rb +8 -1
- data/lib/active_merchant/billing/integrations/nochex.rb +62 -1
- data/lib/active_merchant/billing/integrations/nochex/notification.rb +9 -16
- data/lib/active_merchant/billing/integrations/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +59 -46
- data/lib/active_merchant/billing/integrations/paypal/notification.rb +14 -47
- data/lib/active_merchant/lib/error.rb +4 -0
- data/lib/active_merchant/lib/post_data.rb +22 -0
- data/lib/active_merchant/lib/posts_data.rb +23 -5
- data/lib/active_merchant/lib/requires_parameters.rb +2 -2
- data/lib/active_merchant/lib/validateable.rb +1 -1
- data/lib/support/gateway_support.rb +45 -0
- data/lib/tasks/cia.rb +1 -1
- data/script/generate +14 -0
- data/script/generator/base.rb +45 -0
- data/script/generator/generator.rb +24 -0
- data/script/generator/generators/gateway/gateway_generator.rb +14 -0
- data/script/generator/generators/gateway/templates/gateway.rb +73 -0
- data/script/generator/generators/gateway/templates/gateway_test.rb +41 -0
- data/script/generator/generators/gateway/templates/remote_gateway_test.rb +56 -0
- data/script/generator/generators/integration/integration_generator.rb +25 -0
- data/script/generator/generators/integration/templates/helper.rb +34 -0
- data/script/generator/generators/integration/templates/helper_test.rb +54 -0
- data/script/generator/generators/integration/templates/integration.rb +18 -0
- data/script/generator/generators/integration/templates/module_test.rb +9 -0
- data/script/generator/generators/integration/templates/notification.rb +100 -0
- data/script/generator/generators/integration/templates/notification_test.rb +41 -0
- data/script/generator/manifest.rb +20 -0
- data/test/extra/binding_of_caller.rb +80 -0
- data/test/extra/breakpoint.rb +547 -0
- data/test/fixtures.yml +251 -0
- data/test/remote_tests/remote_authorize_net_test.rb +113 -0
- data/test/remote_tests/remote_brain_tree_test.rb +78 -0
- data/test/remote_tests/remote_card_stream_test.rb +160 -0
- data/test/remote_tests/remote_cyber_source_test.rb +130 -0
- data/test/remote_tests/remote_data_cash_test.rb +155 -0
- data/test/remote_tests/remote_efsnet_test.rb +93 -0
- data/test/remote_tests/remote_eway_test.rb +71 -0
- data/test/remote_tests/remote_exact_test.rb +59 -0
- data/test/remote_tests/remote_gestpay_integration_test.rb +37 -0
- data/test/remote_tests/remote_linkpoint_test.rb +144 -0
- data/test/remote_tests/remote_moneris_test.rb +110 -0
- data/test/remote_tests/remote_net_registry_test.rb +120 -0
- data/test/remote_tests/remote_pay_junction_test.rb +162 -0
- data/test/remote_tests/remote_payflow_express_test.rb +50 -0
- data/test/remote_tests/remote_payflow_test.rb +241 -0
- data/test/remote_tests/remote_payflow_uk_test.rb +172 -0
- data/test/remote_tests/remote_payment_express_test.rb +136 -0
- data/test/remote_tests/remote_paypal_express_test.rb +49 -0
- data/test/remote_tests/remote_paypal_integration_test.rb +14 -0
- data/test/remote_tests/remote_paypal_test.rb +163 -0
- data/test/remote_tests/remote_plugnpay_test.rb +70 -0
- data/test/remote_tests/remote_protx_test.rb +184 -0
- data/test/remote_tests/remote_psigate_test.rb +87 -0
- data/test/remote_tests/remote_psl_card_test.rb +105 -0
- data/test/remote_tests/remote_quickpay_test.rb +182 -0
- data/test/remote_tests/remote_realex_test.rb +227 -0
- data/test/remote_tests/remote_secure_pay_test.rb +36 -0
- data/test/remote_tests/remote_trans_first_test.rb +37 -0
- data/test/remote_tests/remote_trust_commerce_test.rb +136 -0
- data/test/remote_tests/remote_usa_epay_test.rb +57 -0
- data/test/remote_tests/remote_verifi_test.rb +107 -0
- data/test/remote_tests/remote_viaklix_test.rb +53 -0
- data/test/test_helper.rb +132 -0
- data/test/unit/base_test.rb +61 -0
- data/test/unit/country_code_test.rb +33 -0
- data/test/unit/country_test.rb +64 -0
- data/test/unit/credit_card_formatting_test.rb +24 -0
- data/test/unit/credit_card_methods_test.rb +37 -0
- data/test/unit/credit_card_test.rb +365 -0
- data/test/unit/gateways/authorize_net_test.rb +140 -0
- data/test/unit/gateways/bogus_test.rb +43 -0
- data/test/unit/gateways/brain_tree_test.rb +77 -0
- data/test/unit/gateways/card_stream_test.rb +37 -0
- data/test/unit/gateways/cyber_source_test.rb +151 -0
- data/test/unit/gateways/data_cash_test.rb +23 -0
- data/test/unit/gateways/efsnet_test.rb +70 -0
- data/test/unit/gateways/eway_test.rb +105 -0
- data/test/unit/gateways/exact_test.rb +118 -0
- data/test/unit/gateways/gateway_test.rb +24 -0
- data/test/unit/gateways/linkpoint_test.rb +165 -0
- data/test/unit/gateways/moneris_test.rb +167 -0
- data/test/unit/gateways/net_registry_test.rb +478 -0
- data/test/unit/gateways/pay_junction_test.rb +61 -0
- data/test/unit/gateways/payflow_express_test.rb +165 -0
- data/test/unit/gateways/payflow_express_uk_test.rb +14 -0
- data/test/unit/gateways/payflow_test.rb +230 -0
- data/test/unit/gateways/payflow_uk_test.rb +68 -0
- data/test/unit/gateways/payment_express_test.rb +215 -0
- data/test/unit/gateways/paypal_express_test.rb +222 -0
- data/test/unit/gateways/paypal_test.rb +241 -0
- data/test/unit/gateways/plugnpay_test.rb +79 -0
- data/test/unit/gateways/protx_test.rb +110 -0
- data/test/unit/gateways/psigate_test.rb +110 -0
- data/test/unit/gateways/psl_card_test.rb +51 -0
- data/test/unit/gateways/quickpay_test.rb +125 -0
- data/test/unit/gateways/realex_test.rb +150 -0
- data/test/unit/gateways/secure_pay_test.rb +78 -0
- data/test/unit/gateways/trans_first_test.rb +125 -0
- data/test/unit/gateways/trust_commerce_test.rb +57 -0
- data/test/unit/gateways/usa_epay_test.rb +117 -0
- data/test/unit/gateways/verifi_test.rb +91 -0
- data/test/unit/gateways/viaklix_test.rb +72 -0
- data/test/unit/integrations/action_view_helper_test.rb +54 -0
- data/test/unit/integrations/bogus_module_test.rb +16 -0
- data/test/unit/integrations/chronopay_module_test.rb +9 -0
- data/test/unit/integrations/gestpay_module_test.rb +10 -0
- data/test/unit/integrations/helpers/bogus_helper_test.rb +28 -0
- data/test/unit/integrations/helpers/chronopay_helper_test.rb +67 -0
- data/test/unit/integrations/helpers/gestpay_helper_test.rb +100 -0
- data/test/unit/integrations/helpers/nochex_helper_test.rb +53 -0
- data/test/unit/integrations/helpers/paypal_helper_test.rb +162 -0
- data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
- data/test/unit/integrations/nochex_module_test.rb +9 -0
- data/test/unit/integrations/notifications/chronopay_notification_test.rb +66 -0
- data/test/unit/integrations/notifications/gestpay_notification_test.rb +60 -0
- data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
- data/test/unit/integrations/notifications/notification_test.rb +41 -0
- data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
- data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
- data/test/unit/integrations/paypal_module_test.rb +24 -0
- data/test/unit/integrations/two_checkout_module_test.rb +9 -0
- data/test/unit/post_data_test.rb +55 -0
- data/test/unit/response_test.rb +14 -0
- data/test/unit/validateable_test.rb +56 -0
- metadata +160 -7
- metadata.gz.sig +0 -0
- data/lib/active_merchant/billing/gateways/payflow/f73e89fd.0 +0 -17
|
@@ -1,38 +1,32 @@
|
|
|
1
|
-
# Author:: Lucas Carlson (mailto:lucas@rufy.com)
|
|
2
|
-
# Copyright:: Copyright (c) 2005 Lucas Carlson
|
|
3
|
-
# License:: Distributes under the same terms as Ruby
|
|
4
|
-
|
|
5
1
|
require 'rexml/document'
|
|
6
2
|
|
|
7
3
|
module ActiveMerchant #:nodoc:
|
|
8
4
|
module Billing #:nodoc:
|
|
9
|
-
# TO USE:
|
|
10
5
|
# First, make sure you have everything setup correctly and all of your dependencies in place with:
|
|
11
6
|
#
|
|
12
7
|
# require 'rubygems'
|
|
13
|
-
# require 'money'
|
|
14
8
|
# require 'active_merchant'
|
|
15
9
|
#
|
|
16
|
-
#
|
|
17
|
-
#
|
|
18
|
-
# Using the money library, create a money object. Pass the dollar value in cents. In this case, $10 US becomes 1000.
|
|
10
|
+
# ActiveMerchant expects the amounts to be given as an Integer in cents. In this case, $10 US becomes 1000.
|
|
19
11
|
#
|
|
20
|
-
# tendollar =
|
|
12
|
+
# tendollar = 1000
|
|
21
13
|
#
|
|
22
14
|
# Next, create a credit card object using a TC approved test card.
|
|
23
15
|
#
|
|
24
|
-
# creditcard = ActiveMerchant::Billing::CreditCard.new(
|
|
16
|
+
# creditcard = ActiveMerchant::Billing::CreditCard.new(
|
|
25
17
|
# :number => '4111111111111111',
|
|
26
18
|
# :month => 8,
|
|
27
19
|
# :year => 2006,
|
|
28
20
|
# :first_name => 'Longbob',
|
|
29
21
|
# :last_name => 'Longsen'
|
|
30
|
-
#
|
|
22
|
+
# )
|
|
31
23
|
# options = {
|
|
32
|
-
# :login => '87654321',
|
|
33
24
|
# :order_id => '1230123',
|
|
34
25
|
# :email => 'bob@testbob.com',
|
|
35
|
-
# :address => { :address1 => '47 Bobway
|
|
26
|
+
# :address => { :address1 => '47 Bobway',
|
|
27
|
+
# :city => 'Bobville',
|
|
28
|
+
# :state => 'WA',
|
|
29
|
+
# :country => 'Australia',
|
|
36
30
|
# :zip => '2000'
|
|
37
31
|
# }
|
|
38
32
|
# :description => 'purchased items'
|
|
@@ -41,7 +35,7 @@ module ActiveMerchant #:nodoc:
|
|
|
41
35
|
# To finish setting up, create the active_merchant object you will be using, with the eWay gateway. If you have a
|
|
42
36
|
# functional eWay account, replace :login with your account info.
|
|
43
37
|
#
|
|
44
|
-
# gateway = ActiveMerchant::Billing::Base.gateway(:eway).new()
|
|
38
|
+
# gateway = ActiveMerchant::Billing::Base.gateway(:eway).new(:login => '87654321')
|
|
45
39
|
#
|
|
46
40
|
# Now we are ready to process our transaction
|
|
47
41
|
#
|
|
@@ -73,13 +67,66 @@ module ActiveMerchant #:nodoc:
|
|
|
73
67
|
LIVE_CVN_URL = 'https://www.eway.com.au/gateway_cvn/xmlpayment.asp'
|
|
74
68
|
|
|
75
69
|
MESSAGES = {
|
|
76
|
-
"00" => "Transaction
|
|
77
|
-
"
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
70
|
+
"00" => "Transaction Approved",
|
|
71
|
+
"01" => "Refer to Issuer",
|
|
72
|
+
"02" => "Refer to Issuer, special",
|
|
73
|
+
"03" => "No Merchant",
|
|
74
|
+
"04" => "Pick Up Card",
|
|
75
|
+
"05" => "Do Not Honour",
|
|
76
|
+
"06" => "Error",
|
|
77
|
+
"07" => "Pick Up Card, Special",
|
|
78
|
+
"08" => "Honour With Identification",
|
|
79
|
+
"09" => "Request In Progress",
|
|
80
|
+
"10" => "Approved For Partial Amount",
|
|
81
|
+
"11" => "Approved, VIP",
|
|
82
|
+
"12" => "Invalid Transaction",
|
|
83
|
+
"13" => "Invalid Amount",
|
|
84
|
+
"14" => "Invalid Card Number",
|
|
85
|
+
"15" => "No Issuer",
|
|
86
|
+
"16" => "Approved, Update Track 3",
|
|
87
|
+
"19" => "Re-enter Last Transaction",
|
|
88
|
+
"21" => "No Action Taken",
|
|
89
|
+
"22" => "Suspected Malfunction",
|
|
90
|
+
"23" => "Unacceptable Transaction Fee",
|
|
91
|
+
"25" => "Unable to Locate Record On File",
|
|
92
|
+
"30" => "Format Error",
|
|
93
|
+
"31" => "Bank Not Supported By Switch",
|
|
94
|
+
"33" => "Expired Card, Capture",
|
|
95
|
+
"34" => "Suspected Fraud, Retain Card",
|
|
96
|
+
"35" => "Card Acceptor, Contact Acquirer, Retain Card",
|
|
97
|
+
"36" => "Restricted Card, Retain Card",
|
|
98
|
+
"37" => "Contact Acquirer Security Department, Retain Card",
|
|
99
|
+
"38" => "PIN Tries Exceeded, Capture",
|
|
100
|
+
"39" => "No Credit Account",
|
|
101
|
+
"40" => "Function Not Supported",
|
|
102
|
+
"41" => "Lost Card",
|
|
103
|
+
"42" => "No Universal Account",
|
|
104
|
+
"43" => "Stolen Card",
|
|
105
|
+
"44" => "No Investment Account",
|
|
106
|
+
"51" => "Insufficient Funds",
|
|
107
|
+
"52" => "No Cheque Account",
|
|
108
|
+
"53" => "No Savings Account",
|
|
109
|
+
"54" => "Expired Card",
|
|
110
|
+
"55" => "Incorrect PIN",
|
|
111
|
+
"56" => "No Card Record",
|
|
112
|
+
"57" => "Function Not Permitted to Cardholder",
|
|
113
|
+
"58" => "Function Not Permitted to Terminal",
|
|
114
|
+
"59" => "Suspected Fraud",
|
|
115
|
+
"60" => "Acceptor Contact Acquirer",
|
|
116
|
+
"61" => "Exceeds Withdrawal Limit",
|
|
117
|
+
"62" => "Restricted Card",
|
|
118
|
+
"63" => "Security Violation",
|
|
119
|
+
"64" => "Original Amount Incorrect",
|
|
120
|
+
"66" => "Acceptor Contact Acquirer, Security",
|
|
121
|
+
"67" => "Capture Card",
|
|
122
|
+
"75" => "PIN Tries Exceeded",
|
|
123
|
+
"82" => "CVV Validation Error",
|
|
124
|
+
"90" => "Cutoff In Progress",
|
|
125
|
+
"91" => "Card Issuer Unavailable",
|
|
126
|
+
"92" => "Unable To Route Transaction",
|
|
127
|
+
"93" => "Cannot Complete, Violation Of The Law",
|
|
128
|
+
"94" => "Duplicate Transaction",
|
|
129
|
+
"96" => "System Error"
|
|
83
130
|
}
|
|
84
131
|
|
|
85
132
|
attr_reader :url
|
|
@@ -87,6 +134,10 @@ module ActiveMerchant #:nodoc:
|
|
|
87
134
|
attr_reader :options
|
|
88
135
|
|
|
89
136
|
self.money_format = :cents
|
|
137
|
+
self.supported_countries = ['AU']
|
|
138
|
+
self.supported_cardtypes = [:visa, :master]
|
|
139
|
+
self.homepage_url = 'http://www.eway.com.au/'
|
|
140
|
+
self.display_name = 'eWAY'
|
|
90
141
|
|
|
91
142
|
def initialize(options = {})
|
|
92
143
|
requires!(options, :login)
|
|
@@ -109,10 +160,6 @@ module ActiveMerchant #:nodoc:
|
|
|
109
160
|
commit(money, post)
|
|
110
161
|
end
|
|
111
162
|
|
|
112
|
-
def self.supported_cardtypes
|
|
113
|
-
[:visa, :master]
|
|
114
|
-
end
|
|
115
|
-
|
|
116
163
|
private
|
|
117
164
|
def add_creditcard(post, creditcard)
|
|
118
165
|
post[:CardNumber] = creditcard.number
|
|
@@ -127,7 +174,7 @@ module ActiveMerchant #:nodoc:
|
|
|
127
174
|
|
|
128
175
|
def add_address(post, options)
|
|
129
176
|
if address = options[:billing_address] || options[:address]
|
|
130
|
-
post[:CustomerAddress] = address[:address1]
|
|
177
|
+
post[:CustomerAddress] = [ address[:address1], address[:address2], address[:city], address[:state], address[:country] ].compact.join(', ')
|
|
131
178
|
post[:CustomerPostcode] = address[:zip]
|
|
132
179
|
end
|
|
133
180
|
end
|
|
@@ -162,9 +209,11 @@ module ActiveMerchant #:nodoc:
|
|
|
162
209
|
|
|
163
210
|
success = (response[:ewaytrxnstatus] == "True")
|
|
164
211
|
message = message_from(response[:ewaytrxnerror])
|
|
212
|
+
test = /\(Test( CVN)? Gateway\)/ === response[:ewaytrxnerror]
|
|
165
213
|
|
|
166
214
|
Response.new(success, message, @response,
|
|
167
|
-
:authorization => response[:ewayauthcode]
|
|
215
|
+
:authorization => response[:ewayauthcode],
|
|
216
|
+
:test => test
|
|
168
217
|
)
|
|
169
218
|
end
|
|
170
219
|
|
|
@@ -184,7 +233,6 @@ module ActiveMerchant #:nodoc:
|
|
|
184
233
|
# </ewayResponse>
|
|
185
234
|
|
|
186
235
|
response = {}
|
|
187
|
-
|
|
188
236
|
xml = REXML::Document.new(xml)
|
|
189
237
|
xml.elements.each('//ewayResponse/*') do |node|
|
|
190
238
|
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
class ExactGateway < Gateway
|
|
4
|
+
URL = 'https://secure2.e-xact.com/vplug-in/transaction/rpc-enc/service.asmx'
|
|
5
|
+
|
|
6
|
+
API_VERSION = "8.5"
|
|
7
|
+
|
|
8
|
+
TEST_LOGINS = [ {:login => "A00049-01", :password => "test1"},
|
|
9
|
+
{:login => "A00427-01", :password => "testus"} ]
|
|
10
|
+
|
|
11
|
+
TRANSACTIONS = { :sale => "00",
|
|
12
|
+
:authorization => "01",
|
|
13
|
+
:capture => "32",
|
|
14
|
+
:credit => "34" }
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
ENVELOPE_NAMESPACES = { 'xmlns:xsd' => 'http://www.w3.org/2001/XMLSchema',
|
|
18
|
+
'xmlns:env' => 'http://schemas.xmlsoap.org/soap/envelope/',
|
|
19
|
+
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
SEND_AND_COMMIT_ATTRIBUTES = { 'xmlns:n1' => "http://secure2.e-xact.com/vplug-in/transaction/rpc-enc/Request",
|
|
23
|
+
'env:encodingStyle' => 'http://schemas.xmlsoap.org/soap/encoding/'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
SEND_AND_COMMIT_SOURCE_ATTRIBUTES = { 'xmlns:n2' => 'http://secure2.e-xact.com/vplug-in/transaction/rpc-enc/encodedTypes',
|
|
27
|
+
'xsi:type' => 'n2:Transaction'
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
POST_HEADERS = { 'soapAction' => "http://secure2.e-xact.com/vplug-in/transaction/rpc-enc/SendAndCommit",
|
|
31
|
+
'Content-Type' => 'text/xml'
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
SUCCESS = "true"
|
|
35
|
+
|
|
36
|
+
SENSITIVE_FIELDS = [ :verification_str2, :expiry_date, :card_number ]
|
|
37
|
+
|
|
38
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :jcb, :discover]
|
|
39
|
+
self.supported_countries = ['CA', 'US']
|
|
40
|
+
self.homepage_url = 'http://www.e-xact.com'
|
|
41
|
+
self.display_name = 'E-xact'
|
|
42
|
+
|
|
43
|
+
attr_reader :url
|
|
44
|
+
attr_reader :response
|
|
45
|
+
attr_reader :options
|
|
46
|
+
|
|
47
|
+
def initialize(options = {})
|
|
48
|
+
requires!(options, :login, :password)
|
|
49
|
+
@options = options
|
|
50
|
+
|
|
51
|
+
if TEST_LOGINS.include?( { :login => options[:login], :password => options[:password] } )
|
|
52
|
+
@test_mode = true
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
super
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test?
|
|
59
|
+
@test_mode || Base.gateway_mode == :test
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def authorize(money, credit_card, options = {})
|
|
63
|
+
if result = test_result_from_cc_number(credit_card.number)
|
|
64
|
+
return result
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
commit(:authorization, build_sale_or_authorization_request(money, credit_card, options))
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def purchase(money, credit_card, options = {})
|
|
71
|
+
if result = test_result_from_cc_number(credit_card.number)
|
|
72
|
+
return result
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
commit(:sale, build_sale_or_authorization_request(money, credit_card, options))
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def capture(money, authorization, options = {})
|
|
79
|
+
commit(:capture, build_capture_or_credit_request(money, authorization, options))
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def credit(money, authorization, options = {})
|
|
83
|
+
commit(:credit, build_capture_or_credit_request(money, authorization, options))
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
private
|
|
87
|
+
def build_request(action, body)
|
|
88
|
+
xml = Builder::XmlMarkup.new
|
|
89
|
+
|
|
90
|
+
xml.instruct!
|
|
91
|
+
xml.tag! 'env:Envelope', ENVELOPE_NAMESPACES do
|
|
92
|
+
xml.tag! 'env:Body' do
|
|
93
|
+
xml.tag! 'n1:SendAndCommit', SEND_AND_COMMIT_ATTRIBUTES do
|
|
94
|
+
xml.tag! 'SendAndCommitSource', SEND_AND_COMMIT_SOURCE_ATTRIBUTES do
|
|
95
|
+
add_credentials(xml)
|
|
96
|
+
add_transaction_type(xml, action)
|
|
97
|
+
xml << body
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
xml.target!
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def build_sale_or_authorization_request(money, credit_card, options)
|
|
106
|
+
xml = Builder::XmlMarkup.new
|
|
107
|
+
|
|
108
|
+
add_amount(xml, money)
|
|
109
|
+
add_credit_card(xml, credit_card)
|
|
110
|
+
add_customer_data(xml, options)
|
|
111
|
+
add_invoice(xml, options)
|
|
112
|
+
|
|
113
|
+
xml.target!
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def build_capture_or_credit_request(money, identification, options)
|
|
117
|
+
xml = Builder::XmlMarkup.new
|
|
118
|
+
|
|
119
|
+
add_identification(xml, identification)
|
|
120
|
+
add_amount(xml, money)
|
|
121
|
+
add_customer_data(xml, options)
|
|
122
|
+
|
|
123
|
+
xml.target!
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def add_credentials(xml)
|
|
127
|
+
xml.tag! 'ExactID', @options[:login]
|
|
128
|
+
xml.tag! 'Password', @options[:password]
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def add_transaction_type(xml, action)
|
|
132
|
+
xml.tag! 'Transaction_Type', TRANSACTIONS[action]
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def add_identification(xml, identification)
|
|
136
|
+
authorization_num, transaction_tag = identification.split(';')
|
|
137
|
+
|
|
138
|
+
xml.tag! 'Authorization_Num', authorization_num
|
|
139
|
+
xml.tag! 'Transaction_Tag', transaction_tag
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
def add_amount(xml, money)
|
|
143
|
+
xml.tag! 'DollarAmount', amount(money)
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def add_credit_card(xml, credit_card)
|
|
147
|
+
xml.tag! 'Card_Number', credit_card.number
|
|
148
|
+
xml.tag! 'Expiry_Date', expdate(credit_card)
|
|
149
|
+
xml.tag! 'CardHoldersName', credit_card.name
|
|
150
|
+
|
|
151
|
+
if credit_card.verification_value?
|
|
152
|
+
xml.tag! 'CVD_Presence_Ind', '1'
|
|
153
|
+
xml.tag! 'VerificationStr2', credit_card.verification_value
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def add_customer_data(xml, options)
|
|
158
|
+
xml.tag! 'Customer_Ref', options[:customer]
|
|
159
|
+
xml.tag! 'Client_IP', options[:ip]
|
|
160
|
+
xml.tag! 'Client_Email', options[:email]
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def add_address(xml, options)
|
|
164
|
+
if address = options[:billing_address] || options[:address]
|
|
165
|
+
xml.tag! 'ZipCode', address[:zip]
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def add_invoice(xml, options)
|
|
170
|
+
xml.tag! 'Reference_No', options[:order_id]
|
|
171
|
+
xml.tag! 'Reference_3', options[:description]
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def expdate(credit_card)
|
|
175
|
+
"#{format(credit_card.month, :two_digits)}#{format(credit_card.year, :two_digits)}"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def commit(action, request)
|
|
179
|
+
data = ssl_post(URL, build_request(action, request), POST_HEADERS)
|
|
180
|
+
|
|
181
|
+
@response = parse(data)
|
|
182
|
+
|
|
183
|
+
success = @response[:transaction_approved] == SUCCESS
|
|
184
|
+
|
|
185
|
+
authorization = if @response[:authorization_num] && @response[:transaction_tag]
|
|
186
|
+
"#{response[:authorization_num]};#{response[:transaction_tag]}"
|
|
187
|
+
else
|
|
188
|
+
''
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
Response.new(success, message_from(@response), @response,
|
|
192
|
+
:test => test?,
|
|
193
|
+
:authorization => authorization
|
|
194
|
+
)
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
def message_from(response)
|
|
198
|
+
if response[:faultcode] && response[:faultstring]
|
|
199
|
+
response[:faultstring]
|
|
200
|
+
elsif response[:error_number] != '0'
|
|
201
|
+
response[:error_description]
|
|
202
|
+
else
|
|
203
|
+
result = response[:exact_message] || ''
|
|
204
|
+
result << " - #{response[:bank_message]}" unless response[:bank_message].blank?
|
|
205
|
+
result
|
|
206
|
+
end
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def parse(xml)
|
|
210
|
+
response = {}
|
|
211
|
+
xml = REXML::Document.new(xml)
|
|
212
|
+
|
|
213
|
+
if root = REXML::XPath.first(xml, "//types:TransactionResult")
|
|
214
|
+
parse_elements(response, root)
|
|
215
|
+
elsif root = REXML::XPath.first(xml, "//soap:Fault")
|
|
216
|
+
parse_elements(response, root)
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
response.delete_if{ |k,v| SENSITIVE_FIELDS.include?(k) }
|
|
220
|
+
end
|
|
221
|
+
|
|
222
|
+
def parse_elements(response, root)
|
|
223
|
+
root.elements.to_a.each do |node|
|
|
224
|
+
response[node.name.gsub(/EXact/, 'Exact').underscore.to_sym] = (node.text || '').strip
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
@@ -1,27 +1,3 @@
|
|
|
1
|
-
# Portions of the LinkPoint Gateway by Ryan Heneise
|
|
2
|
-
#--
|
|
3
|
-
# Copyright (c) 2005 Tobias Luetke
|
|
4
|
-
#
|
|
5
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
|
6
|
-
# a copy of this software and associated documentation files (the
|
|
7
|
-
# "Software"), to deal in the Software without restriction, including
|
|
8
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
|
9
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
|
10
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
|
11
|
-
# the following conditions:
|
|
12
|
-
#
|
|
13
|
-
# The above copyright notice and this permission notice shall be
|
|
14
|
-
# included in all copies or substantial portions of the Software.
|
|
15
|
-
#
|
|
16
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
19
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
20
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
21
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
22
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
#++
|
|
24
|
-
|
|
25
1
|
require 'rexml/document'
|
|
26
2
|
|
|
27
3
|
module ActiveMerchant #:nodoc:
|
|
@@ -130,11 +106,12 @@ module ActiveMerchant #:nodoc:
|
|
|
130
106
|
|
|
131
107
|
# We don't have the certificate to verify LinkPoint
|
|
132
108
|
self.ssl_strict = false
|
|
109
|
+
|
|
110
|
+
self.supported_countries = ['US']
|
|
111
|
+
self.supported_cardtypes = [:visa, :master, :american_express, :discover]
|
|
112
|
+
self.homepage_url = 'http://www.linkpoint.com/'
|
|
113
|
+
self.display_name = 'LinkPoint'
|
|
133
114
|
|
|
134
|
-
# @options = {
|
|
135
|
-
# :store_number => options[:login],
|
|
136
|
-
# :result => test? ? "GOOD" : "LIVE"
|
|
137
|
-
# }.update(options)
|
|
138
115
|
def initialize(options = {})
|
|
139
116
|
requires!(options, :login)
|
|
140
117
|
|
|
@@ -237,11 +214,7 @@ module ActiveMerchant #:nodoc:
|
|
|
237
214
|
)
|
|
238
215
|
commit(money, nil, options)
|
|
239
216
|
end
|
|
240
|
-
|
|
241
|
-
def self.supported_cardtypes
|
|
242
|
-
[:visa, :master, :discover, :american_express]
|
|
243
|
-
end
|
|
244
|
-
|
|
217
|
+
|
|
245
218
|
def test?
|
|
246
219
|
@options[:test] || Base.gateway_mode == :test
|
|
247
220
|
end
|