activemerchant-est 1.4.2.5
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 +480 -0
- data/CONTRIBUTORS +126 -0
- data/MIT-LICENSE +20 -0
- data/README +136 -0
- data/Rakefile +154 -0
- data/gem-public_cert.pem +20 -0
- data/init.rb +3 -0
- data/lib/active_merchant.rb +66 -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.rb +18 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +657 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +233 -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/elavon.rb +134 -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/first_pay.rb +172 -0
- data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
- data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
- data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -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 +220 -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/ogone.rb +279 -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.rb +236 -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_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/paypal.rb +121 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
- data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -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/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.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 +308 -0
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -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 +452 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -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 +189 -0
- data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
- data/lib/active_merchant/billing/integrations.rb +28 -0
- data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
- data/lib/active_merchant/billing/integrations/adyen.rb +29 -0
- data/lib/active_merchant/billing/integrations/adyen/helper.rb +103 -0
- data/lib/active_merchant/billing/integrations/adyen/notification.rb +91 -0
- data/lib/active_merchant/billing/integrations/adyen/return.rb +52 -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 +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/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 +83 -0
- data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
- data/lib/active_merchant/billing/integrations/helper.rb +93 -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/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 +68 -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/pizza.rb +116 -0
- data/lib/active_merchant/billing/integrations/pizza/helper.rb +117 -0
- data/lib/active_merchant/billing/integrations/pizza/notification.rb +101 -0
- data/lib/active_merchant/billing/integrations/quickpay.rb +17 -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 +35 -0
- data/lib/active_merchant/billing/integrations/sampo_est.rb +101 -0
- data/lib/active_merchant/billing/integrations/sampo_est/helper.rb +17 -0
- data/lib/active_merchant/billing/integrations/sampo_est/notification.rb +12 -0
- data/lib/active_merchant/billing/integrations/seb_est.rb +100 -0
- data/lib/active_merchant/billing/integrations/seb_est/helper.rb +16 -0
- data/lib/active_merchant/billing/integrations/seb_est/notification.rb +12 -0
- data/lib/active_merchant/billing/integrations/swedbank_est.rb +99 -0
- data/lib/active_merchant/billing/integrations/swedbank_est/helper.rb +20 -0
- data/lib/active_merchant/billing/integrations/swedbank_est/notification.rb +12 -0
- data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -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/response.rb +32 -0
- data/lib/active_merchant/lib/connection.rb +170 -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/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 +355 -0
- data/test/remote/gateways/remote_authorize_net_cim_test.rb +460 -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_elavon_test.rb +66 -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_first_pay_test.rb +87 -0
- data/test/remote/gateways/remote_instapay_test.rb +61 -0
- data/test/remote/gateways/remote_jetpay_test.rb +103 -0
- data/test/remote/gateways/remote_linkpoint_test.rb +121 -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 +57 -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_ogone_test.rb +115 -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_paypal_express_test.rb +49 -0
- data/test/remote/gateways/remote_paypal_test.rb +191 -0
- data/test/remote/gateways/remote_plugnpay_test.rb +72 -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_pay_test.rb +219 -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_sallie_mae_test.rb +51 -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 +179 -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 +676 -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/elavon_test.rb +139 -0
- data/test/unit/gateways/eway_test.rb +118 -0
- data/test/unit/gateways/exact_test.rb +156 -0
- data/test/unit/gateways/first_pay_test.rb +125 -0
- data/test/unit/gateways/gateway_test.rb +48 -0
- data/test/unit/gateways/instapay_test.rb +102 -0
- data/test/unit/gateways/jetpay_test.rb +185 -0
- data/test/unit/gateways/linkpoint_test.rb +197 -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 +162 -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/ogone_test.rb +319 -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/paypal_express_test.rb +382 -0
- data/test/unit/gateways/paypal_test.rb +569 -0
- data/test/unit/gateways/plugnpay_test.rb +86 -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 +196 -0
- data/test/unit/gateways/sage_pay_test.rb +139 -0
- data/test/unit/gateways/sage_virtual_check_test.rb +71 -0
- data/test/unit/gateways/sallie_mae_test.rb +53 -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 +213 -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/adyen_module_test.rb +9 -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/adyen_helper_test.rb +35 -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 +171 -0
- data/test/unit/integrations/helpers/quickpay_helper_test.rb +40 -0
- data/test/unit/integrations/helpers/seb_est_helper_test.rb +69 -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/adyen_notification_test.rb +25 -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/seb_est_notification_test.rb +87 -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/adyen_return_test.rb +26 -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/sampo_est_module_test.rb +9 -0
- data/test/unit/integrations/seb_est_module_test.rb +9 -0
- data/test/unit/integrations/swedbank_est_module_test.rb +9 -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 +392 -0
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module Paypal
|
|
7
|
+
# Parser and handler for incoming Instant payment notifications from paypal.
|
|
8
|
+
# The Example shows a typical handler in a rails application. Note that this
|
|
9
|
+
# is an example, please read the Paypal API documentation for all the details
|
|
10
|
+
# on creating a safe payment controller.
|
|
11
|
+
#
|
|
12
|
+
# Example
|
|
13
|
+
#
|
|
14
|
+
# class BackendController < ApplicationController
|
|
15
|
+
# include ActiveMerchant::Billing::Integrations
|
|
16
|
+
#
|
|
17
|
+
# def paypal_ipn
|
|
18
|
+
# notify = Paypal::Notification.new(request.raw_post)
|
|
19
|
+
#
|
|
20
|
+
# order = Order.find(notify.item_id)
|
|
21
|
+
#
|
|
22
|
+
# if notify.acknowledge
|
|
23
|
+
# begin
|
|
24
|
+
#
|
|
25
|
+
# if notify.complete? and order.total == notify.amount
|
|
26
|
+
# order.status = 'success'
|
|
27
|
+
#
|
|
28
|
+
# shop.ship(order)
|
|
29
|
+
# else
|
|
30
|
+
# logger.error("Failed to verify Paypal's notification, please investigate")
|
|
31
|
+
# end
|
|
32
|
+
#
|
|
33
|
+
# rescue => e
|
|
34
|
+
# order.status = 'failed'
|
|
35
|
+
# raise
|
|
36
|
+
# ensure
|
|
37
|
+
# order.save
|
|
38
|
+
# end
|
|
39
|
+
# end
|
|
40
|
+
#
|
|
41
|
+
# render :nothing
|
|
42
|
+
# end
|
|
43
|
+
# end
|
|
44
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
45
|
+
include PostsData
|
|
46
|
+
|
|
47
|
+
# Was the transaction complete?
|
|
48
|
+
def complete?
|
|
49
|
+
status == "Completed"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# When was this payment received by the client.
|
|
53
|
+
# sometimes it can happen that we get the notification much later.
|
|
54
|
+
# One possible scenario is that our web application was down. In this case paypal tries several
|
|
55
|
+
# times an hour to inform us about the notification
|
|
56
|
+
def received_at
|
|
57
|
+
Time.parse params['payment_date']
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Status of transaction. List of possible values:
|
|
61
|
+
# <tt>Canceled-Reversal</tt>::
|
|
62
|
+
# <tt>Completed</tt>::
|
|
63
|
+
# <tt>Denied</tt>::
|
|
64
|
+
# <tt>Expired</tt>::
|
|
65
|
+
# <tt>Failed</tt>::
|
|
66
|
+
# <tt>In-Progress</tt>::
|
|
67
|
+
# <tt>Partially-Refunded</tt>::
|
|
68
|
+
# <tt>Pending</tt>::
|
|
69
|
+
# <tt>Processed</tt>::
|
|
70
|
+
# <tt>Refunded</tt>::
|
|
71
|
+
# <tt>Reversed</tt>::
|
|
72
|
+
# <tt>Voided</tt>::
|
|
73
|
+
def status
|
|
74
|
+
params['payment_status']
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
# Id of this transaction (paypal number)
|
|
78
|
+
def transaction_id
|
|
79
|
+
params['txn_id']
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# What type of transaction are we dealing with?
|
|
83
|
+
# "cart" "send_money" "web_accept" are possible here.
|
|
84
|
+
def type
|
|
85
|
+
params['txn_type']
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# the money amount we received in X.2 decimal.
|
|
89
|
+
def gross
|
|
90
|
+
params['mc_gross']
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# the markup paypal charges for the transaction
|
|
94
|
+
def fee
|
|
95
|
+
params['mc_fee']
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# What currency have we been dealing with
|
|
99
|
+
def currency
|
|
100
|
+
params['mc_currency']
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# This is the item number which we submitted to paypal
|
|
104
|
+
# The custom field is also mapped to item_id because PayPal
|
|
105
|
+
# doesn't return item_number in dispute notifications
|
|
106
|
+
def item_id
|
|
107
|
+
params['item_number'] || params['custom']
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# This is the invoice which you passed to paypal
|
|
111
|
+
def invoice
|
|
112
|
+
params['invoice']
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Was this a test transaction?
|
|
116
|
+
def test?
|
|
117
|
+
params['test_ipn'] == '1'
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def account
|
|
121
|
+
params['business'] || params['receiver_email']
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Acknowledge the transaction to paypal. This method has to be called after a new
|
|
125
|
+
# ipn arrives. Paypal will verify that all the information we received are correct and will return a
|
|
126
|
+
# ok or a fail.
|
|
127
|
+
#
|
|
128
|
+
# Example:
|
|
129
|
+
#
|
|
130
|
+
# def paypal_ipn
|
|
131
|
+
# notify = PaypalNotification.new(request.raw_post)
|
|
132
|
+
#
|
|
133
|
+
# if notify.acknowledge
|
|
134
|
+
# ... process order ... if notify.complete?
|
|
135
|
+
# else
|
|
136
|
+
# ... log possible hacking attempt ...
|
|
137
|
+
# end
|
|
138
|
+
def acknowledge
|
|
139
|
+
payload = raw
|
|
140
|
+
|
|
141
|
+
response = ssl_post(Paypal.service_url + '?cmd=_notify-validate', payload,
|
|
142
|
+
'Content-Length' => "#{payload.size}",
|
|
143
|
+
'User-Agent' => "Active Merchant -- http://activemerchant.org"
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
raise StandardError.new("Faulty paypal result: #{response}") unless ["VERIFIED", "INVALID"].include?(response)
|
|
147
|
+
|
|
148
|
+
response == "VERIFIED"
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
require 'active_merchant/billing/integrations/pizza/helper.rb'
|
|
2
|
+
require 'active_merchant/billing/integrations/pizza/notification.rb'
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module Pizza
|
|
7
|
+
|
|
8
|
+
# Define sender id (VK_SND_ID) to bank module mappings.
|
|
9
|
+
def self.get_class(vk_snd_id)
|
|
10
|
+
case vk_snd_id
|
|
11
|
+
when 'EYP' then SebEst
|
|
12
|
+
when 'SAMPOPANK' then SampoEst
|
|
13
|
+
when 'HP' then SwedbankEst
|
|
14
|
+
else raise(ArgumentError, "unknown sender id: #{vk_snd_id}")
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Define required fields for each service message.
|
|
19
|
+
# We need to know this in order to calculate VK_MAC
|
|
20
|
+
# from a given hash of parameters.
|
|
21
|
+
# Order of the parameters is important.
|
|
22
|
+
mattr_accessor :required_service_params
|
|
23
|
+
self.required_service_params = {
|
|
24
|
+
1001 => [
|
|
25
|
+
'VK_SERVICE',
|
|
26
|
+
'VK_VERSION',
|
|
27
|
+
'VK_SND_ID',
|
|
28
|
+
'VK_STAMP',
|
|
29
|
+
'VK_AMOUNT',
|
|
30
|
+
'VK_CURR',
|
|
31
|
+
'VK_ACC',
|
|
32
|
+
'VK_NAME',
|
|
33
|
+
'VK_REF',
|
|
34
|
+
'VK_MSG'],
|
|
35
|
+
1002 => [
|
|
36
|
+
'VK_SERVICE',
|
|
37
|
+
'VK_VERSION',
|
|
38
|
+
'VK_SND_ID',
|
|
39
|
+
'VK_STAMP',
|
|
40
|
+
'VK_AMOUNT',
|
|
41
|
+
'VK_CURR',
|
|
42
|
+
'VK_REF',
|
|
43
|
+
'VK_MSG' ],
|
|
44
|
+
1101 => [
|
|
45
|
+
'VK_SERVICE',
|
|
46
|
+
'VK_VERSION',
|
|
47
|
+
'VK_SND_ID',
|
|
48
|
+
'VK_REC_ID',
|
|
49
|
+
'VK_STAMP',
|
|
50
|
+
'VK_T_NO',
|
|
51
|
+
'VK_AMOUNT',
|
|
52
|
+
'VK_CURR',
|
|
53
|
+
'VK_REC_ACC',
|
|
54
|
+
'VK_REC_NAME',
|
|
55
|
+
'VK_SND_ACC',
|
|
56
|
+
'VK_SND_NAME',
|
|
57
|
+
'VK_REF',
|
|
58
|
+
'VK_MSG',
|
|
59
|
+
'VK_T_DATE'],
|
|
60
|
+
1901 => [
|
|
61
|
+
'VK_SERVICE',
|
|
62
|
+
'VK_VERSION',
|
|
63
|
+
'VK_SND_ID',
|
|
64
|
+
'VK_REC_ID',
|
|
65
|
+
'VK_STAMP',
|
|
66
|
+
'VK_REF',
|
|
67
|
+
'VK_MSG']
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
# Calculation using method VK_VERSION=008:
|
|
71
|
+
# VK_MAC is RSA signature of the request fields coded into BASE64.
|
|
72
|
+
# VK_MAC will be calculated using secret key of the sender using RSA. Signature will
|
|
73
|
+
# be calculated for string that consists of all field lengths and contents in the query. Also
|
|
74
|
+
# empty fields are used in calculation – lenght “000”. Unnumbered (optional) fields are
|
|
75
|
+
# not used in calculation.
|
|
76
|
+
# MAC(x1,x2,...,xn) := RSA( SHA-1(p(x1 )|| x1|| p(x2 )|| x2 || ... ||p( xn )||xn),d,n)
|
|
77
|
+
# where:
|
|
78
|
+
# || is string concatenation mark
|
|
79
|
+
# x1, x2, ..., xn are parameters of the query
|
|
80
|
+
# p(x) is length of the field x represented by three digits
|
|
81
|
+
# d is RSA secret exponent
|
|
82
|
+
# n is RSA modulus
|
|
83
|
+
module Common
|
|
84
|
+
# p(x) is length of the field x represented by three digits
|
|
85
|
+
def func_p(val)
|
|
86
|
+
sprintf("%03i", val.size)
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Generate a string to be signed out of service message parameters.
|
|
90
|
+
# p(x1 )|| x1|| p(x2 )|| x2 || ... ||p( xn )||xn
|
|
91
|
+
# || is string concatenation mark
|
|
92
|
+
# p(x) is length of the field x represented by three digits
|
|
93
|
+
# Parameters val1, val2, value3 would be turned into:
|
|
94
|
+
# '003val1003val2006value3'
|
|
95
|
+
def generate_data_string(service_msg_number, sigparams)
|
|
96
|
+
str = ''
|
|
97
|
+
Pizza.required_service_params[Integer(service_msg_number)].each do |param|
|
|
98
|
+
val = sigparams[param].to_s # nil goes to ''
|
|
99
|
+
str << func_p(val) << val
|
|
100
|
+
end
|
|
101
|
+
str
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
def generate_signature(service_msg_number, sigparams)
|
|
105
|
+
privkey = self.class.parent.get_private_key
|
|
106
|
+
privkey.sign(OpenSSL::Digest::SHA1.new, generate_data_string(service_msg_number, sigparams))
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def generate_mac(service_msg_number, sigparams)
|
|
110
|
+
Base64.encode64(generate_signature(service_msg_number, sigparams)).gsub(/\n/,'')
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Pizza #:nodoc:
|
|
5
|
+
module Helper #:nodoc:
|
|
6
|
+
|
|
7
|
+
def self.included(base)
|
|
8
|
+
base.class_eval do
|
|
9
|
+
mapping :account, 'VK_SND_ID'
|
|
10
|
+
# Amount paid, for example, "33.00"
|
|
11
|
+
mapping :amount, 'VK_AMOUNT'
|
|
12
|
+
# Unique order id
|
|
13
|
+
mapping :order, 'VK_STAMP'
|
|
14
|
+
# Currency used, 3-letter ISO 4217 code
|
|
15
|
+
mapping :currency, 'VK_CURR'
|
|
16
|
+
mapping :notify_url, 'VK_RETURN'
|
|
17
|
+
mapping :return_url, 'VK_RETURN'
|
|
18
|
+
mapping :cancel_return_url, 'VK_CANCEL'
|
|
19
|
+
|
|
20
|
+
mapping :reference, 'VK_REF'
|
|
21
|
+
mapping :description, 'VK_MSG'
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def initialize(order, account, options = {})
|
|
26
|
+
old_valid_keys = [:amount, :currency, :test]
|
|
27
|
+
new_valid_keys = [:description, :reference]
|
|
28
|
+
valid_keys = (old_valid_keys + new_valid_keys + Pizza.required_service_params.values << :service_msg_number).uniq
|
|
29
|
+
options.assert_valid_keys(valid_keys)
|
|
30
|
+
|
|
31
|
+
@options = options
|
|
32
|
+
@fields = {}
|
|
33
|
+
self.order = order
|
|
34
|
+
self.account = account
|
|
35
|
+
self.amount = options[:amount]
|
|
36
|
+
self.currency = options[:currency]
|
|
37
|
+
self.description = options[:description]
|
|
38
|
+
self.reference = options[:reference]
|
|
39
|
+
|
|
40
|
+
if options[:service_msg_number]
|
|
41
|
+
@service_msg_number = options.delete(:service_msg_number)
|
|
42
|
+
else
|
|
43
|
+
@service_msg_number = default_service_msg_number
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
add_required_params
|
|
47
|
+
add_charset_field
|
|
48
|
+
add_vk_mac
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Amount can be supplied with a optional dot separator for cents.
|
|
52
|
+
def amount=(amount)
|
|
53
|
+
# TODO check this, sooner or later someone will get a wrong amount.
|
|
54
|
+
|
|
55
|
+
# If a string is passed to us, don't do anything.
|
|
56
|
+
# If a Money object is passed to us, don't do anything.
|
|
57
|
+
# Otherwise delegate the handling to the money object
|
|
58
|
+
# and free ourself from the responsibility, yay.
|
|
59
|
+
if amount.is_a?(String) || amount.is_a?(Money)
|
|
60
|
+
add_field('VK_AMOUNT', amount)
|
|
61
|
+
else
|
|
62
|
+
add_field('VK_AMOUNT', Money.new(amount).to_s)
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def add_vk_mac
|
|
67
|
+
# Signature used to validate previous parameters
|
|
68
|
+
add_field('VK_MAC', generate_mac(@service_msg_number, form_fields))
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def add_charset_field
|
|
72
|
+
add_field vk_charset_param, vk_charset
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def add_required_params
|
|
76
|
+
required_params = Pizza.required_service_params[@service_msg_number]
|
|
77
|
+
required_params.each do |param|
|
|
78
|
+
param_value = (@options.delete(param) || send(param.to_s.downcase)).to_s
|
|
79
|
+
add_field param, iconv.iconv(param_value)
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Default parameters
|
|
84
|
+
def vk_charset
|
|
85
|
+
'ISO-8859-1'
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def vk_charset_param
|
|
89
|
+
'VK_CHARSET'
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def vk_service
|
|
93
|
+
@service_msg_number
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def vk_version
|
|
97
|
+
'008'
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
# Default service message number.
|
|
101
|
+
# Use '1002' because it requires the least amount of parameters.
|
|
102
|
+
def default_service_msg_number
|
|
103
|
+
1002
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
private
|
|
107
|
+
# Iconv converter to convert from utf8 to
|
|
108
|
+
# the charset the bank api expects.
|
|
109
|
+
def iconv
|
|
110
|
+
@iconv ||= Iconv.new(vk_charset, 'UTF-8')
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Pizza
|
|
5
|
+
module Notification
|
|
6
|
+
|
|
7
|
+
# A helper method to parse the raw post of the request & return
|
|
8
|
+
# the right Notification subclass based on the sender id.
|
|
9
|
+
def self.get_notification(http_raw_data)
|
|
10
|
+
params = ActiveMerchant::Billing::Integrations::Notification.new(http_raw_data).params
|
|
11
|
+
Pizza.get_class(params['VK_SND_ID'])::Notification.new(params)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def bank_signature_valid?(bank_signature, service_msg_number, sigparams)
|
|
15
|
+
self.class.parent.get_bank_public_key.verify(OpenSSL::Digest::SHA1.new, bank_signature, generate_data_string(service_msg_number, sigparams))
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def complete?
|
|
19
|
+
params['VK_SERVICE'] == '1101'
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def currency
|
|
23
|
+
params['VK_CURR']
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# The order id we passed to the form helper.
|
|
27
|
+
def item_id
|
|
28
|
+
params['VK_STAMP']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def transaction_id
|
|
32
|
+
params['VK_T_NO']
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# When was this payment received by the client.
|
|
36
|
+
# We're expecting a dd.mm.yyyy format.
|
|
37
|
+
def received_at
|
|
38
|
+
date = params['VK_T_DATE']
|
|
39
|
+
return nil unless date
|
|
40
|
+
day, month, year = *date.split('.').map(&:to_i)
|
|
41
|
+
Date.civil(year, month, day)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def signature
|
|
45
|
+
Base64.decode64(params['VK_MAC'])
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# The money amount we received, string.
|
|
49
|
+
def gross
|
|
50
|
+
params['VK_AMOUNT']
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Was this a test transaction?
|
|
54
|
+
def test?
|
|
55
|
+
params['VK_REC_ID'] == 'testvpos'
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# TODO what should be here?
|
|
59
|
+
def status
|
|
60
|
+
complete? ? 'Completed' : 'Failed'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# If our request was sent automatically by the bank (true) or manually
|
|
64
|
+
# by the user triggering the callback by pressing a "return" button (false).
|
|
65
|
+
def automatic?
|
|
66
|
+
params['VK_AUTO'].upcase == 'Y'
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def success?
|
|
70
|
+
acknowledge && complete?
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# We don't actually acknowledge the notification by making another request ourself,
|
|
74
|
+
# instead, we check the notification by checking the signature that came with the notification.
|
|
75
|
+
# This method has to be called when handling the notification & deciding whether to process the order.
|
|
76
|
+
# Example:
|
|
77
|
+
#
|
|
78
|
+
# def notify
|
|
79
|
+
# notify = Notification.new(params)
|
|
80
|
+
#
|
|
81
|
+
# if notify.acknowledge
|
|
82
|
+
# ... process order ... if notify.complete?
|
|
83
|
+
# else
|
|
84
|
+
# ... log possible hacking attempt ...
|
|
85
|
+
# end
|
|
86
|
+
def acknowledge
|
|
87
|
+
bank_signature_valid?(signature, params['VK_SERVICE'], params)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
private
|
|
91
|
+
# Take the posted data and move the relevant data into a hash
|
|
92
|
+
# No parsing since we're already expecting a hash.
|
|
93
|
+
def parse(params)
|
|
94
|
+
raise(ArgumentError, 'Need a hash') unless params.is_a?(Hash)
|
|
95
|
+
@params = params
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
end
|