lib/active_merchant/billing/gateways/card_stream.rb in jelaniharris-activemerchant-1.24.1 vs lib/active_merchant/billing/gateways/card_stream.rb in jelaniharris-activemerchant-1.29.1
- old
+ new
@@ -1,37 +1,37 @@
module ActiveMerchant #:nodoc:
module Billing #:nodoc:
#
# CardStream supports the following credit cards, which are auto-detected by
- # the gateway based on the card number used:
- # * AM American Express
- # * Diners Club
- # * Electron
- # * JCB
- # * UK Maestro
- # * Maestro International
- # * Mastercard
- # * Solo
- # * Style
- # * Switch
- # * Visa Credit
- # * Visa Debit
- # * Visa Purchasing
+ # the gateway based on the card number used:
+ # * AM American Express
+ # * Diners Club
+ # * Electron
+ # * JCB
+ # * UK Maestro
+ # * Maestro International
+ # * Mastercard
+ # * Solo
+ # * Style
+ # * Switch
+ # * Visa Credit
+ # * Visa Debit
+ # * Visa Purchasing
#
class CardStreamGateway < Gateway
- URL = 'https://gateway.cardstream.com/process.ashx'
-
+ self.live_url = self.test_url = 'https://gateway.cardstream.com/process.ashx'
+
self.money_format = :cents
self.default_currency = 'GBP'
self.supported_countries = ['GB']
self.supported_cardtypes = [:visa, :master, :american_express, :diners_club, :discover, :jcb, :maestro, :solo, :switch]
self.homepage_url = 'http://www.cardstream.com/'
self.display_name = 'CardStream'
APPROVED = '00'
- CURRENCY_CODES = {
+ CURRENCY_CODES = {
"AUD"=> '036',
"CAD"=> '124',
"CZK"=> '203',
"DKK"=> '208',
"HKD"=> '344',
@@ -43,72 +43,71 @@
"CHF"=> '756',
"GBP"=> '826',
"USD"=> '840',
"EUR"=> '978'
}
-
+
TRANSACTIONS = {
:purchase => 'ESALE_KEYED',
:refund => 'EREFUND_KEYED',
:authorization => 'ESALE_KEYED'
}
-
+
CVV_CODE = {
- '0' => 'U',
+ '0' => 'U',
'1' => 'P',
'2' => 'M',
'4' => 'N'
}
-
- # 0 - No additional information available.
- # 1 - Postcode not checked.
- # 2 - Postcode matched.
- # 4 - Postcode not matched.
+
+ # 0 - No additional information available.
+ # 1 - Postcode not checked.
+ # 2 - Postcode matched.
+ # 4 - Postcode not matched.
# 8 - Postcode partially matched.
AVS_POSTAL_MATCH = {
"0" => nil,
"1" => nil,
"2" => "Y",
"4" => "N",
"8" => "N"
}
-
- # 0 - No additional information available.
- # 1 - Address numeric not checked.
- # 2 - Address numeric matched.
- # 4 - Address numeric not matched.
+
+ # 0 - No additional information available.
+ # 1 - Address numeric not checked.
+ # 2 - Address numeric matched.
+ # 4 - Address numeric not matched.
# 8 - Address numeric partially matched.
AVS_STREET_MATCH = {
"0" => nil,
"1" => nil,
"2" => "Y",
"4" => "N",
"8" => "N"
}
-
+
def initialize(options = {})
requires!(options, :login, :password)
- @options = options
super
end
def purchase(money, credit_card, options = {})
requires!(options, :order_id)
-
+
post = {}
-
+
add_amount(post, money, options)
add_invoice(post, money, credit_card, options)
add_credit_card(post, credit_card)
add_address(post, options)
add_customer_data(post, options)
commit(:purchase, post)
end
-
+
private
-
+
def add_amount(post, money, options)
add_pair(post, :Amount, amount(money), :required => true)
add_pair(post, :CurrencyCode, currency_code(options[:currency] || currency(money)), :required => true)
end
@@ -117,11 +116,11 @@
add_pair(post, :BillingPhoneNumber, options[:phone])
end
def add_address(post, options)
address = options[:billing_address] || options[:address]
-
+
return if address.nil?
add_pair(post, :BillingStreet, address[:address1])
add_pair(post, :BillingHouseNumber, address[:address2])
add_pair(post, :BillingCity, address[:city])
@@ -130,37 +129,37 @@
end
def add_invoice(post, money, credit_card, options)
add_pair(post, :TransactionUnique, options[:order_id], :required => true)
add_pair(post, :OrderDesc, options[:description] || options[:order_id], :required => true)
-
+
if [ 'american_express', 'diners_club' ].include?(card_brand(credit_card).to_s)
- add_pair(post, :AEIT1Quantity, 1)
- add_pair(post, :AEIT1Description, (options[:description] || options[:order_id]).slice(0, 15))
+ add_pair(post, :AEIT1Quantity, 1)
+ add_pair(post, :AEIT1Description, (options[:description] || options[:order_id]).slice(0, 15))
add_pair(post, :AEIT1GrossValue, amount(money))
end
end
def add_credit_card(post, credit_card)
add_pair(post, :CardName, credit_card.name, :required => true)
add_pair(post, :CardNumber, credit_card.number, :required => true)
-
+
add_pair(post, :ExpiryDateMM, format(credit_card.month, :two_digits), :required => true)
add_pair(post, :ExpiryDateYY, format(credit_card.year, :two_digits), :required => true)
-
+
if requires_start_date_or_issue_number?(credit_card)
add_pair(post, :StartDateMM, format(credit_card.start_month, :two_digits))
add_pair(post, :StartDateYY, format(credit_card.start_year, :two_digits))
-
+
add_pair(post, :IssueNumber, credit_card.issue_number)
end
-
+
add_pair(post, :CV2, credit_card.verification_value)
end
-
+
def commit(action, parameters)
- response = parse( ssl_post(URL, post_data(action, parameters)) )
+ response = parse( ssl_post(self.live_url, post_data(action, parameters)) )
Response.new(response[:response_code] == APPROVED, message_from(response), response,
:test => test?,
:authorization => response[:cross_reference],
:cvv_result => CVV_CODE[ response[:avscv2_response_code].to_s[0, 1] ],
@@ -186,38 +185,34 @@
:EchoAmount => "YES",
:EchoAVSCV2ResponseCode => "YES",
:ReturnAVSCV2Message => "YES",
:CountryCode => '826' # 826 for UK based merchant
)
-
+
add_pair(parameters, :Dispatch, action == :authorization ? "LATER" : "NOW")
-
+
parameters.collect { |key, value| "VP#{key}=#{CGI.escape(value.to_s)}" }.join("&")
end
-
- # VPCrossReference
- # The value in VPCrossReference on a success transaction will contain
- # a unique reference that you may use to run future transactions.
- # Please note that cross reference transactions must come a static IP
- # addressed that has been pre-registered with Cardstream. To
- # register an IP address please send it to support@cardstream.com
- # with your Cardstream issued merchant ID and it will be added to
+
+ # VPCrossReference
+ # The value in VPCrossReference on a success transaction will contain
+ # a unique reference that you may use to run future transactions.
+ # Please note that cross reference transactions must come a static IP
+ # addressed that has been pre-registered with Cardstream. To
+ # register an IP address please send it to support@cardstream.com
+ # with your Cardstream issued merchant ID and it will be added to
# your account.
def parse(body)
result = {}
pairs = body.split("&")
pairs.each do |pair|
a = pair.split("=")
result[a[0].gsub(/^VP/,'').underscore.to_sym] = a[1]
end
-
+
result
end
- def test?
- @options[:test] || Base.gateway_mode == :test
- end
-
def currency_code(currency)
CURRENCY_CODES[currency]
end
def add_pair(post, key, value, options = {})