tlconnor-activemerchant 1.20.4
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/CHANGELOG +805 -0
- data/CONTRIBUTORS +274 -0
- data/MIT-LICENSE +20 -0
- data/gem-public_cert.pem +20 -0
- data/lib/active_merchant.rb +63 -0
- data/lib/active_merchant/billing.rb +9 -0
- data/lib/active_merchant/billing/avs_result.rb +98 -0
- data/lib/active_merchant/billing/base.rb +57 -0
- data/lib/active_merchant/billing/check.rb +68 -0
- data/lib/active_merchant/billing/credit_card.rb +264 -0
- data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +129 -0
- data/lib/active_merchant/billing/cvv_result.rb +38 -0
- data/lib/active_merchant/billing/expiry_date.rb +34 -0
- data/lib/active_merchant/billing/gateway.rb +170 -0
- data/lib/active_merchant/billing/gateways.rb +18 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +694 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +944 -0
- data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +167 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +388 -0
- data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
- data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +142 -0
- data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
- data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +308 -0
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +21 -0
- data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
- data/lib/active_merchant/billing/gateways/certo_direct.rb +279 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +430 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
- data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
- data/lib/active_merchant/billing/gateways/elavon.rb +135 -0
- data/lib/active_merchant/billing/gateways/epay.rb +274 -0
- data/lib/active_merchant/billing/gateways/eway.rb +277 -0
- data/lib/active_merchant/billing/gateways/eway_managed.rb +265 -0
- data/lib/active_merchant/billing/gateways/exact.rb +227 -0
- data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
- data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
- data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
- data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
- data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
- data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +157 -0
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
- data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
- data/lib/active_merchant/billing/gateways/moneris.rb +239 -0
- data/lib/active_merchant/billing/gateways/nab_transact.rb +244 -0
- data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
- data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
- data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
- data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
- data/lib/active_merchant/billing/gateways/ogone.rb +330 -0
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +277 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +344 -0
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +397 -0
- data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
- data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +261 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +208 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
- data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
- data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
- data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +354 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
- data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +229 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
- data/lib/active_merchant/billing/gateways/paystation.rb +201 -0
- data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
- data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
- data/lib/active_merchant/billing/gateways/qbms.rb +297 -0
- data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +298 -0
- data/lib/active_merchant/billing/gateways/realex.rb +315 -0
- data/lib/active_merchant/billing/gateways/sage.rb +146 -0
- data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
- data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
- data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
- data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
- data/lib/active_merchant/billing/gateways/samurai.rb +121 -0
- data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +280 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +458 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
- data/lib/active_merchant/billing/gateways/stripe.rb +244 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
- data/lib/active_merchant/billing/gateways/transax.rb +25 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
- data/lib/active_merchant/billing/gateways/usa_epay.rb +23 -0
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1496 -0
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +206 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
- data/lib/active_merchant/billing/integrations.rb +17 -0
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +72 -0
- data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +38 -0
- data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +228 -0
- data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +340 -0
- data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
- data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
- data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
- data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
- data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
- data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
- data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
- data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
- data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
- data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
- data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
- data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
- data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
- data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
- data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
- data/lib/active_merchant/billing/integrations/dwolla.rb +30 -0
- data/lib/active_merchant/billing/integrations/dwolla/helper.rb +31 -0
- data/lib/active_merchant/billing/integrations/dwolla/notification.rb +55 -0
- data/lib/active_merchant/billing/integrations/dwolla/return.rb +38 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
- data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
- data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
- data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
- data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
- data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
- data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/helper.rb +113 -0
- data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
- data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
- data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
- data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
- data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
- data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
- data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
- data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
- data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
- data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
- data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/notification.rb +62 -0
- data/lib/active_merchant/billing/integrations/payflow_link.rb +21 -0
- data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +100 -0
- data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +78 -0
- data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
- data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
- data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
- data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
- data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
- data/lib/active_merchant/billing/integrations/return.rb +42 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +127 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
- data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
- data/lib/active_merchant/billing/integrations/two_checkout.rb +22 -0
- data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
- data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
- data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
- data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
- data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
- data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
- data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
- data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
- data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
- data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
- data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
- data/lib/active_merchant/billing/response.rb +32 -0
- data/lib/active_merchant/version.rb +3 -0
- data/lib/activemerchant.rb +1 -0
- data/lib/support/gateway_support.rb +58 -0
- data/lib/support/outbound_hosts.rb +25 -0
- metadata +411 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
module ActiveMerchant #:nodoc:
|
|
3
|
+
module Billing #:nodoc:
|
|
4
|
+
module Integrations #:nodoc:
|
|
5
|
+
module Bogus
|
|
6
|
+
autoload :Return, 'active_merchant/billing/integrations/bogus/return.rb'
|
|
7
|
+
autoload :Helper, 'active_merchant/billing/integrations/bogus/helper.rb'
|
|
8
|
+
autoload :Notification, 'active_merchant/billing/integrations/bogus/notification.rb'
|
|
9
|
+
|
|
10
|
+
mattr_accessor :service_url
|
|
11
|
+
self.service_url = 'http://www.bogus.com'
|
|
12
|
+
|
|
13
|
+
def self.notification(post, options = {})
|
|
14
|
+
Notification.new(post)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.return(query_string, options = {})
|
|
18
|
+
Return.new(query_string)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Bogus
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
mapping :account, 'account'
|
|
7
|
+
mapping :order, 'order'
|
|
8
|
+
mapping :amount, 'amount'
|
|
9
|
+
mapping :currency, 'currency'
|
|
10
|
+
mapping :customer, :first_name => 'first_name',
|
|
11
|
+
:last_name => 'last_name'
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
module ActiveMerchant #:nodoc:
|
|
3
|
+
module Billing #:nodoc:
|
|
4
|
+
module Integrations #:nodoc:
|
|
5
|
+
module Chronopay
|
|
6
|
+
autoload :Return, 'active_merchant/billing/integrations/chronopay/return.rb'
|
|
7
|
+
autoload :Helper, 'active_merchant/billing/integrations/chronopay/helper.rb'
|
|
8
|
+
autoload :Notification, 'active_merchant/billing/integrations/chronopay/notification.rb'
|
|
9
|
+
|
|
10
|
+
mattr_accessor :service_url
|
|
11
|
+
self.service_url = 'https://secure.chronopay.com/index_shop.cgi'
|
|
12
|
+
|
|
13
|
+
def self.notification(post, options = {})
|
|
14
|
+
Notification.new(post)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self.return(query_string, options = {})
|
|
18
|
+
Return.new(query_string)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Chronopay
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
# All currently supported checkout languages:
|
|
7
|
+
# es (Spanish)
|
|
8
|
+
# en (English)
|
|
9
|
+
# de (German)
|
|
10
|
+
# pt (Portuguese)
|
|
11
|
+
# lv (Latvian)
|
|
12
|
+
# cn1 (Chinese Version 1)
|
|
13
|
+
# cn2 (Chinese version 2)
|
|
14
|
+
# nl (Dutch)
|
|
15
|
+
# ru (Russian)
|
|
16
|
+
COUNTRIES_FOR_LANG = {
|
|
17
|
+
'ES' => %w( AR BO CL CO CR CU DO EC SV GQ GT HN MX NI PA PY PE ES UY VE),
|
|
18
|
+
'DE' => %w( DE AT CH LI ),
|
|
19
|
+
'PT' => %w( AO BR CV GW MZ PT ST TL),
|
|
20
|
+
'RU' => %w( BY KG KZ RU ),
|
|
21
|
+
'LV' => %w( LV ),
|
|
22
|
+
'CN1' => %w( CN ),
|
|
23
|
+
'NL' => %w( NL )
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
LANG_FOR_COUNTRY = COUNTRIES_FOR_LANG.inject(Hash.new("EN")) do |memo, (lang, countries)|
|
|
27
|
+
countries.each do |code|
|
|
28
|
+
memo[code] = lang
|
|
29
|
+
end
|
|
30
|
+
memo
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
self.country_format = :alpha3
|
|
35
|
+
|
|
36
|
+
def initialize(order, account, options = {})
|
|
37
|
+
super
|
|
38
|
+
add_field('cb_type', 'p')
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# product_id
|
|
42
|
+
mapping :account, 'product_id'
|
|
43
|
+
# product_name
|
|
44
|
+
mapping :invoice, 'product_name'
|
|
45
|
+
# product_price
|
|
46
|
+
mapping :amount, 'product_price'
|
|
47
|
+
# product_price_currency
|
|
48
|
+
mapping :currency, 'product_price_currency'
|
|
49
|
+
|
|
50
|
+
# f_name
|
|
51
|
+
# s_name
|
|
52
|
+
# email
|
|
53
|
+
mapping :customer, :first_name => 'f_name',
|
|
54
|
+
:last_name => 's_name',
|
|
55
|
+
:phone => 'phone',
|
|
56
|
+
:email => 'email'
|
|
57
|
+
|
|
58
|
+
# city
|
|
59
|
+
# street
|
|
60
|
+
# state
|
|
61
|
+
# zip
|
|
62
|
+
# country - The country must be a 3 digit country code
|
|
63
|
+
# phone
|
|
64
|
+
|
|
65
|
+
mapping :billing_address, :city => 'city',
|
|
66
|
+
:address1 => 'street',
|
|
67
|
+
:state => 'state',
|
|
68
|
+
:zip => 'zip',
|
|
69
|
+
:country => 'country'
|
|
70
|
+
|
|
71
|
+
def billing_address(mapping = {})
|
|
72
|
+
# Gets the country code in the appropriate format or returns what we were given
|
|
73
|
+
# The appropriate format for Chronopay is the alpha 3 country code
|
|
74
|
+
country_code = lookup_country_code(mapping.delete(:country))
|
|
75
|
+
add_field(mappings[:billing_address][:country], country_code)
|
|
76
|
+
|
|
77
|
+
countries_with_supported_states = ['USA', 'CAN']
|
|
78
|
+
if !countries_with_supported_states.include?(country_code)
|
|
79
|
+
mapping.delete(:state)
|
|
80
|
+
add_field(mappings[:billing_address][:state], 'XX')
|
|
81
|
+
end
|
|
82
|
+
mapping.each do |k, v|
|
|
83
|
+
field = mappings[:billing_address][k]
|
|
84
|
+
add_field(field, v) unless field.nil?
|
|
85
|
+
end
|
|
86
|
+
add_field('language', checkout_language_from_country(country_code))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# card_no
|
|
90
|
+
# exp_month
|
|
91
|
+
# exp_year
|
|
92
|
+
mapping :credit_card, :number => 'card_no',
|
|
93
|
+
:expiry_month => 'exp_month',
|
|
94
|
+
:expiry_year => 'exp_year'
|
|
95
|
+
|
|
96
|
+
# cb_url
|
|
97
|
+
mapping :notify_url, 'cb_url'
|
|
98
|
+
|
|
99
|
+
# cs1
|
|
100
|
+
mapping :order, 'cs1'
|
|
101
|
+
|
|
102
|
+
# cs2
|
|
103
|
+
# cs3
|
|
104
|
+
# decline_url
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
private
|
|
108
|
+
|
|
109
|
+
def checkout_language_from_country(country_code)
|
|
110
|
+
country = Country.find(country_code)
|
|
111
|
+
short_code = country.code(:alpha2).to_s
|
|
112
|
+
LANG_FOR_COUNTRY[short_code]
|
|
113
|
+
rescue InvalidCountryCodeError
|
|
114
|
+
'EN'
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Chronopay
|
|
5
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
6
|
+
def complete?
|
|
7
|
+
status == 'Completed'
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# Status of transaction. List of possible values:
|
|
11
|
+
# <tt>onetime – one time payment has been made, no repayment required;</tt>::
|
|
12
|
+
# <tt>initial – first payment has been made, repayment required in corresponding period;</tt>::
|
|
13
|
+
# <tt>decline – charge request has been rejected;</tt>::
|
|
14
|
+
# <tt>rebill – repayment has been made together with initial transaction;</ttt>::
|
|
15
|
+
# <tt>cancel – repayments has been disabled;</tt>::
|
|
16
|
+
# <tt>expire – customer’s access to restricted zone membership has been expired;</tt>::
|
|
17
|
+
# <tt>refund – request to refund has been received;</tt>::
|
|
18
|
+
# <tt>chargeback – request to chargeback has been received.</tt>::
|
|
19
|
+
#
|
|
20
|
+
# This implementation of Chronopay does not support subscriptions.
|
|
21
|
+
# The status codes used are matched to the status codes that Paypal
|
|
22
|
+
# sends. See Paypal::Notification#status for more details
|
|
23
|
+
def status
|
|
24
|
+
case params['transaction_type']
|
|
25
|
+
when 'onetime'
|
|
26
|
+
'Completed'
|
|
27
|
+
when 'refund'
|
|
28
|
+
'Refunded'
|
|
29
|
+
when 'chargeback'
|
|
30
|
+
'Reversed'
|
|
31
|
+
else
|
|
32
|
+
'Failed'
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Unique ID of transaction
|
|
37
|
+
def transaction_id
|
|
38
|
+
params['transaction_id']
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Unique ID of customer
|
|
42
|
+
def customer_id
|
|
43
|
+
params['customer_id']
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Unique ID of Merchant’s web-site
|
|
47
|
+
def site_id
|
|
48
|
+
params['site_id']
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# ID of a product that was purchased
|
|
52
|
+
def product_id
|
|
53
|
+
params['product_id']
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Language
|
|
57
|
+
def language
|
|
58
|
+
params['language']
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def received_at
|
|
62
|
+
# Date should be formatted "dd-mm-yy" to be parsed by 1.8 and 1.9 the same way
|
|
63
|
+
formatted_date = Date.strptime(date, "%m/%d/%Y").strftime("%d-%m-%Y")
|
|
64
|
+
Time.parse("#{formatted_date} #{time}") unless date.blank? || time.blank?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Date of transaction in MM/DD/YYYY format
|
|
68
|
+
def date
|
|
69
|
+
params['date']
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Time of transaction in HH:MM:SS format
|
|
73
|
+
def time
|
|
74
|
+
params['time']
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# The customer's full name
|
|
78
|
+
def name
|
|
79
|
+
params['name']
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# The customer's email address
|
|
83
|
+
def email
|
|
84
|
+
params['email']
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# The customer's street address
|
|
88
|
+
def street
|
|
89
|
+
params['street']
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# The customer's country - 3 digit country code
|
|
93
|
+
def country
|
|
94
|
+
params['country']
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# The customer's city
|
|
98
|
+
def city
|
|
99
|
+
params['city']
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# The customer's zip
|
|
103
|
+
def zip
|
|
104
|
+
params['zip']
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
# The customer's state. Only useful for US Customers
|
|
108
|
+
def state
|
|
109
|
+
params['state']
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Customer’s login for restricted access zone of Merchant’s Web-site
|
|
113
|
+
def username
|
|
114
|
+
params['username']
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Customer's password for restricted access zone of Merchant’s Web-site, as chosen
|
|
118
|
+
def password
|
|
119
|
+
params['password']
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# The item id passed in the first custom parameter
|
|
123
|
+
def item_id
|
|
124
|
+
params['cs1']
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Additional parameter
|
|
128
|
+
def custom2
|
|
129
|
+
params['cs2']
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# Additional parameter
|
|
133
|
+
def custom3
|
|
134
|
+
params['cs3']
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# The currency the purchase was made in
|
|
138
|
+
def currency
|
|
139
|
+
params['currency']
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# the money amount we received in X.2 decimal.
|
|
143
|
+
def gross
|
|
144
|
+
params['total']
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def test?
|
|
148
|
+
date.blank? && time.blank? && transaction_id.blank?
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def acknowledge
|
|
152
|
+
true
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module DirecPay
|
|
5
|
+
autoload :Helper, File.dirname(__FILE__) + '/direc_pay/helper.rb'
|
|
6
|
+
autoload :Return, File.dirname(__FILE__) + '/direc_pay/return.rb'
|
|
7
|
+
autoload :Notification, File.dirname(__FILE__) + '/direc_pay/notification.rb'
|
|
8
|
+
autoload :Status, File.dirname(__FILE__) + '/direc_pay/status.rb'
|
|
9
|
+
|
|
10
|
+
mattr_accessor :production_url, :test_url
|
|
11
|
+
|
|
12
|
+
self.production_url = "https://www.timesofmoney.com/direcpay/secure/dpMerchantTransaction.jsp"
|
|
13
|
+
self.test_url = "https://test.timesofmoney.com/direcpay/secure/dpMerchantTransaction.jsp"
|
|
14
|
+
|
|
15
|
+
def self.service_url
|
|
16
|
+
mode = ActiveMerchant::Billing::Base.integration_mode
|
|
17
|
+
case mode
|
|
18
|
+
when :production
|
|
19
|
+
self.production_url
|
|
20
|
+
when :test
|
|
21
|
+
self.test_url
|
|
22
|
+
else
|
|
23
|
+
raise StandardError, "Integration mode set to an invalid value: #{mode}"
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def self.notification(post, options = {})
|
|
28
|
+
Notification.new(post)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.return(query_string, options = {})
|
|
32
|
+
Return.new(query_string, options)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.request_status_update(mid, transaction_id, notification_url)
|
|
36
|
+
Status.new(mid).update(transaction_id, notification_url)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module DirecPay
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
mapping :account, 'MID'
|
|
7
|
+
mapping :order, 'Merchant Order No'
|
|
8
|
+
mapping :amount, 'Amount'
|
|
9
|
+
mapping :currency, 'Currency'
|
|
10
|
+
mapping :country, 'Country'
|
|
11
|
+
|
|
12
|
+
mapping :billing_address, :city => 'custCity',
|
|
13
|
+
:address1 => 'custAddress',
|
|
14
|
+
:state => 'custState',
|
|
15
|
+
:zip => 'custPinCode',
|
|
16
|
+
:country => 'custCountry',
|
|
17
|
+
:phone => 'custMobileNo'
|
|
18
|
+
|
|
19
|
+
mapping :shipping_address, :name => 'deliveryName',
|
|
20
|
+
:city => 'deliveryCity',
|
|
21
|
+
:address1 => 'deliveryAddress',
|
|
22
|
+
:state => 'deliveryState',
|
|
23
|
+
:zip => 'deliveryPinCode',
|
|
24
|
+
:country => 'deliveryCountry',
|
|
25
|
+
:phone => 'deliveryMobileNo'
|
|
26
|
+
|
|
27
|
+
mapping :customer, :name => 'custName',
|
|
28
|
+
:email => 'custEmailId'
|
|
29
|
+
|
|
30
|
+
mapping :description, 'otherNotes'
|
|
31
|
+
mapping :edit_allowed, 'editAllowed'
|
|
32
|
+
|
|
33
|
+
mapping :return_url, 'Success URL'
|
|
34
|
+
mapping :failure_url, 'Failure URL'
|
|
35
|
+
|
|
36
|
+
mapping :operating_mode, 'Operating Mode'
|
|
37
|
+
mapping :other_details, 'Other Details'
|
|
38
|
+
mapping :collaborator, 'Collaborator'
|
|
39
|
+
|
|
40
|
+
OPERATING_MODE = 'DOM'
|
|
41
|
+
COUNTRY = 'IND'
|
|
42
|
+
CURRENCY = 'INR'
|
|
43
|
+
OTHER_DETAILS = 'NULL'
|
|
44
|
+
EDIT_ALLOWED = 'Y'
|
|
45
|
+
|
|
46
|
+
PHONE_CODES = {
|
|
47
|
+
'IN' => '91',
|
|
48
|
+
'US' => '01',
|
|
49
|
+
'CA' => '01'
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
ENCODED_PARAMS = [ :account, :operating_mode, :country, :currency, :amount, :order, :other_details, :return_url, :failure_url, :collaborator ]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def initialize(order, account, options = {})
|
|
56
|
+
super
|
|
57
|
+
collaborator = ActiveMerchant::Billing::Base.integration_mode == :test || options[:test] ? 'TOML' : 'DirecPay'
|
|
58
|
+
add_field(mappings[:collaborator], collaborator)
|
|
59
|
+
add_field(mappings[:country], 'IND')
|
|
60
|
+
add_field(mappings[:operating_mode], OPERATING_MODE)
|
|
61
|
+
add_field(mappings[:other_details], OTHER_DETAILS)
|
|
62
|
+
add_field(mappings[:edit_allowed], EDIT_ALLOWED)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def customer(params = {})
|
|
67
|
+
add_field(mappings[:customer][:name], full_name(params))
|
|
68
|
+
add_field(mappings[:customer][:email], params[:email])
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Need to format the amount to have 2 decimal places
|
|
72
|
+
def amount=(money)
|
|
73
|
+
cents = money.respond_to?(:cents) ? money.cents : money
|
|
74
|
+
if money.is_a?(String) or cents.to_i <= 0
|
|
75
|
+
raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
|
|
76
|
+
end
|
|
77
|
+
add_field(mappings[:amount], sprintf("%.2f", cents.to_f/100))
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def shipping_address(params = {})
|
|
81
|
+
super(update_address(:shipping_address, params))
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def billing_address(params = {})
|
|
85
|
+
super(update_address(:billing_address, params))
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def form_fields
|
|
89
|
+
add_failure_url
|
|
90
|
+
add_request_parameters
|
|
91
|
+
|
|
92
|
+
unencoded_parameters
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
private
|
|
97
|
+
|
|
98
|
+
def add_request_parameters
|
|
99
|
+
params = ENCODED_PARAMS.map{ |param| fields[mappings[param]] }
|
|
100
|
+
encoded = encode_value(params.join('|'))
|
|
101
|
+
|
|
102
|
+
add_field('requestparameter', encoded)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def unencoded_parameters
|
|
106
|
+
params = fields.dup
|
|
107
|
+
# remove all encoded params from exported fields
|
|
108
|
+
ENCODED_PARAMS.each{ |param| params.delete(mappings[param]) }
|
|
109
|
+
# remove all special characters from each field value
|
|
110
|
+
params = params.collect{|name, value| [name, remove_special_characters(value)] }
|
|
111
|
+
Hash[params]
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def add_failure_url
|
|
115
|
+
if fields[mappings[:failure_url]].nil?
|
|
116
|
+
add_field(mappings[:failure_url], fields[mappings[:return_url]])
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def update_address(address_type, params)
|
|
121
|
+
params = params.dup
|
|
122
|
+
address = params[:address1]
|
|
123
|
+
address = "#{address} #{params[:address2]}" if params[:address2].present?
|
|
124
|
+
address = "#{params[:company]} #{address}" if params[:company].present?
|
|
125
|
+
params[:address1] = address
|
|
126
|
+
|
|
127
|
+
params[:phone] = normalize_phone_number(params[:phone])
|
|
128
|
+
add_land_line_phone_for(address_type, params)
|
|
129
|
+
|
|
130
|
+
if address_type == :shipping_address
|
|
131
|
+
shipping_name = full_name(params) || fields[mappings[:customer][:name]]
|
|
132
|
+
add_field(mappings[:shipping_address][:name], shipping_name)
|
|
133
|
+
end
|
|
134
|
+
params
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Split a single phone number into the country code, area code and local number as best as possible
|
|
138
|
+
def add_land_line_phone_for(address_type, params)
|
|
139
|
+
address_field = address_type == :billing_address ? 'custPhoneNo' : 'deliveryPhNo'
|
|
140
|
+
|
|
141
|
+
if params.has_key?(:phone2)
|
|
142
|
+
phone = normalize_phone_number(params[:phone2])
|
|
143
|
+
phone_country_code, phone_area_code, phone_number = nil
|
|
144
|
+
|
|
145
|
+
if params[:country] == 'IN' && phone =~ /(91)? *(\d{3}) *(\d{4,})$/
|
|
146
|
+
phone_country_code, phone_area_code, phone_number = $1, $2, $3
|
|
147
|
+
else
|
|
148
|
+
numbers = phone.split(' ')
|
|
149
|
+
case numbers.size
|
|
150
|
+
when 3
|
|
151
|
+
phone_country_code, phone_area_code, phone_number = numbers
|
|
152
|
+
when 2
|
|
153
|
+
phone_area_code, phone_number = numbers
|
|
154
|
+
else
|
|
155
|
+
phone =~ /(\d{3})(\d+)$/
|
|
156
|
+
phone_area_code, phone_number = $1, $2
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
add_field("#{address_field}1", phone_country_code || phone_code_for_country(params[:country]) || '91')
|
|
161
|
+
add_field("#{address_field}2", phone_area_code)
|
|
162
|
+
add_field("#{address_field}3", phone_number)
|
|
163
|
+
end
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def normalize_phone_number(phone)
|
|
167
|
+
phone.gsub(/[^\d ]+/, '') if phone
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# Special characters are NOT allowed while posting transaction parameters on DirecPay system
|
|
171
|
+
def remove_special_characters(string)
|
|
172
|
+
string.gsub(/[~"'&#%]/, '-')
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def encode_value(value)
|
|
176
|
+
encoded = Base64.strict_encode64(value)
|
|
177
|
+
string_to_encode = encoded[0, 1] + "T" + encoded[1, encoded.length]
|
|
178
|
+
Base64.strict_encode64(string_to_encode)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
def decode_value(value)
|
|
182
|
+
decoded = Base64.decode64(value)
|
|
183
|
+
string_to_decode = decoded[0, 1] + decoded[2, decoded.length]
|
|
184
|
+
Base64.decode64(string_to_decode)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def phone_code_for_country(country)
|
|
188
|
+
PHONE_CODES[country]
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def full_name(params)
|
|
192
|
+
return if params[:name].blank? && params[:first_name].blank? && params[:last_name].blank?
|
|
193
|
+
|
|
194
|
+
params[:name] || "#{params[:first_name]} #{params[:last_name]}"
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
199
|
+
end
|
|
200
|
+
end
|