exact4r
A gem which provides access to E-xact’s Web Services API, allowing the submission of financial transactions via REST, JSON or SOAP.
Getting Started
To submit requests to our transaction processing service, you must first have a Gateway ID, and a password. Test logins are as follows:
Account 1: :gateway_id => "A00049-01", :password => "test1"
Account 2: :gateway_id => "A00427-01", :password => "testus"
1. Submit a transaction
require 'rubygems'
require 'exact4r'
# build a purchase request
request = EWS::Transaction::Request.new({
:transaction_type => :purchase,
:amount => 10.50,
:cardholder_name => "Simon Brown",
:cc_number => "4111111111111111",
:cc_expiry => "1012", # MUST be MMYY format
:gateway_id => "XXXXXXX", # which gateway to submit the request to
:password => "YYYYYY" # your password for that gateway
})
transporter = EWS::Transporter.new
response = transporter.submit(request) # submits using REST (XML) by default
# submit using JSON, or
response = transporter.submit(request, :json)
# submit using SOAP, or
response = transporter.submit(request, :soap)
# submit explicitly via REST
response = transporter.submit(request, :rest)
# The response object is independent of type of transport chosen.
# We decode the payload into a regular object
response.transaction_tag # 1234
response.exact_resp_code # "00"
response. # "Transaction Normal"
response.bank_resp_code # "00"
response. # "APPROVED"
2. Find information on an existing transaction
require 'rubygems'
require 'exact4r'
# build a purchase request
request = EWS::Transaction::Request.new({
:transaction_type => :purchase,
:amount => 10.50,
:cardholder_name => "Simon Brown",
:cc_number => "4111111111111111",
:cc_expiry => "1012", # MUST be MMYY format
:gateway_id => "XXXXXXX", # which gateway to submit the request to
:password => "YYYYYY" # your password for that gateway
})
transporter = EWS::Transporter.new
response = transporter.submit(request) # submits using REST (XML) by default
# you need to know the transaction tag of the transaction you are looking for
find_request = EWS::Transaction::Request.new({
:transaction_type => :transaction_details,
:transaction_tag => response.transaction_tag,
:gateway_id => "XXXXXXX",
:password => "YYYYYY"
})
find_response = transporter.submit(find_request, :json) # again, can choose your transport type as before
find_response.cc_number # 4111111111111111
find_response.amount # 10.50
3. Re-using a Transporter
require 'rubygems'
require 'exact4r'
# The transporter object can be re-used across multiple transactions, so set it up once
# and forget about it.
# In this example, we will continue to use E-xact's default web-service URL, but we
# will specify a default transport_type of :soap
transporter = EWS::Transporter.new("https://api.e-xact.com/", {:transaction_type => :soap})
# now let's submit do a recurring seed purchase...
rsp_req = EWS::Transaction::Request.new({
:transaction_type => :recurring_seed_purchase,
:amount => 12.00,
:cardholder_name => "Simon Brown",
:cc_number => "4111111111111111",
:cc_expiry => "1012",
:gateway_id => "XXXXXX",
:password => "YYYYYY"
})
rsp_resp = transporter.submit(rsp_req)
raise "Seed Purchase failed" unless rsp_resp.approved?
# ...then do multiple refunds against it
1.upto(10) do
rf_req = EWS::Transaction::Request.new({
:transaction_type => :tagged_refund,
:transaction_tag => rsp_resp.transaction_tag, # need to know which transaction we're refunding against...
:authorization_num => rsp_resp., # and its authorization_num
:amount => 1.00, # refund a dollar at a time
:gateway_id => "XXXXXX",
:password => "YYYYYY"
})
rf_resp = transporter.submit(rf_req)
raise "Refund failed: #{rf_resp.exact_resp_code}, #{rf_resp.}" unless rf_resp.approved?
end
4. Using the AVS API
Allowable AVS params are:
-
:avs_street_address => “7501ELMST.”
-
:avs_unit_no => “801”
-
:avs_po_box => nil # P.O. Box or street address may be specified, but not both
-
:avs_postal_code => “90210”
-
:avs_test_flag => “X” # AVS test flag (optional)
Test Flags
In order to simulate an AVS response in the test environment, set the :avs_test_flag
to the AVS result code you would like returned. The AVS result is a one-character response that indicates the degree of match for the provided address. The following AVS responses are currently supported:
North American Response Codes
AVS Code - ABS Definition - Explanation
-
X - Exact match, 9 digit zip - Street Address, and 9 digit ZIP Code match
-
Y - Exact match, 5 digit zip - Street Address, and 5 digit ZIP Code match
-
A - Partial match - Street Address matches, ZIP Code does not
-
W - Partial match - ZIP Code matches, Street Address does not
-
Z - Partial match - 5 digit ZIP Code match only
-
N - No match - No Address or ZIP Code match
-
U - Unavailable - Address information is unavailable for that account number, or the card issuer does not support
-
G - Service Not supported, non-US Issuer does not participate
-
R - Retry - Issuer system unavailable, retry later
-
E - Not a mail or phone order
-
S - Service not supported
International Response Codes
AVS Code - ABS Definition and Explanation
-
G - Global non-AVS participant
-
B - Address matches only
-
C - Address and Postal Code do not match
-
D - Address and Postal Code match
-
F - Address and Postal Code match (UK only)
-
I - Address information not verified for international transaction
-
M - Address and Postal Code match
-
P - Postal Code matches only
Code Sample
avs_params = {
:avs_test_flag => 'N',
:avs_street_address => '123BROWNSTREET',
:avs_unit_no => '4,
:avs_po_box => nil,
:avs_postal_code => '902101234'
}
tx_params = {
:transaction_type => :purchase,
:amount => 10.50,
:cardholder_name => "Simon Brown",
:cc_number => "4111111111111111",
:cc_expiry => "1012",
:gateway_id => "XXXXXXX",
:password => "YYYYYY"
}.merge(avs_params)
request = EWS::Transaction::Request.new(tx_params)
transporter = EWS::Transporter.new("https://api.e-xact.com/")
response = transporter.submit(request)
response.cc_verification_str1.should == "N123BROWNSTREET4902101234"
response.avs.should == N