johnideal-activemerchant 1.4.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/.gitignore +2 -0
- data/CHANGELOG +448 -0
- data/CONTRIBUTERS +106 -0
- data/MIT-LICENSE +20 -0
- data/README +134 -0
- data/Rakefile +167 -0
- data/VERSION +1 -0
- data/activemerchant.gemspec +484 -0
- data/gem-public_cert.pem +20 -0
- data/generators/gateway/USAGE +5 -0
- data/generators/gateway/gateway_generator.rb +61 -0
- data/generators/gateway/templates/gateway.rb +77 -0
- data/generators/gateway/templates/gateway_test.rb +49 -0
- data/generators/gateway/templates/remote_gateway_test.rb +57 -0
- data/generators/integration/USAGE +5 -0
- data/generators/integration/integration_generator.rb +68 -0
- data/generators/integration/templates/helper.rb +34 -0
- data/generators/integration/templates/helper_test.rb +54 -0
- data/generators/integration/templates/integration.rb +18 -0
- data/generators/integration/templates/module_test.rb +9 -0
- data/generators/integration/templates/notification.rb +100 -0
- data/generators/integration/templates/notification_test.rb +41 -0
- data/init.rb +3 -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 +159 -0
- data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +125 -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 +158 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +657 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +703 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +233 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
- data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
- data/lib/active_merchant/billing/gateways/bogus.rb +98 -0
- data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
- data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
- data/lib/active_merchant/billing/gateways/data_cash.rb +595 -0
- data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
- data/lib/active_merchant/billing/gateways/eway.rb +277 -0
- data/lib/active_merchant/billing/gateways/exact.rb +222 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +396 -0
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
- data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +214 -0
- data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
- data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
- data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
- data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
- data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -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.rb +236 -0
- data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -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 +230 -0
- data/lib/active_merchant/billing/gateways/paymentech_orbital/paymentech_orbital_response.rb +72 -0
- data/lib/active_merchant/billing/gateways/paymentech_orbital.rb +170 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +325 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
- data/lib/active_merchant/billing/gateways/paypal.rb +108 -0
- data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
- data/lib/active_merchant/billing/gateways/paypal_express.rb +130 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
- data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
- data/lib/active_merchant/billing/gateways/protx.rb +307 -0
- data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
- data/lib/active_merchant/billing/gateways/psl_card.rb +306 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
- data/lib/active_merchant/billing/gateways/realex.rb +200 -0
- data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
- data/lib/active_merchant/billing/gateways/sage/sage_core.rb +110 -0
- data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
- data/lib/active_merchant/billing/gateways/sage.rb +146 -0
- data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +442 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +254 -0
- data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
- data/lib/active_merchant/billing/gateways/transax.rb +26 -0
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
- data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
- data/lib/active_merchant/billing/gateways/viaklix.rb +165 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
- data/lib/active_merchant/billing/gateways.rb +3 -0
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -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/bogus.rb +22 -0
- data/lib/active_merchant/billing/integrations/chronopay/helper.rb +81 -0
- data/lib/active_merchant/billing/integrations/chronopay/notification.rb +156 -0
- data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/chronopay.rb +22 -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 +83 -0
- data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/gestpay.rb +26 -0
- data/lib/active_merchant/billing/integrations/helper.rb +93 -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/hi_trust.rb +26 -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/nochex.rb +87 -0
- data/lib/active_merchant/billing/integrations/notification.rb +62 -0
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +118 -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/paypal.rb +40 -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/quickpay.rb +18 -0
- data/lib/active_merchant/billing/integrations/return.rb +35 -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/two_checkout.rb +23 -0
- data/lib/active_merchant/billing/integrations.rb +22 -0
- data/lib/active_merchant/billing/response.rb +32 -0
- data/lib/active_merchant/lib/connection.rb +171 -0
- data/lib/active_merchant/lib/country.rb +319 -0
- 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 +47 -0
- data/lib/active_merchant/lib/requires_parameters.rb +16 -0
- data/lib/active_merchant/lib/utils.rb +18 -0
- data/lib/active_merchant/lib/validateable.rb +76 -0
- data/lib/active_merchant.rb +60 -0
- data/lib/certs/cacert.pem +7815 -0
- data/lib/support/gateway_support.rb +58 -0
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/test/fixtures.yml +335 -0
- data/test/remote/gateways/remote_authorize_net_cim_test.rb +459 -0
- data/test/remote/gateways/remote_authorize_net_test.rb +145 -0
- data/test/remote/gateways/remote_beanstream_interac_test.rb +53 -0
- data/test/remote/gateways/remote_beanstream_test.rb +150 -0
- data/test/remote/gateways/remote_braintree_test.rb +154 -0
- data/test/remote/gateways/remote_card_stream_test.rb +148 -0
- data/test/remote/gateways/remote_cyber_source_test.rb +144 -0
- data/test/remote/gateways/remote_data_cash_test.rb +357 -0
- data/test/remote/gateways/remote_efsnet_test.rb +81 -0
- data/test/remote/gateways/remote_eway_test.rb +74 -0
- data/test/remote/gateways/remote_exact_test.rb +60 -0
- data/test/remote/gateways/remote_instapay_test.rb +61 -0
- data/test/remote/gateways/remote_linkpoint_test.rb +112 -0
- data/test/remote/gateways/remote_merchant_e_solutions_test.rb +173 -0
- data/test/remote/gateways/remote_merchant_ware_test.rb +113 -0
- data/test/remote/gateways/remote_modern_payments_cim_test.rb +58 -0
- data/test/remote/gateways/remote_modern_payments_test.rb +43 -0
- data/test/remote/gateways/remote_moneris_test.rb +82 -0
- data/test/remote/gateways/remote_net_registry_test.rb +85 -0
- data/test/remote/gateways/remote_netbilling_test.rb +70 -0
- data/test/remote/gateways/remote_pay_junction_test.rb +143 -0
- data/test/remote/gateways/remote_pay_secure_test.rb +39 -0
- data/test/remote/gateways/remote_payflow_express_test.rb +50 -0
- data/test/remote/gateways/remote_payflow_test.rb +237 -0
- data/test/remote/gateways/remote_payflow_uk_test.rb +173 -0
- data/test/remote/gateways/remote_payment_express_test.rb +136 -0
- data/test/remote/gateways/remote_paymentech_orbital_test.rb +57 -0
- data/test/remote/gateways/remote_paypal_express_test.rb +49 -0
- data/test/remote/gateways/remote_paypal_test.rb +167 -0
- data/test/remote/gateways/remote_plugnpay_test.rb +72 -0
- data/test/remote/gateways/remote_protx_test.rb +219 -0
- data/test/remote/gateways/remote_psigate_test.rb +50 -0
- data/test/remote/gateways/remote_psl_card_test.rb +125 -0
- data/test/remote/gateways/remote_quickpay_test.rb +190 -0
- data/test/remote/gateways/remote_realex_test.rb +224 -0
- data/test/remote/gateways/remote_sage_bankcard_test.rb +109 -0
- data/test/remote/gateways/remote_sage_test.rb +87 -0
- data/test/remote/gateways/remote_sage_virtual_check_test.rb +62 -0
- data/test/remote/gateways/remote_secure_pay_au_test.rb +40 -0
- data/test/remote/gateways/remote_secure_pay_tech_test.rb +37 -0
- data/test/remote/gateways/remote_secure_pay_test.rb +28 -0
- data/test/remote/gateways/remote_skipjack_test.rb +105 -0
- data/test/remote/gateways/remote_trans_first_test.rb +34 -0
- data/test/remote/gateways/remote_transax_test.rb +112 -0
- data/test/remote/gateways/remote_trust_commerce_test.rb +152 -0
- data/test/remote/gateways/remote_usa_epay_test.rb +46 -0
- data/test/remote/gateways/remote_verifi_test.rb +107 -0
- data/test/remote/gateways/remote_viaklix_test.rb +43 -0
- data/test/remote/gateways/remote_wirecard_test.rb +111 -0
- data/test/remote/integrations/remote_gestpay_integration_test.rb +37 -0
- data/test/remote/integrations/remote_paypal_integration_test.rb +26 -0
- data/test/test_helper.rb +182 -0
- data/test/unit/avs_result_test.rb +59 -0
- data/test/unit/base_test.rb +55 -0
- data/test/unit/check_test.rb +88 -0
- data/test/unit/connection_test.rb +129 -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 +19 -0
- data/test/unit/credit_card_methods_test.rb +170 -0
- data/test/unit/credit_card_test.rb +318 -0
- data/test/unit/cvv_result_test.rb +33 -0
- data/test/unit/expiry_date_test.rb +32 -0
- data/test/unit/gateways/authorize_net_cim_test.rb +638 -0
- data/test/unit/gateways/authorize_net_test.rb +290 -0
- data/test/unit/gateways/beanstream_interac_test.rb +51 -0
- data/test/unit/gateways/beanstream_test.rb +108 -0
- data/test/unit/gateways/bogus_test.rb +46 -0
- data/test/unit/gateways/braintree_test.rb +126 -0
- data/test/unit/gateways/card_stream_test.rb +90 -0
- data/test/unit/gateways/cyber_source_test.rb +188 -0
- data/test/unit/gateways/data_cash_test.rb +133 -0
- data/test/unit/gateways/efsnet_test.rb +123 -0
- data/test/unit/gateways/eway_test.rb +118 -0
- data/test/unit/gateways/exact_test.rb +156 -0
- data/test/unit/gateways/gateway_test.rb +48 -0
- data/test/unit/gateways/instapay_test.rb +102 -0
- data/test/unit/gateways/linkpoint_test.rb +167 -0
- data/test/unit/gateways/merchant_e_solutions_test.rb +169 -0
- data/test/unit/gateways/merchant_ware_test.rb +188 -0
- data/test/unit/gateways/modern_payments_cim_test.rb +171 -0
- data/test/unit/gateways/moneris_test.rb +158 -0
- data/test/unit/gateways/net_registry_test.rb +416 -0
- data/test/unit/gateways/netbilling_test.rb +54 -0
- data/test/unit/gateways/pay_junction_test.rb +123 -0
- data/test/unit/gateways/pay_secure_test.rb +71 -0
- data/test/unit/gateways/payflow_express_test.rb +173 -0
- data/test/unit/gateways/payflow_express_uk_test.rb +86 -0
- data/test/unit/gateways/payflow_test.rb +305 -0
- data/test/unit/gateways/payflow_uk_test.rb +30 -0
- data/test/unit/gateways/payment_express_test.rb +195 -0
- data/test/unit/gateways/paymentech_orbital_test.rb +117 -0
- data/test/unit/gateways/paypal_express_test.rb +382 -0
- data/test/unit/gateways/paypal_test.rb +520 -0
- data/test/unit/gateways/plugnpay_test.rb +86 -0
- data/test/unit/gateways/protx_test.rb +139 -0
- data/test/unit/gateways/psigate_test.rb +169 -0
- data/test/unit/gateways/psl_card_test.rb +64 -0
- data/test/unit/gateways/quickpay_test.rb +112 -0
- data/test/unit/gateways/realex_test.rb +151 -0
- data/test/unit/gateways/sage_bankcard_test.rb +162 -0
- data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
- data/test/unit/gateways/secure_pay_au_test.rb +207 -0
- data/test/unit/gateways/secure_pay_tech_test.rb +44 -0
- data/test/unit/gateways/secure_pay_test.rb +87 -0
- data/test/unit/gateways/skip_jack_test.rb +133 -0
- data/test/unit/gateways/trans_first_test.rb +112 -0
- data/test/unit/gateways/trust_commerce_test.rb +90 -0
- data/test/unit/gateways/usa_epay_test.rb +128 -0
- data/test/unit/gateways/verifi_test.rb +96 -0
- data/test/unit/gateways/viaklix_test.rb +78 -0
- data/test/unit/gateways/wirecard_test.rb +250 -0
- data/test/unit/generators/test_gateway_generator.rb +46 -0
- data/test/unit/generators/test_generator_helper.rb +20 -0
- data/test/unit/generators/test_integration_generator.rb +53 -0
- data/test/unit/integrations/action_view_helper_test.rb +50 -0
- data/test/unit/integrations/bogus_module_test.rb +20 -0
- data/test/unit/integrations/chronopay_module_test.rb +13 -0
- data/test/unit/integrations/gestpay_module_test.rb +14 -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/hi_trust_helper_test.rb +16 -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/quickpay_helper_test.rb +40 -0
- data/test/unit/integrations/helpers/two_checkout_helper_test.rb +92 -0
- data/test/unit/integrations/hi_trust_module_test.rb +13 -0
- data/test/unit/integrations/nochex_module_test.rb +13 -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/hi_trust_notification_test.rb +59 -0
- data/test/unit/integrations/notifications/nochex_notification_test.rb +51 -0
- data/test/unit/integrations/notifications/notification_test.rb +54 -0
- data/test/unit/integrations/notifications/paypal_notification_test.rb +85 -0
- data/test/unit/integrations/notifications/quickpay_notification_test.rb +69 -0
- data/test/unit/integrations/notifications/two_checkout_notification_test.rb +55 -0
- data/test/unit/integrations/paypal_module_test.rb +28 -0
- data/test/unit/integrations/quickpay_module_test.rb +9 -0
- data/test/unit/integrations/returns/chronopay_return_test.rb +11 -0
- data/test/unit/integrations/returns/gestpay_return_test.rb +10 -0
- data/test/unit/integrations/returns/hi_trust_return_test.rb +24 -0
- data/test/unit/integrations/returns/nochex_return_test.rb +10 -0
- data/test/unit/integrations/returns/paypal_return_test.rb +10 -0
- data/test/unit/integrations/returns/return_test.rb +11 -0
- data/test/unit/integrations/returns/two_checkout_return_test.rb +24 -0
- data/test/unit/integrations/two_checkout_module_test.rb +13 -0
- data/test/unit/post_data_test.rb +55 -0
- data/test/unit/posts_data_test.rb +48 -0
- data/test/unit/response_test.rb +28 -0
- data/test/unit/utils_test.rb +7 -0
- data/test/unit/validateable_test.rb +60 -0
- metadata +503 -0
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class <%= class_name %>Test < Test::Unit::TestCase
|
|
4
|
+
def setup
|
|
5
|
+
@gateway = <%= class_name %>Gateway.new(
|
|
6
|
+
:login => 'login',
|
|
7
|
+
:password => 'password'
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
@credit_card = credit_card
|
|
11
|
+
@amount = 100
|
|
12
|
+
|
|
13
|
+
@options = {
|
|
14
|
+
:order_id => '1',
|
|
15
|
+
:billing_address => address,
|
|
16
|
+
:description => 'Store Purchase'
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_successful_purchase
|
|
21
|
+
@gateway.expects(:ssl_post).returns(successful_purchase_response)
|
|
22
|
+
|
|
23
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
|
24
|
+
assert_instance_of
|
|
25
|
+
assert_success response
|
|
26
|
+
|
|
27
|
+
# Replace with authorization number from the successful response
|
|
28
|
+
assert_equal '', response.authorization
|
|
29
|
+
assert response.test?
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_unsuccessful_request
|
|
33
|
+
@gateway.expects(:ssl_post).returns(failed_purchase_response)
|
|
34
|
+
|
|
35
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
|
36
|
+
assert_failure response
|
|
37
|
+
assert response.test?
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
private
|
|
41
|
+
|
|
42
|
+
# Place raw successful response from gateway here
|
|
43
|
+
def successful_purchase_response
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Place raw failed response from gateway here
|
|
47
|
+
def failed_purcahse_response
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class Remote<%= class_name %>Test < Test::Unit::TestCase
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@gateway = <%= class_name %>Gateway.new(fixtures(:<%= class_name.underscore %>))
|
|
8
|
+
|
|
9
|
+
@amount = 100
|
|
10
|
+
@credit_card = credit_card('4000100011112224')
|
|
11
|
+
@declined_card = credit_card('4000300011112220')
|
|
12
|
+
|
|
13
|
+
@options = {
|
|
14
|
+
:order_id => '1',
|
|
15
|
+
:billing_address => address,
|
|
16
|
+
:description => 'Store Purchase'
|
|
17
|
+
}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def test_successful_purchase
|
|
21
|
+
assert response = @gateway.purchase(@amount, @credit_card, @options)
|
|
22
|
+
assert_success response
|
|
23
|
+
assert_equal 'REPLACE WITH SUCCESS MESSAGE', response.message
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def test_unsuccessful_purchase
|
|
27
|
+
assert response = @gateway.purchase(@amount, @declined_card, @options)
|
|
28
|
+
assert_failure response
|
|
29
|
+
assert_equal 'REPLACE WITH FAILED PURCHASE MESSAGE', response.message
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def test_authorize_and_capture
|
|
33
|
+
amount = @amount
|
|
34
|
+
assert auth = @gateway.authorize(amount, @credit_card, @options)
|
|
35
|
+
assert_success auth
|
|
36
|
+
assert_equal 'Success', auth.message
|
|
37
|
+
assert auth.authorization
|
|
38
|
+
assert capture = @gateway.capture(amount, auth.authorization)
|
|
39
|
+
assert_success capture
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def test_failed_capture
|
|
43
|
+
assert response = @gateway.capture(@amount, '')
|
|
44
|
+
assert_failure response
|
|
45
|
+
assert_equal 'REPLACE WITH GATEWAY FAILURE MESSAGE', response.message
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def test_invalid_login
|
|
49
|
+
gateway = <%= class_name %>Gateway.new(
|
|
50
|
+
:login => '',
|
|
51
|
+
:password => ''
|
|
52
|
+
)
|
|
53
|
+
assert response = gateway.purchase(@amount, @credit_card, @options)
|
|
54
|
+
assert_failure response
|
|
55
|
+
assert_equal 'REPLACE WITH FAILURE MESSAGE', response.message
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
class IntegrationGenerator < RubiGen::Base
|
|
2
|
+
BASE_DIR = "lib/active_merchant/billing/integrations/"
|
|
3
|
+
TEST_DIR = "test/unit/integrations/"
|
|
4
|
+
|
|
5
|
+
default_options :author => nil
|
|
6
|
+
|
|
7
|
+
attr_reader :name
|
|
8
|
+
|
|
9
|
+
def initialize(runtime_args, runtime_options = {})
|
|
10
|
+
super
|
|
11
|
+
usage if args.size < 1
|
|
12
|
+
@name = args.shift
|
|
13
|
+
extract_options
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def class_name
|
|
17
|
+
name.classify
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def lib_dir
|
|
21
|
+
BASE_DIR + name
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def manifest
|
|
25
|
+
record do |m|
|
|
26
|
+
# Ensure appropriate folder(s) exists
|
|
27
|
+
m.directory lib_dir
|
|
28
|
+
m.directory TEST_DIR
|
|
29
|
+
m.directory TEST_DIR + "helpers"
|
|
30
|
+
m.directory TEST_DIR + "notifications"
|
|
31
|
+
|
|
32
|
+
m.template 'integration.rb', "#{lib_dir}.rb"
|
|
33
|
+
m.template 'helper.rb', lib_dir + "/helper.rb"
|
|
34
|
+
m.template 'notification.rb', lib_dir + "/notification.rb"
|
|
35
|
+
|
|
36
|
+
m.template 'module_test.rb', TEST_DIR + "#{name}_module_test.rb"
|
|
37
|
+
m.template 'helper_test.rb', TEST_DIR + "helpers/#{name}_helper_test.rb"
|
|
38
|
+
m.template 'notification_test.rb', TEST_DIR + "notifications/#{name}_notification_test.rb"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
protected
|
|
43
|
+
def banner
|
|
44
|
+
<<-EOS
|
|
45
|
+
Creates a ...
|
|
46
|
+
|
|
47
|
+
USAGE: #{$0} #{spec.name} name"
|
|
48
|
+
EOS
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def add_options!(opts)
|
|
52
|
+
# opts.separator ''
|
|
53
|
+
# opts.separator 'Options:'
|
|
54
|
+
# For each option below, place the default
|
|
55
|
+
# at the top of the file next to "default_options"
|
|
56
|
+
# opts.on("-a", "--author=\"Your Name\"", String,
|
|
57
|
+
# "Some comment about this option",
|
|
58
|
+
# "Default: none") { |options[:author]| }
|
|
59
|
+
# opts.on("-v", "--version", "Show the #{File.basename($0)} version number and quit.")
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def extract_options
|
|
63
|
+
# for each option, extract it into a local variable (and create an "attr_reader :author" at the top)
|
|
64
|
+
# Templates can access these value via the attr_reader-generated methods, but not the
|
|
65
|
+
# raw instance variable value.
|
|
66
|
+
# @author = options[:author]
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module <%= class_name %>
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
# Replace with the real mapping
|
|
7
|
+
mapping :account, ''
|
|
8
|
+
mapping :amount, ''
|
|
9
|
+
|
|
10
|
+
mapping :order, ''
|
|
11
|
+
|
|
12
|
+
mapping :customer, :first_name => '',
|
|
13
|
+
:last_name => '',
|
|
14
|
+
:email => '',
|
|
15
|
+
:phone => ''
|
|
16
|
+
|
|
17
|
+
mapping :billing_address, :city => '',
|
|
18
|
+
:address1 => '',
|
|
19
|
+
:address2 => '',
|
|
20
|
+
:state => '',
|
|
21
|
+
:zip => '',
|
|
22
|
+
:country => ''
|
|
23
|
+
|
|
24
|
+
mapping :notify_url, ''
|
|
25
|
+
mapping :return_url, ''
|
|
26
|
+
mapping :cancel_return_url, ''
|
|
27
|
+
mapping :description, ''
|
|
28
|
+
mapping :tax, ''
|
|
29
|
+
mapping :shipping, ''
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class <%= class_name %>HelperTest < Test::Unit::TestCase
|
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@helper = <%= class_name %>::Helper.new('order-500','cody@example.com', :amount => 500, :currency => 'USD')
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_basic_helper_fields
|
|
11
|
+
assert_field '', 'cody@example.com'
|
|
12
|
+
|
|
13
|
+
assert_field '', '5.00'
|
|
14
|
+
assert_field '', 'order-500'
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def test_customer_fields
|
|
18
|
+
@helper.customer :first_name => 'Cody', :last_name => 'Fauser', :email => 'cody@example.com'
|
|
19
|
+
assert_field '', 'Cody'
|
|
20
|
+
assert_field '', 'Fauser'
|
|
21
|
+
assert_field '', 'cody@example.com'
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def test_address_mapping
|
|
25
|
+
@helper.billing_address :address1 => '1 My Street',
|
|
26
|
+
:address2 => '',
|
|
27
|
+
:city => 'Leeds',
|
|
28
|
+
:state => 'Yorkshire',
|
|
29
|
+
:zip => 'LS2 7EE',
|
|
30
|
+
:country => 'CA'
|
|
31
|
+
|
|
32
|
+
assert_field '', '1 My Street'
|
|
33
|
+
assert_field '', 'Leeds'
|
|
34
|
+
assert_field '', 'Yorkshire'
|
|
35
|
+
assert_field '', 'LS2 7EE'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def test_unknown_address_mapping
|
|
39
|
+
@helper.billing_address :farm => 'CA'
|
|
40
|
+
assert_equal 3, @helper.fields.size
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_unknown_mapping
|
|
44
|
+
assert_nothing_raised do
|
|
45
|
+
@helper.company_address :address => '500 Dwemthy Fox Road'
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def test_setting_invalid_address_field
|
|
50
|
+
fields = @helper.fields.dup
|
|
51
|
+
@helper.billing_address :street => 'My Street'
|
|
52
|
+
assert_equal fields, @helper.fields
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
require File.dirname(__FILE__) + '/<%= name %>/helper.rb'
|
|
2
|
+
require File.dirname(__FILE__) + '/<%= name %>/notification.rb'
|
|
3
|
+
|
|
4
|
+
module ActiveMerchant #:nodoc:
|
|
5
|
+
module Billing #:nodoc:
|
|
6
|
+
module Integrations #:nodoc:
|
|
7
|
+
module <%= class_name %>
|
|
8
|
+
|
|
9
|
+
mattr_accessor :service_url
|
|
10
|
+
self.service_url = 'https://www.example.com'
|
|
11
|
+
|
|
12
|
+
def self.notification(post)
|
|
13
|
+
Notification.new(post)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class <%= class_name %>ModuleTest < Test::Unit::TestCase
|
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
|
5
|
+
|
|
6
|
+
def test_notification_method
|
|
7
|
+
assert_instance_of <%= class_name %>::Notification, <%= class_name %>.notification('name=cody')
|
|
8
|
+
end
|
|
9
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module <%= class_name %>
|
|
7
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
8
|
+
def complete?
|
|
9
|
+
params['']
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def item_id
|
|
13
|
+
params['']
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def transaction_id
|
|
17
|
+
params['']
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# When was this payment received by the client.
|
|
21
|
+
def received_at
|
|
22
|
+
params['']
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def payer_email
|
|
26
|
+
params['']
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def receiver_email
|
|
30
|
+
params['']
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def security_key
|
|
34
|
+
params['']
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# the money amount we received in X.2 decimal.
|
|
38
|
+
def gross
|
|
39
|
+
params['']
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Was this a test transaction?
|
|
43
|
+
def test?
|
|
44
|
+
params[''] == 'test'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def status
|
|
48
|
+
params['']
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Acknowledge the transaction to <%= class_name %>. This method has to be called after a new
|
|
52
|
+
# apc arrives. <%= class_name %> will verify that all the information we received are correct and will return a
|
|
53
|
+
# ok or a fail.
|
|
54
|
+
#
|
|
55
|
+
# Example:
|
|
56
|
+
#
|
|
57
|
+
# def ipn
|
|
58
|
+
# notify = <%= class_name %>Notification.new(request.raw_post)
|
|
59
|
+
#
|
|
60
|
+
# if notify.acknowledge
|
|
61
|
+
# ... process order ... if notify.complete?
|
|
62
|
+
# else
|
|
63
|
+
# ... log possible hacking attempt ...
|
|
64
|
+
# end
|
|
65
|
+
def acknowledge
|
|
66
|
+
payload = raw
|
|
67
|
+
|
|
68
|
+
uri = URI.parse(<%= class_name %>.notification_confirmation_url)
|
|
69
|
+
|
|
70
|
+
request = Net::HTTP::Post.new(uri.path)
|
|
71
|
+
|
|
72
|
+
request['Content-Length'] = "#{payload.size}"
|
|
73
|
+
request['User-Agent'] = "Active Merchant -- http://home.leetsoft.com/am"
|
|
74
|
+
request['Content-Type'] = "application/x-www-form-urlencoded"
|
|
75
|
+
|
|
76
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
|
77
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE unless @ssl_strict
|
|
78
|
+
http.use_ssl = true
|
|
79
|
+
|
|
80
|
+
response = http.request(request, payload)
|
|
81
|
+
|
|
82
|
+
# Replace with the appropriate codes
|
|
83
|
+
raise StandardError.new("Faulty <%= class_name %> result: #{response.body}") unless ["AUTHORISED", "DECLINED"].include?(response.body)
|
|
84
|
+
response.body == "AUTHORISED"
|
|
85
|
+
end
|
|
86
|
+
private
|
|
87
|
+
|
|
88
|
+
# Take the posted data and move the relevant data into a hash
|
|
89
|
+
def parse(post)
|
|
90
|
+
@raw = post
|
|
91
|
+
for line in post.split('&')
|
|
92
|
+
key, value = *line.scan( %r{^(\w+)\=(.*)$} ).flatten
|
|
93
|
+
params[key] = value
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
|
|
3
|
+
class <%= class_name %>NotificationTest < Test::Unit::TestCase
|
|
4
|
+
include ActiveMerchant::Billing::Integrations
|
|
5
|
+
|
|
6
|
+
def setup
|
|
7
|
+
@<%= name %> = <%= class_name %>::Notification.new(http_raw_data)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def test_accessors
|
|
11
|
+
assert @<%= name %>.complete?
|
|
12
|
+
assert_equal "", @<%= name %>.status
|
|
13
|
+
assert_equal "", @<%= name %>.transaction_id
|
|
14
|
+
assert_equal "", @<%= name %>.item_id
|
|
15
|
+
assert_equal "", @<%= name %>.gross
|
|
16
|
+
assert_equal "", @<%= name %>.currency
|
|
17
|
+
assert_equal "", @<%= name %>.received_at
|
|
18
|
+
assert @<%= name %>.test?
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def test_compositions
|
|
22
|
+
assert_equal Money.new(3166, 'USD'), @<%= name %>.amount
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Replace with real successful acknowledgement code
|
|
26
|
+
def test_acknowledgement
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test_send_acknowledgement
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def test_respond_to_acknowledge
|
|
34
|
+
assert @<%= name %>.respond_to?(:acknowledge)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
def http_raw_data
|
|
39
|
+
""
|
|
40
|
+
end
|
|
41
|
+
end
|
data/init.rb
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
#!ruby19
|
|
2
|
+
# encoding: utf-8
|
|
3
|
+
|
|
4
|
+
module ActiveMerchant
|
|
5
|
+
module Billing
|
|
6
|
+
# Implements the Address Verification System
|
|
7
|
+
# https://www.wellsfargo.com/downloads/pdf/biz/merchant/visa_avs.pdf
|
|
8
|
+
# http://en.wikipedia.org/wiki/Address_Verification_System
|
|
9
|
+
# http://apps.cybersource.com/library/documentation/dev_guides/CC_Svcs_IG/html/app_avs_cvn_codes.htm#app_AVS_CVN_codes_7891_48375
|
|
10
|
+
# http://imgserver.skipjack.com/imgServer/5293710/AVS%20and%20CVV2.pdf
|
|
11
|
+
# http://www.emsecommerce.net/avs_cvv2_response_codes.htm
|
|
12
|
+
class AVSResult
|
|
13
|
+
MESSAGES = {
|
|
14
|
+
'A' => 'Street address matches, but 5-digit and 9-digit postal code do not match.',
|
|
15
|
+
'B' => 'Street address matches, but postal code not verified.',
|
|
16
|
+
'C' => 'Street address and postal code do not match.',
|
|
17
|
+
'D' => 'Street address and postal code match.',
|
|
18
|
+
'E' => 'AVS data is invalid or AVS is not allowed for this card type.',
|
|
19
|
+
'F' => 'Card member\'s name does not match, but billing postal code matches.',
|
|
20
|
+
'G' => 'Non-U.S. issuing bank does not support AVS.',
|
|
21
|
+
'H' => 'Card member\'s name does not match. Street address and postal code match.',
|
|
22
|
+
'I' => 'Address not verified.',
|
|
23
|
+
'J' => 'Card member\'s name, billing address, and postal code match. Shipping information verified and chargeback protection guaranteed through the Fraud Protection Program.',
|
|
24
|
+
'K' => 'Card member\'s name matches but billing address and billing postal code do not match.',
|
|
25
|
+
'L' => 'Card member\'s name and billing postal code match, but billing address does not match.',
|
|
26
|
+
'M' => 'Street address and postal code match.',
|
|
27
|
+
'N' => 'Street address and postal code do not match.',
|
|
28
|
+
'O' => 'Card member\'s name and billing address match, but billing postal code does not match.',
|
|
29
|
+
'P' => 'Postal code matches, but street address not verified.',
|
|
30
|
+
'Q' => 'Card member\'s name, billing address, and postal code match. Shipping information verified but chargeback protection not guaranteed.',
|
|
31
|
+
'R' => 'System unavailable.',
|
|
32
|
+
'S' => 'U.S.-issuing bank does not support AVS.',
|
|
33
|
+
'T' => 'Card member\'s name does not match, but street address matches.',
|
|
34
|
+
'U' => 'Address information unavailable.',
|
|
35
|
+
'V' => 'Card member\'s name, billing address, and billing postal code match.',
|
|
36
|
+
'W' => 'Street address does not match, but 9-digit postal code matches.',
|
|
37
|
+
'X' => 'Street address and 9-digit postal code match.',
|
|
38
|
+
'Y' => 'Street address and 5-digit postal code match.',
|
|
39
|
+
'Z' => 'Street address does not match, but 5-digit postal code matches.'
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Map vendor's AVS result code to a postal match code
|
|
43
|
+
POSTAL_MATCH_CODE = {
|
|
44
|
+
'Y' => %w( D H F H J L M P Q V W X Y Z ),
|
|
45
|
+
'N' => %w( A C K N O ),
|
|
46
|
+
'X' => %w( G S ),
|
|
47
|
+
nil => %w( B E I R T U )
|
|
48
|
+
}.inject({}) do |map, (type, codes)|
|
|
49
|
+
codes.each { |code| map[code] = type }
|
|
50
|
+
map
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Map vendor's AVS result code to a street match code
|
|
54
|
+
STREET_MATCH_CODE = {
|
|
55
|
+
'Y' => %w( A B D H J M O Q T V X Y ),
|
|
56
|
+
'N' => %w( C K L N P W Z ),
|
|
57
|
+
'X' => %w( G S ),
|
|
58
|
+
nil => %w( E F I R U )
|
|
59
|
+
}.inject({}) do |map, (type, codes)|
|
|
60
|
+
codes.each { |code| map[code] = type }
|
|
61
|
+
map
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
attr_reader :code, :message, :street_match, :postal_match
|
|
65
|
+
|
|
66
|
+
def self.messages
|
|
67
|
+
MESSAGES
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def initialize(attrs)
|
|
71
|
+
attrs ||= {}
|
|
72
|
+
|
|
73
|
+
@code = attrs[:code].upcase unless attrs[:code].blank?
|
|
74
|
+
@message = self.class.messages[code]
|
|
75
|
+
|
|
76
|
+
if attrs[:street_match].blank?
|
|
77
|
+
@street_match = STREET_MATCH_CODE[code]
|
|
78
|
+
else
|
|
79
|
+
@street_match = attrs[:street_match].upcase
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
if attrs[:postal_match].blank?
|
|
83
|
+
@postal_match = POSTAL_MATCH_CODE[code]
|
|
84
|
+
else
|
|
85
|
+
@postal_match = attrs[:postal_match].upcase
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def to_hash
|
|
90
|
+
{ 'code' => code,
|
|
91
|
+
'message' => message,
|
|
92
|
+
'street_match' => street_match,
|
|
93
|
+
'postal_match' => postal_match
|
|
94
|
+
}
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Base
|
|
4
|
+
# Set ActiveMerchant gateways in test mode.
|
|
5
|
+
#
|
|
6
|
+
# ActiveMerchant::Billing::Base.gateway_mode = :test
|
|
7
|
+
mattr_accessor :gateway_mode
|
|
8
|
+
|
|
9
|
+
# Set ActiveMerchant gateways in test mode.
|
|
10
|
+
#
|
|
11
|
+
# ActiveMerchant::Billing::Base.gateway_mode = :test
|
|
12
|
+
mattr_accessor :integration_mode
|
|
13
|
+
|
|
14
|
+
# Set both the mode of both the gateways and integrations
|
|
15
|
+
# at once
|
|
16
|
+
mattr_reader :mode
|
|
17
|
+
|
|
18
|
+
def self.mode=(mode)
|
|
19
|
+
@@mode = mode
|
|
20
|
+
self.gateway_mode = mode
|
|
21
|
+
self.integration_mode = mode
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
self.mode = :production
|
|
25
|
+
|
|
26
|
+
# Return the matching gateway for the provider
|
|
27
|
+
# * <tt>bogus</tt>: BogusGateway - Does nothing (for testing)
|
|
28
|
+
# * <tt>moneris</tt>: MonerisGateway
|
|
29
|
+
# * <tt>authorize_net</tt>: AuthorizeNetGateway
|
|
30
|
+
# * <tt>trust_commerce</tt>: TrustCommerceGateway
|
|
31
|
+
#
|
|
32
|
+
# ActiveMerchant::Billing::Base.gateway('moneris').new
|
|
33
|
+
def self.gateway(name)
|
|
34
|
+
Billing.const_get("#{name.to_s.downcase}_gateway".camelize)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
# Return the matching integration module
|
|
39
|
+
# You can then get the notification from the module
|
|
40
|
+
# * <tt>bogus</tt>: Bogus - Does nothing (for testing)
|
|
41
|
+
# * <tt>chronopay</tt>: Chronopay - Does nothing (for testing)
|
|
42
|
+
# * <tt>paypal</tt>: Chronopay - Does nothing (for testing)
|
|
43
|
+
#
|
|
44
|
+
# chronopay = ActiveMerchant::Billing::Base.integration('chronopay')
|
|
45
|
+
# notification = chronopay.notification(raw_post)
|
|
46
|
+
#
|
|
47
|
+
def self.integration(name)
|
|
48
|
+
Billing::Integrations.const_get("#{name.to_s.downcase}".camelize)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# A check to see if we're in test mode
|
|
52
|
+
def self.test?
|
|
53
|
+
self.gateway_mode == :test
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
# The Check object is a plain old Ruby object, similar to CreditCard. It supports validation
|
|
4
|
+
# of necessary attributes such as checkholder's name, routing and account numbers, but it is
|
|
5
|
+
# not backed by any database.
|
|
6
|
+
#
|
|
7
|
+
# You may use Check in place of CreditCard with any gateway that supports it. Currently, only
|
|
8
|
+
# +BrainTreeGateway+ supports the Check object.
|
|
9
|
+
class Check
|
|
10
|
+
include Validateable
|
|
11
|
+
|
|
12
|
+
attr_accessor :first_name, :last_name, :routing_number, :account_number, :account_holder_type, :account_type, :number
|
|
13
|
+
|
|
14
|
+
# Used for Canadian bank accounts
|
|
15
|
+
attr_accessor :institution_number, :transit_number
|
|
16
|
+
|
|
17
|
+
def name
|
|
18
|
+
@name ||= "#{@first_name} #{@last_name}".strip
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def name=(value)
|
|
22
|
+
return if value.blank?
|
|
23
|
+
|
|
24
|
+
@name = value
|
|
25
|
+
segments = value.split(' ')
|
|
26
|
+
@last_name = segments.pop
|
|
27
|
+
@first_name = segments.join(' ')
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def validate
|
|
31
|
+
[:name, :routing_number, :account_number].each do |attr|
|
|
32
|
+
errors.add(attr, "cannot be empty") if self.send(attr).blank?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
errors.add(:routing_number, "is invalid") unless valid_routing_number?
|
|
36
|
+
|
|
37
|
+
errors.add(:account_holder_type, "must be personal or business") if
|
|
38
|
+
!account_holder_type.blank? && !%w[business personal].include?(account_holder_type.to_s)
|
|
39
|
+
|
|
40
|
+
errors.add(:account_type, "must be checking or savings") if
|
|
41
|
+
!account_type.blank? && !%w[checking savings].include?(account_type.to_s)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def type
|
|
45
|
+
'check'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Routing numbers may be validated by calculating a checksum and dividing it by 10. The
|
|
49
|
+
# formula is:
|
|
50
|
+
# (3(d1 + d4 + d7) + 7(d2 + d5 + d8) + 1(d3 + d6 + d9))mod 10 = 0
|
|
51
|
+
# See http://en.wikipedia.org/wiki/Routing_transit_number#Internal_checksums
|
|
52
|
+
def valid_routing_number?
|
|
53
|
+
d = routing_number.to_s.split('').map(&:to_i).select { |d| (0..9).include?(d) }
|
|
54
|
+
case d.size
|
|
55
|
+
when 9 then
|
|
56
|
+
checksum = ((3 * (d[0] + d[3] + d[6])) +
|
|
57
|
+
(7 * (d[1] + d[4] + d[7])) +
|
|
58
|
+
(d[2] + d[5] + d[8])) % 10
|
|
59
|
+
case checksum
|
|
60
|
+
when 0 then true
|
|
61
|
+
else false
|
|
62
|
+
end
|
|
63
|
+
else false
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|