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.
Files changed (189) hide show
  1. data/CHANGELOG +690 -0
  2. data/CONTRIBUTORS +237 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +165 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant.rb +47 -0
  7. data/lib/active_merchant/billing.rb +9 -0
  8. data/lib/active_merchant/billing/avs_result.rb +98 -0
  9. data/lib/active_merchant/billing/base.rb +57 -0
  10. data/lib/active_merchant/billing/check.rb +68 -0
  11. data/lib/active_merchant/billing/credit_card.rb +178 -0
  12. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  13. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  14. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  15. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  16. data/lib/active_merchant/billing/gateway.rb +170 -0
  17. data/lib/active_merchant/billing/gateways.rb +18 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net.rb +664 -0
  19. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
  20. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
  21. data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
  22. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -0
  23. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  24. data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
  25. data/lib/active_merchant/billing/gateways/bogus.rb +132 -0
  26. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  27. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  28. data/lib/active_merchant/billing/gateways/braintree_blue.rb +293 -0
  29. data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
  30. data/lib/active_merchant/billing/gateways/braspag.rb +188 -0
  31. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  32. data/lib/active_merchant/billing/gateways/cyber_source.rb +430 -0
  33. data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
  34. data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
  35. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  36. data/lib/active_merchant/billing/gateways/epay.rb +268 -0
  37. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  38. data/lib/active_merchant/billing/gateways/eway_managed.rb +231 -0
  39. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  40. data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
  41. data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
  42. data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
  43. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
  44. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  45. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  46. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
  47. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  48. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  49. data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
  50. data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
  51. data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
  52. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +156 -0
  53. data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
  54. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  55. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  56. data/lib/active_merchant/billing/gateways/moneris.rb +209 -0
  57. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  58. data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
  59. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  60. data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
  61. data/lib/active_merchant/billing/gateways/ogone.rb +292 -0
  62. data/lib/active_merchant/billing/gateways/orbital.rb +321 -0
  63. data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +46 -0
  64. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  65. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  66. data/lib/active_merchant/billing/gateways/paybox_direct.rb +207 -0
  67. data/lib/active_merchant/billing/gateways/payflow.rb +253 -0
  68. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  69. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  70. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  71. data/lib/active_merchant/billing/gateways/payflow_express.rb +222 -0
  72. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  73. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  74. data/lib/active_merchant/billing/gateways/payment_express.rb +235 -0
  75. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  76. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +351 -0
  77. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +49 -0
  78. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  79. data/lib/active_merchant/billing/gateways/paypal_express.rb +177 -0
  80. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
  81. data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
  82. data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
  83. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  84. data/lib/active_merchant/billing/gateways/qbms.rb +295 -0
  85. data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
  86. data/lib/active_merchant/billing/gateways/quickpay.rb +218 -0
  87. data/lib/active_merchant/billing/gateways/realex.rb +311 -0
  88. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  89. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  90. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  91. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  92. data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
  93. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  94. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  95. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  96. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +193 -0
  97. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  98. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  99. data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
  100. data/lib/active_merchant/billing/gateways/stripe.rb +212 -0
  101. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  102. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  103. data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
  104. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  105. data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
  106. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  107. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  108. data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
  109. data/lib/active_merchant/billing/integrations.rb +17 -0
  110. data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
  111. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  112. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  113. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  114. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  115. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  116. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  117. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  118. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  119. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  120. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  121. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  122. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  123. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  124. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  125. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  126. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  127. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  128. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
  129. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
  130. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
  131. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  132. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  133. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  134. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  135. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  136. data/lib/active_merchant/billing/integrations/helper.rb +96 -0
  137. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  138. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  139. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  140. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  141. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  142. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
  143. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  144. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  145. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  146. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  147. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  148. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  149. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  150. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  151. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  152. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  153. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  154. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  155. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  156. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  157. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  158. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  159. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +111 -0
  160. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  161. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  162. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  163. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  164. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  165. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  166. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  167. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  168. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  169. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
  170. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  171. data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
  172. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
  173. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  174. data/lib/active_merchant/billing/response.rb +32 -0
  175. data/lib/active_merchant/common.rb +14 -0
  176. data/lib/active_merchant/common/connection.rb +177 -0
  177. data/lib/active_merchant/common/country.rb +328 -0
  178. data/lib/active_merchant/common/error.rb +26 -0
  179. data/lib/active_merchant/common/post_data.rb +24 -0
  180. data/lib/active_merchant/common/posts_data.rb +63 -0
  181. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  182. data/lib/active_merchant/common/utils.rb +22 -0
  183. data/lib/active_merchant/common/validateable.rb +81 -0
  184. data/lib/active_merchant/version.rb +3 -0
  185. data/lib/activemerchant.rb +1 -0
  186. data/lib/certs/cacert.pem +7815 -0
  187. data/lib/support/gateway_support.rb +58 -0
  188. data/lib/support/outbound_hosts.rb +25 -0
  189. metadata +276 -0
@@ -0,0 +1,10 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Chronopay
5
+ class Return < ActiveMerchant::Billing::Integrations::Return
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,41 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module DirecPay
5
+ autoload :Helper, File.dirname(__FILE__) + '/direc_pay/helper.rb'
6
+ autoload :Return, File.dirname(__FILE__) + '/direc_pay/return.rb'
7
+ autoload :Notification, File.dirname(__FILE__) + '/direc_pay/notification.rb'
8
+ autoload :Status, File.dirname(__FILE__) + '/direc_pay/status.rb'
9
+
10
+ mattr_accessor :production_url, :test_url
11
+
12
+ self.production_url = "https://www.timesofmoney.com/direcpay/secure/dpMerchantTransaction.jsp"
13
+ self.test_url = "https://test.timesofmoney.com/direcpay/secure/dpMerchantTransaction.jsp"
14
+
15
+ def self.service_url
16
+ mode = ActiveMerchant::Billing::Base.integration_mode
17
+ case mode
18
+ when :production
19
+ self.production_url
20
+ when :test
21
+ self.test_url
22
+ else
23
+ raise StandardError, "Integration mode set to an invalid value: #{mode}"
24
+ end
25
+ end
26
+
27
+ def self.notification(post, options = {})
28
+ Notification.new(post)
29
+ end
30
+
31
+ def self.return(query_string, options = {})
32
+ Return.new(query_string, options)
33
+ end
34
+
35
+ def self.request_status_update(mid, transaction_id, notification_url)
36
+ Status.new(mid).update(transaction_id, notification_url)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,200 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module DirecPay
5
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
6
+ mapping :account, 'MID'
7
+ mapping :order, 'Merchant Order No'
8
+ mapping :amount, 'Amount'
9
+ mapping :currency, 'Currency'
10
+ mapping :country, 'Country'
11
+
12
+ mapping :billing_address, :city => 'custCity',
13
+ :address1 => 'custAddress',
14
+ :state => 'custState',
15
+ :zip => 'custPinCode',
16
+ :country => 'custCountry',
17
+ :phone => 'custMobileNo'
18
+
19
+ mapping :shipping_address, :name => 'deliveryName',
20
+ :city => 'deliveryCity',
21
+ :address1 => 'deliveryAddress',
22
+ :state => 'deliveryState',
23
+ :zip => 'deliveryPinCode',
24
+ :country => 'deliveryCountry',
25
+ :phone => 'deliveryMobileNo'
26
+
27
+ mapping :customer, :name => 'custName',
28
+ :email => 'custEmailId'
29
+
30
+ mapping :description, 'otherNotes'
31
+ mapping :edit_allowed, 'editAllowed'
32
+
33
+ mapping :return_url, 'Success URL'
34
+ mapping :failure_url, 'Failure URL'
35
+
36
+ mapping :operating_mode, 'Operating Mode'
37
+ mapping :other_details, 'Other Details'
38
+ mapping :collaborator, 'Collaborator'
39
+
40
+ OPERATING_MODE = 'DOM'
41
+ COUNTRY = 'IND'
42
+ CURRENCY = 'INR'
43
+ OTHER_DETAILS = 'NULL'
44
+ EDIT_ALLOWED = 'Y'
45
+
46
+ PHONE_CODES = {
47
+ 'IN' => '91',
48
+ 'US' => '01',
49
+ 'CA' => '01'
50
+ }
51
+
52
+ ENCODED_PARAMS = [ :account, :operating_mode, :country, :currency, :amount, :order, :other_details, :return_url, :failure_url, :collaborator ]
53
+
54
+
55
+ def initialize(order, account, options = {})
56
+ super
57
+ collaborator = ActiveMerchant::Billing::Base.integration_mode == :test || options[:test] ? 'TOML' : 'DirecPay'
58
+ add_field(mappings[:collaborator], collaborator)
59
+ add_field(mappings[:country], 'IND')
60
+ add_field(mappings[:operating_mode], OPERATING_MODE)
61
+ add_field(mappings[:other_details], OTHER_DETAILS)
62
+ add_field(mappings[:edit_allowed], EDIT_ALLOWED)
63
+ end
64
+
65
+
66
+ def customer(params = {})
67
+ add_field(mappings[:customer][:name], full_name(params))
68
+ add_field(mappings[:customer][:email], params[:email])
69
+ end
70
+
71
+ # Need to format the amount to have 2 decimal places
72
+ def amount=(money)
73
+ cents = money.respond_to?(:cents) ? money.cents : money
74
+ if money.is_a?(String) or cents.to_i <= 0
75
+ raise ArgumentError, 'money amount must be either a Money object or a positive integer in cents.'
76
+ end
77
+ add_field(mappings[:amount], sprintf("%.2f", cents.to_f/100))
78
+ end
79
+
80
+ def shipping_address(params = {})
81
+ super(update_address(:shipping_address, params))
82
+ end
83
+
84
+ def billing_address(params = {})
85
+ super(update_address(:billing_address, params))
86
+ end
87
+
88
+ def form_fields
89
+ add_failure_url
90
+ add_request_parameters
91
+
92
+ unencoded_parameters
93
+ end
94
+
95
+
96
+ private
97
+
98
+ def add_request_parameters
99
+ params = ENCODED_PARAMS.map{ |param| fields[mappings[param]] }
100
+ encoded = encode_value(params.join('|'))
101
+
102
+ add_field('requestparameter', encoded)
103
+ end
104
+
105
+ def unencoded_parameters
106
+ params = fields.dup
107
+ # remove all encoded params from exported fields
108
+ ENCODED_PARAMS.each{ |param| params.delete(mappings[param]) }
109
+ # remove all special characters from each field value
110
+ params = params.collect{|name, value| [name, remove_special_characters(value)] }
111
+ Hash[params]
112
+ end
113
+
114
+ def add_failure_url
115
+ if fields[mappings[:failure_url]].nil?
116
+ add_field(mappings[:failure_url], fields[mappings[:return_url]])
117
+ end
118
+ end
119
+
120
+ def update_address(address_type, params)
121
+ params = params.dup
122
+ address = params[:address1]
123
+ address = "#{address} #{params[:address2]}" if params[:address2].present?
124
+ address = "#{params[:company]} #{address}" if params[:company].present?
125
+ params[:address1] = address
126
+
127
+ params[:phone] = normalize_phone_number(params[:phone])
128
+ add_land_line_phone_for(address_type, params)
129
+
130
+ if address_type == :shipping_address
131
+ shipping_name = full_name(params) || fields[mappings[:customer][:name]]
132
+ add_field(mappings[:shipping_address][:name], shipping_name)
133
+ end
134
+ params
135
+ end
136
+
137
+ # Split a single phone number into the country code, area code and local number as best as possible
138
+ def add_land_line_phone_for(address_type, params)
139
+ address_field = address_type == :billing_address ? 'custPhoneNo' : 'deliveryPhNo'
140
+
141
+ if params.has_key?(:phone2)
142
+ phone = normalize_phone_number(params[:phone2])
143
+ phone_country_code, phone_area_code, phone_number = nil
144
+
145
+ if params[:country] == 'IN' && phone =~ /(91)? *(\d{3}) *(\d{4,})$/
146
+ phone_country_code, phone_area_code, phone_number = $1, $2, $3
147
+ else
148
+ numbers = phone.split(' ')
149
+ case numbers.size
150
+ when 3
151
+ phone_country_code, phone_area_code, phone_number = numbers
152
+ when 2
153
+ phone_area_code, phone_number = numbers
154
+ else
155
+ phone =~ /(\d{3})(\d+)$/
156
+ phone_area_code, phone_number = $1, $2
157
+ end
158
+ end
159
+
160
+ add_field("#{address_field}1", phone_country_code || phone_code_for_country(params[:country]) || '91')
161
+ add_field("#{address_field}2", phone_area_code)
162
+ add_field("#{address_field}3", phone_number)
163
+ end
164
+ end
165
+
166
+ def normalize_phone_number(phone)
167
+ phone.gsub(/[^\d ]+/, '') if phone
168
+ end
169
+
170
+ # Special characters are NOT allowed while posting transaction parameters on DirecPay system
171
+ def remove_special_characters(string)
172
+ string.gsub(/[~"'&#%]/, '-')
173
+ end
174
+
175
+ def encode_value(value)
176
+ encoded = ActiveSupport::Base64.encode64s(value)
177
+ string_to_encode = encoded[0, 1] + "T" + encoded[1, encoded.length]
178
+ ActiveSupport::Base64.encode64s(string_to_encode)
179
+ end
180
+
181
+ def decode_value(value)
182
+ decoded = ActiveSupport::Base64.decode64(value)
183
+ string_to_decode = decoded[0, 1] + decoded[2, decoded.length]
184
+ ActiveSupport::Base64.decode64(string_to_decode)
185
+ end
186
+
187
+ def phone_code_for_country(country)
188
+ PHONE_CODES[country]
189
+ end
190
+
191
+ def full_name(params)
192
+ return if params[:name].blank? && params[:first_name].blank? && params[:last_name].blank?
193
+
194
+ params[:name] || "#{params[:first_name]} #{params[:last_name]}"
195
+ end
196
+ end
197
+ end
198
+ end
199
+ end
200
+ end
@@ -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