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,88 @@
|
|
|
1
|
+
|
|
2
|
+
module ActiveMerchant #:nodoc:
|
|
3
|
+
module Billing #:nodoc:
|
|
4
|
+
module Integrations #:nodoc:
|
|
5
|
+
# To start with Nochex, follow the instructions for installing
|
|
6
|
+
# ActiveMerchant as a plugin, as described on
|
|
7
|
+
# http://www.activemerchant.org/.
|
|
8
|
+
#
|
|
9
|
+
# The plugin will automatically add the ActionView helper for
|
|
10
|
+
# ActiveMerchant, which will allow you to make the Nochex payments.
|
|
11
|
+
# The idea behind the helper is that it generates an invisible
|
|
12
|
+
# forwarding screen that will automatically redirect the user.
|
|
13
|
+
# So you would collect all the information about the order and then
|
|
14
|
+
# simply render the hidden form, which redirects the user to Nochex.
|
|
15
|
+
#
|
|
16
|
+
# The syntax of the helper is as follows:
|
|
17
|
+
#
|
|
18
|
+
# <% payment_service_for 'order id', 'nochex_user_id',
|
|
19
|
+
# :amount => 50.00,
|
|
20
|
+
# :service => :nochex,
|
|
21
|
+
# :html => { :id => 'nochex-form' } do |service| %>
|
|
22
|
+
#
|
|
23
|
+
# <% service.customer :first_name => 'Cody',
|
|
24
|
+
# :last_name => 'Fauser',
|
|
25
|
+
# :phone => '(555)555-5555',
|
|
26
|
+
# :email => 'cody@example.com' %>
|
|
27
|
+
#
|
|
28
|
+
# <% service.billing_address :city => 'Ottawa',
|
|
29
|
+
# :address1 => '21 Snowy Brook Lane',
|
|
30
|
+
# :address2 => 'Apt. 36',
|
|
31
|
+
# :state => 'ON',
|
|
32
|
+
# :country => 'CA',
|
|
33
|
+
# :zip => 'K1J1E5' %>
|
|
34
|
+
#
|
|
35
|
+
# <% service.invoice '#1000' %>
|
|
36
|
+
# <% service.shipping '0.00' %>
|
|
37
|
+
# <% service.tax '0.00' %>
|
|
38
|
+
#
|
|
39
|
+
# <% service.notify_url url_for(:action => 'notify', :only_path => false) %>
|
|
40
|
+
# <% service.return_url url_for(:action => 'done', :only_path => false) %>
|
|
41
|
+
# <% service.cancel_return_url 'http://mystore.com' %>
|
|
42
|
+
# <% end %>
|
|
43
|
+
#
|
|
44
|
+
# The notify_url is the URL that the Nochex IPN will be sent. You can
|
|
45
|
+
# handle the notification in your controller action as follows:
|
|
46
|
+
#
|
|
47
|
+
# class NotificationController < ApplicationController
|
|
48
|
+
# include ActiveMerchant::Billing::Integrations
|
|
49
|
+
#
|
|
50
|
+
# def notify
|
|
51
|
+
# notification = Nochex::Notification.new(request.raw_post)
|
|
52
|
+
#
|
|
53
|
+
# begin
|
|
54
|
+
# # Acknowledge notification with Nochex
|
|
55
|
+
# raise StandardError, 'Illegal Notification' unless notification.acknowledge
|
|
56
|
+
# # Process the payment
|
|
57
|
+
# rescue => e
|
|
58
|
+
# logger.warn("Illegal notification received: #{e.message}")
|
|
59
|
+
# ensure
|
|
60
|
+
# head(:ok)
|
|
61
|
+
# end
|
|
62
|
+
# end
|
|
63
|
+
# end
|
|
64
|
+
module Nochex
|
|
65
|
+
autoload :Return, File.dirname(__FILE__) + '/nochex/return.rb'
|
|
66
|
+
autoload :Helper, File.dirname(__FILE__) + '/nochex/helper.rb'
|
|
67
|
+
autoload :Notification, File.dirname(__FILE__) + '/nochex/notification.rb'
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
mattr_accessor :service_url
|
|
71
|
+
self.service_url = 'https://secure.nochex.com'
|
|
72
|
+
|
|
73
|
+
mattr_accessor :notification_confirmation_url
|
|
74
|
+
self.notification_confirmation_url = 'https://www.nochex.com/nochex.dll/apc/apc'
|
|
75
|
+
|
|
76
|
+
# Simply a convenience method that returns a new
|
|
77
|
+
# ActiveMerchant::Billing::Integrations::Nochex::Notification
|
|
78
|
+
def self.notification(post, options = {})
|
|
79
|
+
Notification.new(post)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def self.return(query_string, options = {})
|
|
83
|
+
Return.new(query_string)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module Nochex
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
# Required Parameters
|
|
7
|
+
# email
|
|
8
|
+
# amount
|
|
9
|
+
mapping :account, 'email'
|
|
10
|
+
mapping :amount, 'amount'
|
|
11
|
+
|
|
12
|
+
# Set the field status = test for testing with accounts:
|
|
13
|
+
# Account Password
|
|
14
|
+
# test1@nochex.com 123456
|
|
15
|
+
# test2@nochex.com 123456
|
|
16
|
+
# def initialize(order, account, options = {})
|
|
17
|
+
# super
|
|
18
|
+
# add_field('status', 'test')
|
|
19
|
+
# end
|
|
20
|
+
|
|
21
|
+
# Need to format the amount to have 2 decimal places
|
|
22
|
+
def amount=(money)
|
|
23
|
+
cents = money.respond_to?(:cents) ? money.cents : money
|
|
24
|
+
if money.is_a?(String) or cents.to_i <= 0
|
|
25
|
+
raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
|
|
26
|
+
end
|
|
27
|
+
add_field mappings[:amount], sprintf("%.2f", cents.to_f/100)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Optional Parameters
|
|
31
|
+
# ordernumber
|
|
32
|
+
mapping :order, 'ordernumber'
|
|
33
|
+
|
|
34
|
+
# firstname
|
|
35
|
+
# lastname
|
|
36
|
+
# email_address_sender
|
|
37
|
+
mapping :customer, :first_name => 'firstname',
|
|
38
|
+
:last_name => 'lastname',
|
|
39
|
+
:email => 'email_address_sender'
|
|
40
|
+
|
|
41
|
+
# town
|
|
42
|
+
# firstline
|
|
43
|
+
# county
|
|
44
|
+
# postcode
|
|
45
|
+
mapping :billing_address, :city => 'town',
|
|
46
|
+
:address1 => 'firstline',
|
|
47
|
+
:state => 'county',
|
|
48
|
+
:zip => 'postcode'
|
|
49
|
+
|
|
50
|
+
# responderurl
|
|
51
|
+
mapping :notify_url, 'responderurl'
|
|
52
|
+
|
|
53
|
+
# returnurl
|
|
54
|
+
mapping :return_url, 'returnurl'
|
|
55
|
+
|
|
56
|
+
# cancelurl
|
|
57
|
+
mapping :cancel_return_url, 'cancelurl'
|
|
58
|
+
|
|
59
|
+
# description
|
|
60
|
+
mapping :description, 'description'
|
|
61
|
+
|
|
62
|
+
# Currently unmapped
|
|
63
|
+
# logo
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
require 'net/http'
|
|
2
|
+
require 'date'
|
|
3
|
+
|
|
4
|
+
module ActiveMerchant #:nodoc:
|
|
5
|
+
module Billing #:nodoc:
|
|
6
|
+
module Integrations #:nodoc:
|
|
7
|
+
module Nochex
|
|
8
|
+
# Parser and handler for incoming Automatic Payment Confirmations from Nochex.
|
|
9
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
|
10
|
+
include ActiveMerchant::PostsData
|
|
11
|
+
|
|
12
|
+
def complete?
|
|
13
|
+
status == 'Completed'
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Id of the order we passed to Nochex
|
|
17
|
+
def item_id
|
|
18
|
+
params['order_id']
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def transaction_id
|
|
22
|
+
params['transaction_id']
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def currency
|
|
26
|
+
'GBP'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# When was this payment received by the client.
|
|
30
|
+
def received_at
|
|
31
|
+
# U.K. Format: 27/09/2006 22:30:54
|
|
32
|
+
return if params['transaction_date'].blank?
|
|
33
|
+
time = params['transaction_date'].scan(/\d+/)
|
|
34
|
+
Time.utc(time[2], time[1], time[0], time[3], time[4], time[5])
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def payer_email
|
|
38
|
+
params['from_email']
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def receiver_email
|
|
42
|
+
params['to_email']
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def security_key
|
|
46
|
+
params['security_key']
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# the money amount we received in X.2 decimal.
|
|
50
|
+
def gross
|
|
51
|
+
sprintf("%.2f", params['amount'].to_f)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Was this a test transaction?
|
|
55
|
+
def test?
|
|
56
|
+
params['status'] == 'test'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def status
|
|
60
|
+
'Completed'
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# Acknowledge the transaction to Nochex. This method has to be called after a new
|
|
64
|
+
# apc arrives. Nochex will verify that all the information we received are correct and will return a
|
|
65
|
+
# ok or a fail. This is very similar to the PayPal IPN scheme.
|
|
66
|
+
#
|
|
67
|
+
# Example:
|
|
68
|
+
#
|
|
69
|
+
# def nochex_ipn
|
|
70
|
+
# notify = NochexNotification.new(request.raw_post)
|
|
71
|
+
#
|
|
72
|
+
# if notify.acknowledge
|
|
73
|
+
# ... process order ... if notify.complete?
|
|
74
|
+
# else
|
|
75
|
+
# ... log possible hacking attempt ...
|
|
76
|
+
# end
|
|
77
|
+
def acknowledge
|
|
78
|
+
payload = raw
|
|
79
|
+
|
|
80
|
+
response = ssl_post(Nochex.notification_confirmation_url, payload,
|
|
81
|
+
'Content-Length' => "#{payload.size}",
|
|
82
|
+
'User-Agent' => "Active Merchant -- http://activemerchant.org",
|
|
83
|
+
'Content-Type' => "application/x-www-form-urlencoded"
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
raise StandardError.new("Faulty Nochex result: #{response}") unless ["AUTHORISED", "DECLINED"].include?(response)
|
|
87
|
+
|
|
88
|
+
response == "AUTHORISED"
|
|
89
|
+
end
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
end
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
class Notification
|
|
5
|
+
attr_accessor :params
|
|
6
|
+
attr_accessor :raw
|
|
7
|
+
|
|
8
|
+
# set this to an array in the subclass, to specify which IPs are allowed to send requests
|
|
9
|
+
class_attribute :production_ips
|
|
10
|
+
|
|
11
|
+
def initialize(post, options = {})
|
|
12
|
+
@options = options
|
|
13
|
+
empty!
|
|
14
|
+
parse(post)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def status
|
|
18
|
+
raise NotImplementedError, "Must implement this method in the subclass"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# the money amount we received in X.2 decimal.
|
|
22
|
+
def gross
|
|
23
|
+
raise NotImplementedError, "Must implement this method in the subclass"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def gross_cents
|
|
27
|
+
(gross.to_f * 100.0).round
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# This combines the gross and currency and returns a proper Money object.
|
|
31
|
+
# this requires the money library located at http://dist.leetsoft.com/api/money
|
|
32
|
+
def amount
|
|
33
|
+
return Money.new(gross_cents, currency) rescue ArgumentError
|
|
34
|
+
return Money.new(gross_cents) # maybe you have an own money object which doesn't take a currency?
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# reset the notification.
|
|
38
|
+
def empty!
|
|
39
|
+
@params = Hash.new
|
|
40
|
+
@raw = ""
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Check if the request comes from an official IP
|
|
44
|
+
def valid_sender?(ip)
|
|
45
|
+
return true if ActiveMerchant::Billing::Base.integration_mode == :test || production_ips.blank?
|
|
46
|
+
production_ips.include?(ip)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
private
|
|
50
|
+
|
|
51
|
+
# Take the posted data and move the relevant data into a hash
|
|
52
|
+
def parse(post)
|
|
53
|
+
@raw = post.to_s
|
|
54
|
+
for line in @raw.split('&')
|
|
55
|
+
key, value = *line.scan( %r{^([A-Za-z0-9_.]+)\=(.*)$} ).flatten
|
|
56
|
+
params[key] = CGI.unescape(value)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module PayflowLink
|
|
5
|
+
autoload :Helper, 'active_merchant/billing/integrations/payflow_link/helper.rb'
|
|
6
|
+
autoload :Notification, 'active_merchant/billing/integrations/payflow_link/notification.rb'
|
|
7
|
+
|
|
8
|
+
mattr_accessor :service_url
|
|
9
|
+
self.service_url = 'https://payflowlink.paypal.com'
|
|
10
|
+
|
|
11
|
+
def self.notification(post, options = {})
|
|
12
|
+
Notification.new(post)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.return(query_string, options = {})
|
|
16
|
+
ActiveMerchant::Billing::Integrations::Return.new(query_string)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
|
2
|
+
module Billing #:nodoc:
|
|
3
|
+
module Integrations #:nodoc:
|
|
4
|
+
module PayflowLink
|
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
|
6
|
+
include PostsData
|
|
7
|
+
|
|
8
|
+
def initialize(order, account, options = {})
|
|
9
|
+
super
|
|
10
|
+
add_field('login', account)
|
|
11
|
+
add_field('echodata', 'True')
|
|
12
|
+
add_field('user2', self.test?)
|
|
13
|
+
add_field('invoice', order)
|
|
14
|
+
add_field('vendor', account)
|
|
15
|
+
add_field('user', options[:credential4] || account)
|
|
16
|
+
add_field('trxtype', options[:transaction_type] || 'S')
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
mapping :account, 'login'
|
|
20
|
+
mapping :credential2, 'pwd'
|
|
21
|
+
mapping :credential3, 'partner'
|
|
22
|
+
mapping :order, 'user1'
|
|
23
|
+
mapping :description, 'description'
|
|
24
|
+
|
|
25
|
+
mapping :amount, 'amt'
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
mapping :billing_address, :city => 'city',
|
|
29
|
+
:address => 'address',
|
|
30
|
+
:state => 'state',
|
|
31
|
+
:zip => 'zip',
|
|
32
|
+
:country => 'country',
|
|
33
|
+
:phone => 'phone',
|
|
34
|
+
:name => 'name'
|
|
35
|
+
|
|
36
|
+
mapping :customer, :name => 'name'
|
|
37
|
+
|
|
38
|
+
def customer(params = {})
|
|
39
|
+
add_field(mappings[:customer][:name], [params.delete(:first_name), params.delete(:last_name)].compact.join(' '))
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def billing_address(params = {})
|
|
43
|
+
# Get the country code in the correct format
|
|
44
|
+
# Use what we were given if we can't find anything
|
|
45
|
+
country_code = lookup_country_code(params.delete(:country))
|
|
46
|
+
add_field(mappings[:billing_address][:country], country_code)
|
|
47
|
+
|
|
48
|
+
add_field(mappings[:billing_address][:address], [params.delete(:address1), params.delete(:address2)].compact.join(' '))
|
|
49
|
+
|
|
50
|
+
province_code = params.delete(:state)
|
|
51
|
+
add_field(mappings[:billing_address][:state], province_code.blank? ? 'N/A' : province_code.upcase)
|
|
52
|
+
|
|
53
|
+
# Everything else
|
|
54
|
+
params.each do |k, v|
|
|
55
|
+
field = mappings[:billing_address][k]
|
|
56
|
+
add_field(field, v) unless field.nil?
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def form_fields
|
|
61
|
+
token, token_id = request_secure_token
|
|
62
|
+
|
|
63
|
+
{"securetoken" => token, "securetokenid" => token_id, "mode" => test? ? "test" : "live"}
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def secure_token_id
|
|
69
|
+
@secure_token_id ||= Utils.generate_unique_id
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def secure_token_url
|
|
73
|
+
test? ? "https://pilot-payflowpro.paypal.com" : "https://payflowpro.paypal.com"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def request_secure_token
|
|
77
|
+
@fields["securetokenid"] = secure_token_id
|
|
78
|
+
@fields["createsecuretoken"] = "Y"
|
|
79
|
+
|
|
80
|
+
fields = @fields.collect {|key, value| "#{key}[#{value.length}]=#{value}" }.join("&")
|
|
81
|
+
|
|
82
|
+
response = ssl_post(secure_token_url, fields)
|
|
83
|
+
|
|
84
|
+
parse_response(response)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def parse_response(response)
|
|
88
|
+
response = response.split("&").inject({}) do |hash, param|
|
|
89
|
+
key, value = param.split("=")
|
|
90
|
+
hash[key] = value
|
|
91
|
+
hash
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
[response['SECURETOKEN'], response['SECURETOKENID']] if response['RESPMSG'] && response['RESPMSG'].downcase == "approved"
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
end
|