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,76 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
|
|
3
|
+
module ActiveMerchant #:nodoc:
|
|
4
|
+
module Billing #:nodoc:
|
|
5
|
+
module Integrations #:nodoc:
|
|
6
|
+
module DirecPay
|
|
7
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
8
|
+
RESPONSE_PARAMS = ['DirecPay Reference ID', 'Flag', 'Country', 'Currency', 'Other Details', 'Merchant Order No', 'Amount']
|
|
9
|
+
|
|
10
|
+
def acknowledge
|
|
11
|
+
true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def complete?
|
|
15
|
+
status == 'Completed' || status == 'Pending'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def status
|
|
19
|
+
case params['Flag']
|
|
20
|
+
when 'SUCCESS'
|
|
21
|
+
'Completed'
|
|
22
|
+
when 'PENDING'
|
|
23
|
+
'Pending'
|
|
24
|
+
when 'FAIL'
|
|
25
|
+
'Failed'
|
|
26
|
+
else
|
|
27
|
+
'Error'
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def item_id
|
|
32
|
+
params['Merchant Order No']
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def transaction_id
|
|
36
|
+
params['DirecPay Reference ID']
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# the money amount we received in X.2 decimal
|
|
40
|
+
def gross
|
|
41
|
+
params['Amount']
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def currency
|
|
45
|
+
params['Currency']
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def country
|
|
49
|
+
params['Country']
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def other_details
|
|
53
|
+
params['Other Details']
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def test?
|
|
57
|
+
false
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Take the posted data and move the relevant data into a hash
|
|
61
|
+
def parse(post)
|
|
62
|
+
super
|
|
63
|
+
|
|
64
|
+
values = params['responseparams'].to_s.split('|')
|
|
65
|
+
response_params = values.size == 3 ? ['DirecPay Reference ID', 'Flag', 'Error message'] : RESPONSE_PARAMS
|
|
66
|
+
response_params.each_with_index do |name, index|
|
|
67
|
+
params[name] = values[index]
|
|
68
|
+
end
|
|
69
|
+
params
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
|
|
5
|
+
module DirecPay
|
|
6
|
+
class Return < ActiveMerchant::Billing::Integrations::Return
|
|
7
|
+
|
|
8
|
+
def initialize(post_data, options = {})
|
|
9
|
+
@notification = Notification.new(treat_failure_as_pending(post_data), options)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def success?
|
|
13
|
+
notification.complete?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def message
|
|
17
|
+
notification.status
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
# Work around the issue that the initial return from DirecPay is always either SUCCESS or FAIL, there is no PENDING
|
|
24
|
+
def treat_failure_as_pending(post_data)
|
|
25
|
+
post_data.sub(/FAIL/, 'PENDING')
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module DirecPay
|
|
5
|
+
|
|
6
|
+
class Status
|
|
7
|
+
include PostsData
|
|
8
|
+
|
|
9
|
+
STATUS_TEST_URL = 'https://test.timesofmoney.com/direcpay/secure/dpPullMerchAtrnDtls.jsp'
|
|
10
|
+
STATUS_LIVE_URL = 'https://www.timesofmoney.com/direcpay/secure/dpPullMerchAtrnDtls.jsp'
|
|
11
|
+
|
|
12
|
+
attr_reader :account, :options
|
|
13
|
+
|
|
14
|
+
def initialize(account, options = {})
|
|
15
|
+
@account, @options = account, options
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
# Use this method to manually request a status update to the provided notification_url
|
|
20
|
+
def update(authorization, notification_url)
|
|
21
|
+
url = test? ? STATUS_TEST_URL : STATUS_LIVE_URL
|
|
22
|
+
parameters = [ authorization, account, notification_url ]
|
|
23
|
+
data = PostData.new
|
|
24
|
+
data[:requestparams] = parameters.join('|')
|
|
25
|
+
|
|
26
|
+
response = ssl_get("#{url}?#{data.to_post_data}")
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def test?
|
|
30
|
+
ActiveMerchant::Billing::Base.integration_mode == :test || options[:test]
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Directebanking
|
|
5
|
+
autoload :Return, File.dirname(__FILE__) + '/directebanking/return.rb'
|
|
6
|
+
autoload :Helper, File.dirname(__FILE__) + '/directebanking/helper.rb'
|
|
7
|
+
autoload :Notification, File.dirname(__FILE__) + '/directebanking/notification.rb'
|
|
8
|
+
|
|
9
|
+
# Supported countries:
|
|
10
|
+
# Germany - DE
|
|
11
|
+
# Austria - AT
|
|
12
|
+
# Belgium - BE
|
|
13
|
+
# Netherlands - NL
|
|
14
|
+
# Switzerland - CH
|
|
15
|
+
# Great Britain - GB
|
|
16
|
+
|
|
17
|
+
# Overwrite this if you want to change the directebanking test url
|
|
18
|
+
mattr_accessor :test_url
|
|
19
|
+
self.test_url = 'https://www.directebanking.com/payment/start'
|
|
20
|
+
|
|
21
|
+
# Overwrite this if you want to change the directebanking production url
|
|
22
|
+
mattr_accessor :production_url
|
|
23
|
+
self.production_url = 'https://www.directebanking.com/payment/start'
|
|
24
|
+
|
|
25
|
+
def self.service_url
|
|
26
|
+
mode = ActiveMerchant::Billing::Base.integration_mode
|
|
27
|
+
case mode
|
|
28
|
+
when :production
|
|
29
|
+
self.production_url
|
|
30
|
+
when :test
|
|
31
|
+
self.test_url
|
|
32
|
+
else
|
|
33
|
+
raise StandardError, "Integration mode set to an invalid value: #{mode}"
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.notification(post, options = {})
|
|
38
|
+
Notification.new(post, options)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def self.return(post, options = {})
|
|
42
|
+
Return.new(post, options)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Directebanking
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
|
|
7
|
+
# All credentials are mandatory and need to be set
|
|
8
|
+
#
|
|
9
|
+
# credential1: User ID
|
|
10
|
+
# credential2: Project ID
|
|
11
|
+
# credential3: Project Password (Algorithm: SH1)
|
|
12
|
+
# credential4: Notification Password (Algorithm: SH1)
|
|
13
|
+
def initialize(order, account, options = {})
|
|
14
|
+
super
|
|
15
|
+
add_field('user_variable_0', order)
|
|
16
|
+
add_field('project_id', options[:credential2])
|
|
17
|
+
@project_password = options[:credential3]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
SIGNATURE_FIELDS = [
|
|
21
|
+
:user_id,
|
|
22
|
+
:project_id,
|
|
23
|
+
:sender_holder,
|
|
24
|
+
:sender_account_number,
|
|
25
|
+
:sender_bank_code,
|
|
26
|
+
:sender_country_id,
|
|
27
|
+
:amount,
|
|
28
|
+
:currency_id,
|
|
29
|
+
:reason_1,
|
|
30
|
+
:reason_2,
|
|
31
|
+
:user_variable_0,
|
|
32
|
+
:user_variable_1,
|
|
33
|
+
:user_variable_2,
|
|
34
|
+
:user_variable_3,
|
|
35
|
+
:user_variable_4,
|
|
36
|
+
:user_variable_5
|
|
37
|
+
]
|
|
38
|
+
|
|
39
|
+
SIGNATURE_IGNORE_AT_METHOD_CREATION_FIELDS = [
|
|
40
|
+
:user_id,
|
|
41
|
+
:amount,
|
|
42
|
+
:project_id,
|
|
43
|
+
:currency_id,
|
|
44
|
+
:user_variable_0,
|
|
45
|
+
:user_variable_1,
|
|
46
|
+
:user_variable_2,
|
|
47
|
+
:user_variable_3
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
SIGNATURE_FIELDS.each do |key|
|
|
51
|
+
if !SIGNATURE_IGNORE_AT_METHOD_CREATION_FIELDS.include?(key)
|
|
52
|
+
mapping "#{key}".to_sym, "#{key.to_s}"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Need to format the amount to have 2 decimal places
|
|
57
|
+
def amount=(money)
|
|
58
|
+
cents = money.respond_to?(:cents) ? money.cents : money
|
|
59
|
+
if money.is_a?(String) or cents.to_i <= 0
|
|
60
|
+
raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
|
|
61
|
+
end
|
|
62
|
+
add_field mappings[:amount], sprintf("%.2f", cents.to_f/100)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def generate_signature_string
|
|
66
|
+
# format of signature: user_id|project_id|sender_holder|sender_account_number|sender_bank_code| sender_country_id|amount|currency_id|reason_1|reason_2|user_variable_0|user_variable_1|user_variable_2|user_variable_3|user_variable_4|user_variable_5|project_password
|
|
67
|
+
SIGNATURE_FIELDS.map {|key| @fields[key.to_s]} * "|" + "|#{@project_password}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def generate_signature
|
|
71
|
+
Digest::SHA1.hexdigest(generate_signature_string)
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def form_fields
|
|
75
|
+
@fields.merge('hash' => generate_signature)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
mapping :account, 'user_id'
|
|
79
|
+
mapping :amount, 'amount'
|
|
80
|
+
mapping :currency, 'currency_id'
|
|
81
|
+
mapping :description, 'reason_1'
|
|
82
|
+
|
|
83
|
+
mapping :return_url, 'user_variable_1'
|
|
84
|
+
mapping :cancel_return_url, 'user_variable_2'
|
|
85
|
+
mapping :notify_url, 'user_variable_3'
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Directebanking
|
|
5
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
6
|
+
|
|
7
|
+
def initialize(data, options)
|
|
8
|
+
if options[:credential4].nil?
|
|
9
|
+
raise ArgumentError, "You need to provide the notification password (SH1) as the option :credential4 to verify that the notification originated from Directebanking (Payment Networks AG)"
|
|
10
|
+
end
|
|
11
|
+
super
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def complete?
|
|
15
|
+
status == 'Completed'
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def item_id
|
|
19
|
+
params['user_variable_0']
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def transaction_id
|
|
23
|
+
params['transaction']
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# When was this payment received by the client.
|
|
27
|
+
def received_at
|
|
28
|
+
Time.parse(params['created']) if params['created']
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# the money amount we received in X.2 decimal.
|
|
32
|
+
def gross
|
|
33
|
+
"%.2f" % params['amount'].to_f
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def status
|
|
37
|
+
'Completed'
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def currency
|
|
41
|
+
params['currency_id']
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test?
|
|
45
|
+
params['sender_bank_name'] == 'Testbank'
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# for verifying the signature of the URL parameters
|
|
49
|
+
PAYMENT_HOOK_SIGNATURE_FIELDS = [
|
|
50
|
+
:transaction,
|
|
51
|
+
:user_id,
|
|
52
|
+
:project_id,
|
|
53
|
+
:sender_holder,
|
|
54
|
+
:sender_account_number,
|
|
55
|
+
:sender_bank_code,
|
|
56
|
+
:sender_bank_name,
|
|
57
|
+
:sender_bank_bic,
|
|
58
|
+
:sender_iban,
|
|
59
|
+
:sender_country_id,
|
|
60
|
+
:recipient_holder,
|
|
61
|
+
:recipient_account_number,
|
|
62
|
+
:recipient_bank_code,
|
|
63
|
+
:recipient_bank_name,
|
|
64
|
+
:recipient_bank_bic,
|
|
65
|
+
:recipient_iban,
|
|
66
|
+
:recipient_country_id,
|
|
67
|
+
:international_transaction,
|
|
68
|
+
:amount,
|
|
69
|
+
:currency_id,
|
|
70
|
+
:reason_1,
|
|
71
|
+
:reason_2,
|
|
72
|
+
:security_criteria,
|
|
73
|
+
:user_variable_0,
|
|
74
|
+
:user_variable_1,
|
|
75
|
+
:user_variable_2,
|
|
76
|
+
:user_variable_3,
|
|
77
|
+
:user_variable_4,
|
|
78
|
+
:user_variable_5,
|
|
79
|
+
:created
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
PAYMENT_HOOK_IGNORE_AT_METHOD_CREATION_FIELDS = [
|
|
83
|
+
:transaction,
|
|
84
|
+
:amount,
|
|
85
|
+
:currency_id,
|
|
86
|
+
:user_variable_0,
|
|
87
|
+
:user_variable_1,
|
|
88
|
+
:user_variable_2,
|
|
89
|
+
:user_variable_3,
|
|
90
|
+
:created
|
|
91
|
+
]
|
|
92
|
+
|
|
93
|
+
# Provide access to raw fields
|
|
94
|
+
PAYMENT_HOOK_SIGNATURE_FIELDS.each do |key|
|
|
95
|
+
if !PAYMENT_HOOK_IGNORE_AT_METHOD_CREATION_FIELDS.include?(key)
|
|
96
|
+
define_method(key.to_s) do
|
|
97
|
+
params[key.to_s]
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def generate_signature_string
|
|
103
|
+
#format is: transaction|user_id|project_id|sender_holder|sender_account_number|sender_bank_code|sender_bank_name|sender_bank_bic|sender_iban|sender_country_id|recipient_holder|recipient_account_number|recipient_bank_code|recipient_bank_name|recipient_bank_bic|recipient_iban|recipient_country_id|international_transaction|amount|currency_id|reason_1|reason_2|security_criteria|user_variable_0|user_variable_1|user_variable_2|user_variable_3|user_variable_4|user_variable_5|created|notification_password
|
|
104
|
+
PAYMENT_HOOK_SIGNATURE_FIELDS.map {|key| params[key.to_s]} * "|" + "|#{@options[:credential4]}"
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def generate_signature
|
|
108
|
+
Digest::SHA1.hexdigest(generate_signature_string)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def acknowledge
|
|
112
|
+
# signature_is_valid?
|
|
113
|
+
generate_signature.to_s == params['hash'].to_s
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
120
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# All mappings in helper.rb are required fields to be sent to Dwolla.
|
|
2
|
+
# :account = 'Dwolla Id of merchant'
|
|
3
|
+
# :credential1 = 'key from Dwolla Application'
|
|
4
|
+
# :credential2 = 'secret from Dwolla Application'
|
|
5
|
+
# :redirect_url = 'can be different that what is specified on Dwolla Application creation'
|
|
6
|
+
# :return_url = 'can be different that what is specified on Dwolla Application creation'
|
|
7
|
+
# :order_id = must be unique for each transaction
|
|
8
|
+
|
|
9
|
+
module ActiveMerchant #:nodoc:
|
|
10
|
+
module Billing #:nodoc:
|
|
11
|
+
module Integrations #:nodoc:
|
|
12
|
+
module Dwolla
|
|
13
|
+
autoload :Return, 'active_merchant/billing/integrations/dwolla/return.rb'
|
|
14
|
+
autoload :Helper, 'active_merchant/billing/integrations/dwolla/helper.rb'
|
|
15
|
+
autoload :Notification, 'active_merchant/billing/integrations/dwolla/notification.rb'
|
|
16
|
+
|
|
17
|
+
mattr_accessor :service_url
|
|
18
|
+
self.service_url = 'https://www.dwolla.com/payment/pay'
|
|
19
|
+
|
|
20
|
+
def self.notification(post, options={})
|
|
21
|
+
Notification.new(post)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def self.return(query_string, options={})
|
|
25
|
+
Return.new(query_string)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|