gonow-activemerchant 1.15.0
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 +690 -0
- data/CONTRIBUTORS +237 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +165 -0
- data/gem-public_cert.pem +20 -0
- data/lib/active_merchant.rb +47 -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 +178 -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 +170 -0
- data/lib/active_merchant/billing/gateways.rb +18 -0
- data/lib/active_merchant/billing/gateways/authorize_net.rb +664 -0
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
- data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
- data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -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 +132 -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 +293 -0
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
- data/lib/active_merchant/billing/gateways/braspag.rb +188 -0
- data/lib/active_merchant/billing/gateways/card_stream.rb +230 -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 +134 -0
- data/lib/active_merchant/billing/gateways/epay.rb +268 -0
- data/lib/active_merchant/billing/gateways/eway.rb +277 -0
- data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
- data/lib/active_merchant/billing/gateways/exact.rb +222 -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 +156 -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 +209 -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 +292 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +321 -0
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -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/paybox_direct.rb +207 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +253 -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 +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 +351 -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 +177 -0
- data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -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 +295 -0
- data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
- data/lib/active_merchant/billing/gateways/quickpay.rb +218 -0
- data/lib/active_merchant/billing/gateways/realex.rb +311 -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/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 +193 -0
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
- data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
- data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
- data/lib/active_merchant/billing/gateways/stripe.rb +212 -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 +194 -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 +68 -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/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 +96 -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/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 +111 -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 +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/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/common.rb +14 -0
- data/lib/active_merchant/common/connection.rb +177 -0
- data/lib/active_merchant/common/country.rb +328 -0
- data/lib/active_merchant/common/error.rb +26 -0
- data/lib/active_merchant/common/post_data.rb +24 -0
- data/lib/active_merchant/common/posts_data.rb +63 -0
- data/lib/active_merchant/common/requires_parameters.rb +16 -0
- data/lib/active_merchant/common/utils.rb +22 -0
- data/lib/active_merchant/common/validateable.rb +81 -0
- data/lib/active_merchant/version.rb +3 -0
- data/lib/activemerchant.rb +1 -0
- data/lib/certs/cacert.pem +7815 -0
- data/lib/support/gateway_support.rb +58 -0
- data/lib/support/outbound_hosts.rb +25 -0
- metadata +276 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
module Integrations #:nodoc:
|
4
|
+
module Moneybookers
|
5
|
+
|
6
|
+
autoload :Notification, File.dirname(__FILE__) + '/moneybookers/notification.rb'
|
7
|
+
autoload :Helper, File.dirname(__FILE__) + '/moneybookers/helper.rb'
|
8
|
+
|
9
|
+
mattr_accessor :production_url
|
10
|
+
self.production_url = 'https://www.moneybookers.com/app/payment.pl'
|
11
|
+
|
12
|
+
def self.service_url
|
13
|
+
self.production_url
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.notification(post, options)
|
17
|
+
Notification.new(post, options)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.return(post, options = {})
|
21
|
+
Return.new(post, options)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
module Integrations #:nodoc:
|
4
|
+
module Moneybookers
|
5
|
+
class Helper < ActiveMerchant::Billing::Integrations::Helper
|
6
|
+
mapping :account, 'pay_to_email'
|
7
|
+
mapping :order, 'transaction_id'
|
8
|
+
mapping :amount, 'amount'
|
9
|
+
mapping :currency, 'currency'
|
10
|
+
|
11
|
+
mapping :customer,
|
12
|
+
:first_name => 'firstname',
|
13
|
+
:last_name => 'lastname',
|
14
|
+
:email => 'pay_from_email',
|
15
|
+
:phone => 'phone_number'
|
16
|
+
|
17
|
+
mapping :billing_address,
|
18
|
+
:city => 'city',
|
19
|
+
:address1 => 'address',
|
20
|
+
:address2 => 'address2',
|
21
|
+
:state => 'state',
|
22
|
+
:zip => 'postal_code',
|
23
|
+
:country => 'country'
|
24
|
+
|
25
|
+
mapping :notify_url, 'status_url'
|
26
|
+
mapping :return_url, 'return_url'
|
27
|
+
mapping :cancel_return_url, 'cancel_url'
|
28
|
+
mapping :description, 'detail1_text'
|
29
|
+
|
30
|
+
def initialize(order, account, options = {})
|
31
|
+
super
|
32
|
+
add_tracking_token
|
33
|
+
add_default_parameters
|
34
|
+
add_seller_details(options)
|
35
|
+
end
|
36
|
+
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def add_tracking_token
|
41
|
+
return if application_id.blank? || application_id == 'ActiveMerchant'
|
42
|
+
|
43
|
+
add_field('merchant_fields', 'platform')
|
44
|
+
add_field('platform', application_id)
|
45
|
+
end
|
46
|
+
|
47
|
+
def add_default_parameters
|
48
|
+
add_field('hide_login', 1)
|
49
|
+
end
|
50
|
+
|
51
|
+
def add_seller_details(options)
|
52
|
+
add_field('recipient_description', options[:account_name]) if options[:account_name]
|
53
|
+
add_field('country', lookup_country_code(options[:country], :alpha3)) if options[:country]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'digest/md5'
|
3
|
+
|
4
|
+
module ActiveMerchant #:nodoc:
|
5
|
+
module Billing #:nodoc:
|
6
|
+
module Integrations #:nodoc:
|
7
|
+
module Moneybookers
|
8
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
9
|
+
|
10
|
+
def initialize(data, options)
|
11
|
+
if options[:credential2].nil?
|
12
|
+
raise ArgumentError, "You need to provide the md5 secret as the option :credential2 to verify that the notification originated from Moneybookers"
|
13
|
+
end
|
14
|
+
super
|
15
|
+
end
|
16
|
+
|
17
|
+
def complete?
|
18
|
+
status == 'Completed'
|
19
|
+
end
|
20
|
+
|
21
|
+
# ‘2’ Processed – This status is sent when the transaction is processed and the funds have been received on your Moneybookers account.
|
22
|
+
# ‘0’ Pending – This status is sent when the customers pays via the pending bank transfer option. Such transactions will auto-process IF the bank transfer is received by Moneybookers. We strongly recommend that you do NOT process the order/transaction in your system upon receipt of a pending status from Moneybookers.
|
23
|
+
# ‘-1’ Cancelled – Pending transactions can either be cancelled manually by the sender in their online account history or they will auto-cancel after 14 days if still pending.
|
24
|
+
# ‘-2’ Failed – This status is sent when the customer tries to pay via Credit Card or Direct Debit but our provider declines the transaction. If you do not accept Credit Card or Direct Debit payments via Moneybookers (see page 17) then you will never receive the failed status.
|
25
|
+
# ‘-3’ Chargeback – This status could be received only if your account is configured to receive chargebacks. If this is the case, whenever a chargeback is received by Moneybookers, a -3 status will be posted on the status_url for the reversed transaction.
|
26
|
+
def status
|
27
|
+
case status_code
|
28
|
+
when '2'
|
29
|
+
'Completed'
|
30
|
+
when '0'
|
31
|
+
'Pending'
|
32
|
+
when '-1'
|
33
|
+
'Cancelled'
|
34
|
+
when '-2'
|
35
|
+
'Failed'
|
36
|
+
when '-3'
|
37
|
+
'Reversed'
|
38
|
+
else
|
39
|
+
'Error'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def status_code
|
44
|
+
params['status']
|
45
|
+
end
|
46
|
+
|
47
|
+
def item_id
|
48
|
+
params['transaction_id']
|
49
|
+
end
|
50
|
+
|
51
|
+
def transaction_id
|
52
|
+
params['mb_transaction_id']
|
53
|
+
end
|
54
|
+
|
55
|
+
# When was this payment received by the client.
|
56
|
+
def received_at
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def payer_email
|
61
|
+
params['pay_from_email']
|
62
|
+
end
|
63
|
+
|
64
|
+
def receiver_email
|
65
|
+
params['pay_to_email']
|
66
|
+
end
|
67
|
+
|
68
|
+
def md5sig
|
69
|
+
params['md5sig']
|
70
|
+
end
|
71
|
+
|
72
|
+
#Unique ID from the merchant's Moneybookers.com account, needed for calculatinon of md5 sig
|
73
|
+
def merchant_id
|
74
|
+
params['merchant_id']
|
75
|
+
end
|
76
|
+
|
77
|
+
# currency of the payment as posted by the merchant on the entry form
|
78
|
+
def currency
|
79
|
+
params['currency']
|
80
|
+
end
|
81
|
+
|
82
|
+
# amount of the payment as posted by the merchant on the entry form (ex. 39.60/39.6/39)
|
83
|
+
def gross
|
84
|
+
params['amount']
|
85
|
+
end
|
86
|
+
|
87
|
+
# currency of mb_amount, will always be the same as the currency of the beneficiary's account at Moneybookers.com
|
88
|
+
def merchant_currency
|
89
|
+
params['mb_currency']
|
90
|
+
end
|
91
|
+
|
92
|
+
# total amount of the payment in Merchants currency (ex 25.46/25.4/25)
|
93
|
+
def merchant_amount
|
94
|
+
params['mb_amount']
|
95
|
+
end
|
96
|
+
|
97
|
+
# Was this a test transaction?
|
98
|
+
def test?
|
99
|
+
false
|
100
|
+
end
|
101
|
+
|
102
|
+
def secret
|
103
|
+
@options[:credential2]
|
104
|
+
end
|
105
|
+
|
106
|
+
# Acknowledge the transaction to MoneyBooker. This method has to be called after a new
|
107
|
+
# apc arrives. It will verify that all the information we received is correct and will return a
|
108
|
+
# ok or a fail. The secret (second credential) has to be provided in the parameter :credential2
|
109
|
+
# when instantiating the Notification object.
|
110
|
+
#
|
111
|
+
# Example:
|
112
|
+
#
|
113
|
+
# def ipn
|
114
|
+
# notify = Moneybookers.notification(request.raw_post, :credential2 => 'secret')
|
115
|
+
#
|
116
|
+
# if notify.acknowledge
|
117
|
+
# ... process order ... if notify.complete?
|
118
|
+
# else
|
119
|
+
# ... log possible hacking attempt ...
|
120
|
+
# end
|
121
|
+
def acknowledge
|
122
|
+
fields = [merchant_id, item_id, Digest::MD5.hexdigest(secret).upcase, merchant_amount, merchant_currency, status_code].join
|
123
|
+
md5sig == Digest::MD5.hexdigest(fields).upcase
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -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://www.nochex.com/nochex.dll/checkout'
|
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
|