fishman-activemerchant 1.18.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 (188) hide show
  1. data/CHANGELOG +733 -0
  2. data/CONTRIBUTORS +257 -0
  3. data/MIT-LICENSE +20 -0
  4. data/gem-public_cert.pem +20 -0
  5. data/lib/active_merchant.rb +47 -0
  6. data/lib/active_merchant/billing.rb +9 -0
  7. data/lib/active_merchant/billing/avs_result.rb +98 -0
  8. data/lib/active_merchant/billing/base.rb +57 -0
  9. data/lib/active_merchant/billing/check.rb +68 -0
  10. data/lib/active_merchant/billing/credit_card.rb +260 -0
  11. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  12. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  13. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  14. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  15. data/lib/active_merchant/billing/gateway.rb +170 -0
  16. data/lib/active_merchant/billing/gateways.rb +18 -0
  17. data/lib/active_merchant/billing/gateways/authorize_net.rb +693 -0
  18. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +858 -0
  19. data/lib/active_merchant/billing/gateways/barclays_epdq.rb +308 -0
  20. data/lib/active_merchant/billing/gateways/beanstream.rb +139 -0
  21. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +282 -0
  22. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  23. data/lib/active_merchant/billing/gateways/blue_pay.rb +11 -0
  24. data/lib/active_merchant/billing/gateways/bogus.rb +142 -0
  25. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  26. data/lib/active_merchant/billing/gateways/braintree/braintree_common.rb +9 -0
  27. data/lib/active_merchant/billing/gateways/braintree_blue.rb +303 -0
  28. data/lib/active_merchant/billing/gateways/braintree_orange.rb +17 -0
  29. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  30. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  31. data/lib/active_merchant/billing/gateways/cyber_source.rb +430 -0
  32. data/lib/active_merchant/billing/gateways/data_cash.rb +597 -0
  33. data/lib/active_merchant/billing/gateways/efsnet.rb +235 -0
  34. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  35. data/lib/active_merchant/billing/gateways/epay.rb +274 -0
  36. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  37. data/lib/active_merchant/billing/gateways/eway_managed.rb +264 -0
  38. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  39. data/lib/active_merchant/billing/gateways/federated_canada.rb +168 -0
  40. data/lib/active_merchant/billing/gateways/first_pay.rb +177 -0
  41. data/lib/active_merchant/billing/gateways/garanti.rb +262 -0
  42. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +250 -0
  43. data/lib/active_merchant/billing/gateways/ideal/ideal_rabobank.pem +13 -0
  44. data/lib/active_merchant/billing/gateways/ideal/ideal_response.rb +29 -0
  45. data/lib/active_merchant/billing/gateways/ideal_rabobank.rb +55 -0
  46. data/lib/active_merchant/billing/gateways/inspire.rb +221 -0
  47. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  48. data/lib/active_merchant/billing/gateways/iridium.rb +258 -0
  49. data/lib/active_merchant/billing/gateways/jetpay.rb +276 -0
  50. data/lib/active_merchant/billing/gateways/linkpoint.rb +454 -0
  51. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +156 -0
  52. data/lib/active_merchant/billing/gateways/merchant_ware.rb +289 -0
  53. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  54. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  55. data/lib/active_merchant/billing/gateways/moneris.rb +209 -0
  56. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  57. data/lib/active_merchant/billing/gateways/netaxept.rb +239 -0
  58. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  59. data/lib/active_merchant/billing/gateways/nmi.rb +13 -0
  60. data/lib/active_merchant/billing/gateways/ogone.rb +292 -0
  61. data/lib/active_merchant/billing/gateways/optimal_payment.rb +274 -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 +354 -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 +184 -0
  80. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +25 -0
  81. data/lib/active_merchant/billing/gateways/paypal_express_de.rb +14 -0
  82. data/lib/active_merchant/billing/gateways/paystation.rb +201 -0
  83. data/lib/active_merchant/billing/gateways/plugnpay.rb +298 -0
  84. data/lib/active_merchant/billing/gateways/psigate.rb +219 -0
  85. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  86. data/lib/active_merchant/billing/gateways/qbms.rb +297 -0
  87. data/lib/active_merchant/billing/gateways/quantum.rb +282 -0
  88. data/lib/active_merchant/billing/gateways/quickpay.rb +297 -0
  89. data/lib/active_merchant/billing/gateways/realex.rb +311 -0
  90. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  91. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  92. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  93. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  94. data/lib/active_merchant/billing/gateways/sage_pay.rb +320 -0
  95. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  96. data/lib/active_merchant/billing/gateways/secure_net.rb +330 -0
  97. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  98. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +193 -0
  99. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  100. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  101. data/lib/active_merchant/billing/gateways/smart_ps.rb +271 -0
  102. data/lib/active_merchant/billing/gateways/stripe.rb +212 -0
  103. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  104. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  105. data/lib/active_merchant/billing/gateways/trust_commerce.rb +423 -0
  106. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  107. data/lib/active_merchant/billing/gateways/verifi.rb +233 -0
  108. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  109. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  110. data/lib/active_merchant/billing/gateways/worldpay.rb +280 -0
  111. data/lib/active_merchant/billing/integrations.rb +17 -0
  112. data/lib/active_merchant/billing/integrations/action_view_helper.rb +68 -0
  113. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  114. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  115. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  116. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  117. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  118. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  119. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  120. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  121. data/lib/active_merchant/billing/integrations/direc_pay.rb +41 -0
  122. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +200 -0
  123. data/lib/active_merchant/billing/integrations/direc_pay/notification.rb +76 -0
  124. data/lib/active_merchant/billing/integrations/direc_pay/return.rb +32 -0
  125. data/lib/active_merchant/billing/integrations/direc_pay/status.rb +37 -0
  126. data/lib/active_merchant/billing/integrations/directebanking.rb +47 -0
  127. data/lib/active_merchant/billing/integrations/directebanking/helper.rb +90 -0
  128. data/lib/active_merchant/billing/integrations/directebanking/notification.rb +120 -0
  129. data/lib/active_merchant/billing/integrations/directebanking/return.rb +11 -0
  130. data/lib/active_merchant/billing/integrations/dwolla.rb +30 -0
  131. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +28 -0
  132. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +50 -0
  133. data/lib/active_merchant/billing/integrations/dwolla/return.rb +38 -0
  134. data/lib/active_merchant/billing/integrations/e_payment_plans.rb +48 -0
  135. data/lib/active_merchant/billing/integrations/e_payment_plans/helper.rb +34 -0
  136. data/lib/active_merchant/billing/integrations/e_payment_plans/notification.rb +84 -0
  137. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  138. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  139. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  140. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  141. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  142. data/lib/active_merchant/billing/integrations/helper.rb +96 -0
  143. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  144. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  145. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  146. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  147. data/lib/active_merchant/billing/integrations/moneybookers.rb +26 -0
  148. data/lib/active_merchant/billing/integrations/moneybookers/helper.rb +59 -0
  149. data/lib/active_merchant/billing/integrations/moneybookers/notification.rb +129 -0
  150. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  151. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  152. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  153. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  154. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  155. data/lib/active_merchant/billing/integrations/payflow_link.rb +21 -0
  156. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +58 -0
  157. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +78 -0
  158. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  159. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  160. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  161. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  162. data/lib/active_merchant/billing/integrations/quickpay.rb +21 -0
  163. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  164. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  165. data/lib/active_merchant/billing/integrations/return.rb +42 -0
  166. data/lib/active_merchant/billing/integrations/sage_pay_form.rb +37 -0
  167. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +33 -0
  168. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +111 -0
  169. data/lib/active_merchant/billing/integrations/sage_pay_form/notification.rb +210 -0
  170. data/lib/active_merchant/billing/integrations/sage_pay_form/return.rb +31 -0
  171. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  172. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  173. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  174. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  175. data/lib/active_merchant/billing/integrations/valitor.rb +33 -0
  176. data/lib/active_merchant/billing/integrations/valitor/helper.rb +86 -0
  177. data/lib/active_merchant/billing/integrations/valitor/notification.rb +13 -0
  178. data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +97 -0
  179. data/lib/active_merchant/billing/integrations/valitor/return.rb +13 -0
  180. data/lib/active_merchant/billing/integrations/world_pay.rb +27 -0
  181. data/lib/active_merchant/billing/integrations/world_pay/helper.rb +100 -0
  182. data/lib/active_merchant/billing/integrations/world_pay/notification.rb +160 -0
  183. data/lib/active_merchant/billing/response.rb +32 -0
  184. data/lib/active_merchant/version.rb +3 -0
  185. data/lib/activemerchant.rb +1 -0
  186. data/lib/support/gateway_support.rb +58 -0
  187. data/lib/support/outbound_hosts.rb +25 -0
  188. metadata +335 -0
@@ -0,0 +1,154 @@
1
+ require 'net/http'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Paypal
7
+ # Parser and handler for incoming Instant payment notifications from paypal.
8
+ # The Example shows a typical handler in a rails application. Note that this
9
+ # is an example, please read the Paypal API documentation for all the details
10
+ # on creating a safe payment controller.
11
+ #
12
+ # Example
13
+ #
14
+ # class BackendController < ApplicationController
15
+ # include ActiveMerchant::Billing::Integrations
16
+ #
17
+ # def paypal_ipn
18
+ # notify = Paypal::Notification.new(request.raw_post)
19
+ #
20
+ # order = Order.find(notify.item_id)
21
+ #
22
+ # if notify.acknowledge
23
+ # begin
24
+ #
25
+ # if notify.complete? and order.total == notify.amount
26
+ # order.status = 'success'
27
+ #
28
+ # shop.ship(order)
29
+ # else
30
+ # logger.error("Failed to verify Paypal's notification, please investigate")
31
+ # end
32
+ #
33
+ # rescue => e
34
+ # order.status = 'failed'
35
+ # raise
36
+ # ensure
37
+ # order.save
38
+ # end
39
+ # end
40
+ #
41
+ # render :nothing
42
+ # end
43
+ # end
44
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
45
+ include PostsData
46
+
47
+ # Was the transaction complete?
48
+ def complete?
49
+ status == "Completed"
50
+ end
51
+
52
+ # When was this payment received by the client.
53
+ # sometimes it can happen that we get the notification much later.
54
+ # One possible scenario is that our web application was down. In this case paypal tries several
55
+ # times an hour to inform us about the notification
56
+ def received_at
57
+ Time.parse params['payment_date']
58
+ end
59
+
60
+ # Status of transaction. List of possible values:
61
+ # <tt>Canceled-Reversal</tt>::
62
+ # <tt>Completed</tt>::
63
+ # <tt>Denied</tt>::
64
+ # <tt>Expired</tt>::
65
+ # <tt>Failed</tt>::
66
+ # <tt>In-Progress</tt>::
67
+ # <tt>Partially-Refunded</tt>::
68
+ # <tt>Pending</tt>::
69
+ # <tt>Processed</tt>::
70
+ # <tt>Refunded</tt>::
71
+ # <tt>Reversed</tt>::
72
+ # <tt>Voided</tt>::
73
+ def status
74
+ params['payment_status']
75
+ end
76
+
77
+ # Id of this transaction (paypal number)
78
+ def transaction_id
79
+ params['txn_id']
80
+ end
81
+
82
+ # What type of transaction are we dealing with?
83
+ # "cart" "send_money" "web_accept" are possible here.
84
+ def type
85
+ params['txn_type']
86
+ end
87
+
88
+ # the money amount we received in X.2 decimal.
89
+ def gross
90
+ params['mc_gross']
91
+ end
92
+
93
+ # the markup paypal charges for the transaction
94
+ def fee
95
+ params['mc_fee']
96
+ end
97
+
98
+ # What currency have we been dealing with
99
+ def currency
100
+ params['mc_currency']
101
+ end
102
+
103
+ # This is the item number which we submitted to paypal
104
+ # The custom field is also mapped to item_id because PayPal
105
+ # doesn't return item_number in dispute notifications
106
+ def item_id
107
+ params['item_number'] || params['custom']
108
+ end
109
+
110
+ # This is the invoice which you passed to paypal
111
+ def invoice
112
+ params['invoice']
113
+ end
114
+
115
+ # Was this a test transaction?
116
+ def test?
117
+ params['test_ipn'] == '1'
118
+ end
119
+
120
+ def account
121
+ params['business'] || params['receiver_email']
122
+ end
123
+
124
+ # Acknowledge the transaction to paypal. This method has to be called after a new
125
+ # ipn arrives. Paypal will verify that all the information we received are correct and will return a
126
+ # ok or a fail.
127
+ #
128
+ # Example:
129
+ #
130
+ # def paypal_ipn
131
+ # notify = PaypalNotification.new(request.raw_post)
132
+ #
133
+ # if notify.acknowledge
134
+ # ... process order ... if notify.complete?
135
+ # else
136
+ # ... log possible hacking attempt ...
137
+ # end
138
+ def acknowledge
139
+ payload = raw
140
+
141
+ response = ssl_post(Paypal.service_url + '?cmd=_notify-validate', payload,
142
+ 'Content-Length' => "#{payload.size}",
143
+ 'User-Agent' => "Active Merchant -- http://activemerchant.org"
144
+ )
145
+
146
+ raise StandardError.new("Faulty paypal result: #{response}") unless ["VERIFIED", "INVALID"].include?(response)
147
+
148
+ response == "VERIFIED"
149
+ end
150
+ end
151
+ end
152
+ end
153
+ end
154
+ end
@@ -0,0 +1,10 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Paypal
5
+ class Return < ActiveMerchant::Billing::Integrations::Return
6
+ end
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Quickpay
5
+ autoload :Helper, File.dirname(__FILE__) + '/quickpay/helper.rb'
6
+ autoload :Notification, File.dirname(__FILE__) + '/quickpay/notification.rb'
7
+
8
+ mattr_accessor :service_url
9
+ self.service_url = 'https://secure.quickpay.dk/form/'
10
+
11
+ def self.notification(post, options = {})
12
+ Notification.new(post)
13
+ end
14
+
15
+ def self.return(post, options = {})
16
+ Return.new(post, options)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,72 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Quickpay
5
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
6
+
7
+ def initialize(order, account, options = {})
8
+ super
9
+ add_field('protocol', '3')
10
+ add_field('msgtype', 'authorize')
11
+ add_field('language', 'da')
12
+ add_field('autocapture', 0)
13
+ add_field('testmode', 0)
14
+ add_field('ordernumber', format_order_number(order))
15
+ end
16
+
17
+ def md5secret(value)
18
+ @md5secret = value
19
+ end
20
+
21
+ def form_fields
22
+ @fields.merge('md5check' => generate_md5check)
23
+ end
24
+
25
+ def generate_md5string
26
+ MD5_CHECK_FIELDS.map {|key| @fields[key.to_s]} * "" + @md5secret
27
+ end
28
+
29
+ def generate_md5check
30
+ Digest::MD5.hexdigest(generate_md5string)
31
+ end
32
+
33
+ # Limited to 20 digits max
34
+ def format_order_number(number)
35
+ number.to_s.gsub(/[^\w_]/, '').rjust(4, "0")[0...20]
36
+ end
37
+
38
+ MD5_CHECK_FIELDS = [
39
+ :protocol, :msgtype, :merchant, :language, :ordernumber,
40
+ :amount, :currency, :continueurl, :cancelurl, :callbackurl,
41
+ :autocapture, :cardtypelock, :description, :ipaddress, :testmode
42
+ ]
43
+
44
+ mapping :protocol, 'protocol'
45
+ mapping :msgtype, 'msgtype'
46
+ mapping :account, 'merchant'
47
+ mapping :language, 'language'
48
+ mapping :amount, 'amount'
49
+ mapping :currency, 'currency'
50
+
51
+ mapping :return_url, 'continueurl'
52
+ mapping :cancel_return_url, 'cancelurl'
53
+ mapping :notify_url, 'callbackurl'
54
+
55
+ mapping :autocapture, 'autocapture'
56
+ mapping :cardtypelock, 'cardtypelock'
57
+
58
+ mapping :description, 'description'
59
+ mapping :ipaddress, 'ipaddress'
60
+ mapping :testmode, 'testmode'
61
+
62
+ mapping :credential2, 'md5secret'
63
+
64
+ mapping :customer, ''
65
+ mapping :billing_address, {}
66
+ mapping :tax, ''
67
+ mapping :shipping, ''
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,74 @@
1
+ require 'net/http'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Quickpay
7
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
8
+ def complete?
9
+ status == '000'
10
+ end
11
+
12
+ def item_id
13
+ params['ordernumber']
14
+ end
15
+
16
+ def transaction_id
17
+ params['transaction']
18
+ end
19
+
20
+ def received_at
21
+ Time.parse("20#{params['time']}")
22
+ end
23
+
24
+ def gross
25
+ "%.2f" % (gross_cents / 100.0)
26
+ end
27
+
28
+ def gross_cents
29
+ params['amount'].to_i
30
+ end
31
+
32
+ def test?
33
+ params['testmode'] == 'Yes'
34
+ end
35
+
36
+ def status
37
+ params['qpstat']
38
+ end
39
+
40
+ def currency
41
+ params['currency']
42
+ end
43
+
44
+ # Provide access to raw fields from quickpay
45
+ %w(msgtype ordernumber state chstat chstatmsg qpstat qpstatmsg merchant merchantemail cardtype cardnumber).each do |attr|
46
+ define_method(attr) do
47
+ params[attr]
48
+ end
49
+ end
50
+
51
+ MD5_CHECK_FIELDS = [
52
+ :msgtype, :ordernumber, :amount, :currency, :time, :state,
53
+ :chstat, :chstatmsg, :qpstat, :qpstatmsg, :merchant, :merchantemail,
54
+ :transaction, :cardtype, :cardnumber, :testmode
55
+ ]
56
+
57
+ def generate_md5string
58
+ MD5_CHECK_FIELDS.map { |key| params[key.to_s] } * "" + @options[:credential2]
59
+ end
60
+
61
+ def generate_md5check
62
+ Digest::MD5.hexdigest(generate_md5string)
63
+ end
64
+
65
+ # Quickpay doesn't do acknowledgements of callback notifications
66
+ # Instead it uses and MD5 hash of all parameters
67
+ def acknowledge
68
+ generate_md5check == params['md5check']
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,42 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ class Return
5
+ attr_accessor :params
6
+ attr_reader :notification
7
+
8
+ def initialize(query_string, options = {})
9
+ @params = parse(query_string)
10
+ @options = options
11
+ end
12
+
13
+ # Successful by default. Overridden in the child class
14
+ def success?
15
+ true
16
+ end
17
+
18
+ # Not cancelled by default. Overridden in the child class.
19
+ def cancelled?
20
+ false
21
+ end
22
+
23
+ def message
24
+
25
+ end
26
+
27
+ def parse(query_string)
28
+ return {} if query_string.blank?
29
+
30
+ query_string.split('&').inject({}) do |memo, chunk|
31
+ next if chunk.empty?
32
+ key, value = chunk.split('=', 2)
33
+ next if key.empty?
34
+ value = value.nil? ? nil : CGI.unescape(value)
35
+ memo[CGI.unescape(key)] = value
36
+ memo
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module SagePayForm
5
+ autoload :Helper, File.dirname(__FILE__) + '/sage_pay_form/helper.rb'
6
+ autoload :Return, File.dirname(__FILE__) + '/sage_pay_form/return.rb'
7
+ autoload :Notification, File.dirname(__FILE__) + '/sage_pay_form/notification.rb'
8
+ autoload :Encryption, File.dirname(__FILE__) + '/sage_pay_form/encryption.rb'
9
+
10
+ mattr_accessor :production_url
11
+ mattr_accessor :test_url
12
+ mattr_accessor :simulate_url
13
+ self.production_url = 'https://live.sagepay.com/gateway/service/vspform-register.vsp'
14
+ self.test_url = 'https://test.sagepay.com/gateway/service/vspform-register.vsp'
15
+ self.simulate_url = 'https://test.sagepay.com/Simulator/VSPFormGateway.asp'
16
+
17
+ def self.return(query_string, options = {})
18
+ Return.new(query_string, options)
19
+ end
20
+
21
+ def self.service_url
22
+ mode = ActiveMerchant::Billing::Base.integration_mode
23
+ case mode
24
+ when :production
25
+ self.production_url
26
+ when :test
27
+ self.test_url
28
+ when :simulate
29
+ self.simulate_url
30
+ else
31
+ raise StandardError, "Integration mode set to an invalid value: #{mode}"
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module SagePayForm
5
+ module Encryption
6
+ def sage_encrypt(plaintext, key)
7
+ ActiveSupport::Base64.encode64s(sage_encrypt_xor(plaintext, key))
8
+ end
9
+
10
+ def sage_decrypt(ciphertext, key)
11
+ sage_encrypt_xor(ActiveSupport::Base64.decode64(ciphertext), key)
12
+ end
13
+
14
+ def sage_encrypt_salt(min, max)
15
+ length = rand(max - min + 1) + min
16
+ SecureRandom.base64(length + 4)[0, length]
17
+ end
18
+
19
+ private
20
+
21
+ def sage_encrypt_xor(data, key)
22
+ raise 'No key provided' if key.blank?
23
+
24
+ key *= (data.length.to_f / key.length.to_f).ceil
25
+ key = key[0, data.length]
26
+
27
+ data.bytes.zip(key.bytes).map { |b1, b2| (b1 ^ b2).chr }.join
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end