bitfluent-activemerchant 1.5.1.1

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 (138) hide show
  1. data/CHANGELOG +520 -0
  2. data/CONTRIBUTORS +138 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +136 -0
  5. data/gem-public_cert.pem +20 -0
  6. data/lib/active_merchant/billing/avs_result.rb +98 -0
  7. data/lib/active_merchant/billing/base.rb +57 -0
  8. data/lib/active_merchant/billing/check.rb +68 -0
  9. data/lib/active_merchant/billing/credit_card.rb +159 -0
  10. data/lib/active_merchant/billing/credit_card_formatting.rb +21 -0
  11. data/lib/active_merchant/billing/credit_card_methods.rb +125 -0
  12. data/lib/active_merchant/billing/cvv_result.rb +38 -0
  13. data/lib/active_merchant/billing/expiry_date.rb +34 -0
  14. data/lib/active_merchant/billing/gateway.rb +163 -0
  15. data/lib/active_merchant/billing/gateways/authorize_net.rb +654 -0
  16. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +736 -0
  17. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +244 -0
  18. data/lib/active_merchant/billing/gateways/beanstream.rb +102 -0
  19. data/lib/active_merchant/billing/gateways/beanstream_interac.rb +54 -0
  20. data/lib/active_merchant/billing/gateways/bogus.rb +102 -0
  21. data/lib/active_merchant/billing/gateways/braintree.rb +17 -0
  22. data/lib/active_merchant/billing/gateways/card_stream.rb +230 -0
  23. data/lib/active_merchant/billing/gateways/cyber_source.rb +406 -0
  24. data/lib/active_merchant/billing/gateways/data_cash.rb +593 -0
  25. data/lib/active_merchant/billing/gateways/efsnet.rb +229 -0
  26. data/lib/active_merchant/billing/gateways/elavon.rb +134 -0
  27. data/lib/active_merchant/billing/gateways/eway.rb +277 -0
  28. data/lib/active_merchant/billing/gateways/exact.rb +222 -0
  29. data/lib/active_merchant/billing/gateways/first_pay.rb +172 -0
  30. data/lib/active_merchant/billing/gateways/garanti.rb +222 -0
  31. data/lib/active_merchant/billing/gateways/instapay.rb +164 -0
  32. data/lib/active_merchant/billing/gateways/jetpay.rb +270 -0
  33. data/lib/active_merchant/billing/gateways/linkpoint.rb +449 -0
  34. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +154 -0
  35. data/lib/active_merchant/billing/gateways/merchant_ware.rb +283 -0
  36. data/lib/active_merchant/billing/gateways/modern_payments.rb +36 -0
  37. data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +220 -0
  38. data/lib/active_merchant/billing/gateways/moneris.rb +205 -0
  39. data/lib/active_merchant/billing/gateways/net_registry.rb +189 -0
  40. data/lib/active_merchant/billing/gateways/netbilling.rb +168 -0
  41. data/lib/active_merchant/billing/gateways/ogone.rb +279 -0
  42. data/lib/active_merchant/billing/gateways/pay_junction.rb +392 -0
  43. data/lib/active_merchant/billing/gateways/pay_secure.rb +120 -0
  44. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +207 -0
  45. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +39 -0
  46. data/lib/active_merchant/billing/gateways/payflow/payflow_response.rb +13 -0
  47. data/lib/active_merchant/billing/gateways/payflow.rb +236 -0
  48. data/lib/active_merchant/billing/gateways/payflow_express.rb +138 -0
  49. data/lib/active_merchant/billing/gateways/payflow_express_uk.rb +15 -0
  50. data/lib/active_merchant/billing/gateways/payflow_uk.rb +21 -0
  51. data/lib/active_merchant/billing/gateways/payment_express.rb +230 -0
  52. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +326 -0
  53. data/lib/active_merchant/billing/gateways/paypal/paypal_express_response.rb +38 -0
  54. data/lib/active_merchant/billing/gateways/paypal.rb +121 -0
  55. data/lib/active_merchant/billing/gateways/paypal_ca.rb +13 -0
  56. data/lib/active_merchant/billing/gateways/paypal_express.rb +135 -0
  57. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +20 -0
  58. data/lib/active_merchant/billing/gateways/plugnpay.rb +292 -0
  59. data/lib/active_merchant/billing/gateways/psigate.rb +214 -0
  60. data/lib/active_merchant/billing/gateways/psl_card.rb +304 -0
  61. data/lib/active_merchant/billing/gateways/quickpay.rb +213 -0
  62. data/lib/active_merchant/billing/gateways/realex.rb +200 -0
  63. data/lib/active_merchant/billing/gateways/sage/sage_bankcard.rb +88 -0
  64. data/lib/active_merchant/billing/gateways/sage/sage_core.rb +116 -0
  65. data/lib/active_merchant/billing/gateways/sage/sage_virtual_check.rb +97 -0
  66. data/lib/active_merchant/billing/gateways/sage.rb +146 -0
  67. data/lib/active_merchant/billing/gateways/sage_pay.rb +309 -0
  68. data/lib/active_merchant/billing/gateways/sallie_mae.rb +144 -0
  69. data/lib/active_merchant/billing/gateways/secure_pay.rb +31 -0
  70. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +157 -0
  71. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +113 -0
  72. data/lib/active_merchant/billing/gateways/skip_jack.rb +453 -0
  73. data/lib/active_merchant/billing/gateways/smart_ps.rb +265 -0
  74. data/lib/active_merchant/billing/gateways/trans_first.rb +127 -0
  75. data/lib/active_merchant/billing/gateways/transax.rb +25 -0
  76. data/lib/active_merchant/billing/gateways/trust_commerce.rb +418 -0
  77. data/lib/active_merchant/billing/gateways/usa_epay.rb +194 -0
  78. data/lib/active_merchant/billing/gateways/verifi.rb +228 -0
  79. data/lib/active_merchant/billing/gateways/viaklix.rb +189 -0
  80. data/lib/active_merchant/billing/gateways/wirecard.rb +318 -0
  81. data/lib/active_merchant/billing/gateways.rb +18 -0
  82. data/lib/active_merchant/billing/integrations/action_view_helper.rb +79 -0
  83. data/lib/active_merchant/billing/integrations/bogus/helper.rb +17 -0
  84. data/lib/active_merchant/billing/integrations/bogus/notification.rb +11 -0
  85. data/lib/active_merchant/billing/integrations/bogus/return.rb +10 -0
  86. data/lib/active_merchant/billing/integrations/bogus.rb +23 -0
  87. data/lib/active_merchant/billing/integrations/chronopay/helper.rb +120 -0
  88. data/lib/active_merchant/billing/integrations/chronopay/notification.rb +158 -0
  89. data/lib/active_merchant/billing/integrations/chronopay/return.rb +10 -0
  90. data/lib/active_merchant/billing/integrations/chronopay.rb +23 -0
  91. data/lib/active_merchant/billing/integrations/gestpay/common.rb +42 -0
  92. data/lib/active_merchant/billing/integrations/gestpay/helper.rb +70 -0
  93. data/lib/active_merchant/billing/integrations/gestpay/notification.rb +85 -0
  94. data/lib/active_merchant/billing/integrations/gestpay/return.rb +10 -0
  95. data/lib/active_merchant/billing/integrations/gestpay.rb +25 -0
  96. data/lib/active_merchant/billing/integrations/helper.rb +93 -0
  97. data/lib/active_merchant/billing/integrations/hi_trust/helper.rb +58 -0
  98. data/lib/active_merchant/billing/integrations/hi_trust/notification.rb +59 -0
  99. data/lib/active_merchant/billing/integrations/hi_trust/return.rb +67 -0
  100. data/lib/active_merchant/billing/integrations/hi_trust.rb +27 -0
  101. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +120 -0
  102. data/lib/active_merchant/billing/integrations/ipay88/return.rb +121 -0
  103. data/lib/active_merchant/billing/integrations/ipay88.rb +40 -0
  104. data/lib/active_merchant/billing/integrations/nochex/helper.rb +68 -0
  105. data/lib/active_merchant/billing/integrations/nochex/notification.rb +94 -0
  106. data/lib/active_merchant/billing/integrations/nochex/return.rb +10 -0
  107. data/lib/active_merchant/billing/integrations/nochex.rb +88 -0
  108. data/lib/active_merchant/billing/integrations/notification.rb +62 -0
  109. data/lib/active_merchant/billing/integrations/paypal/helper.rb +119 -0
  110. data/lib/active_merchant/billing/integrations/paypal/notification.rb +154 -0
  111. data/lib/active_merchant/billing/integrations/paypal/return.rb +10 -0
  112. data/lib/active_merchant/billing/integrations/paypal.rb +39 -0
  113. data/lib/active_merchant/billing/integrations/quickpay/helper.rb +72 -0
  114. data/lib/active_merchant/billing/integrations/quickpay/notification.rb +74 -0
  115. data/lib/active_merchant/billing/integrations/quickpay.rb +17 -0
  116. data/lib/active_merchant/billing/integrations/return.rb +35 -0
  117. data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +59 -0
  118. data/lib/active_merchant/billing/integrations/two_checkout/notification.rb +114 -0
  119. data/lib/active_merchant/billing/integrations/two_checkout/return.rb +17 -0
  120. data/lib/active_merchant/billing/integrations/two_checkout.rb +23 -0
  121. data/lib/active_merchant/billing/integrations.rb +29 -0
  122. data/lib/active_merchant/billing/response.rb +32 -0
  123. data/lib/active_merchant/billing.rb +9 -0
  124. data/lib/active_merchant/common/connection.rb +172 -0
  125. data/lib/active_merchant/common/country.rb +319 -0
  126. data/lib/active_merchant/common/error.rb +26 -0
  127. data/lib/active_merchant/common/post_data.rb +24 -0
  128. data/lib/active_merchant/common/posts_data.rb +47 -0
  129. data/lib/active_merchant/common/requires_parameters.rb +16 -0
  130. data/lib/active_merchant/common/utils.rb +18 -0
  131. data/lib/active_merchant/common/validateable.rb +76 -0
  132. data/lib/active_merchant/common.rb +14 -0
  133. data/lib/active_merchant.rb +38 -0
  134. data/lib/activemerchant.rb +1 -0
  135. data/lib/certs/cacert.pem +7815 -0
  136. data/lib/support/gateway_support.rb +58 -0
  137. data/lib/support/outbound_hosts.rb +25 -0
  138. metadata +235 -0
@@ -0,0 +1,67 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module HiTrust
5
+ class Return < ActiveMerchant::Billing::Integrations::Return
6
+ SUCCESS = "00"
7
+ CODES = { "00" => "Operation completed successfully",
8
+ "-1" => "Unable to initialize winsock dll.",
9
+ "-2" => "Can't create stream socket.",
10
+ "-3" => "No Request Message.",
11
+ "-4" => "Can't connect to server.",
12
+ "-5" => "Send socket error.",
13
+ "-6" => "Couldn't receive data.",
14
+ "-7" => "Receive Broken message.",
15
+ "-8" => "Unable to initialize Envirnment.",
16
+ "-9" => "Can't Read Server RSA File.",
17
+ "-10" => "Can't Read Client RSA File.",
18
+ "-11" => "Web Server error.",
19
+ "-12" => "Receive Message type error.",
20
+ "-13" => "No Request Message.",
21
+ "-14" => "No Response Content.",
22
+ "-18" => "Merchant Update URL not found.",
23
+ "-19" => "Server URL not find Domain or IP.",
24
+ "-20" => "Server URL only can fill http or https.",
25
+ "-21" => "Server Config File open error.",
26
+ "-22" => "Server RSA Key File open error.",
27
+ "-23" => "Server RSA Key File read error.",
28
+ "-24" => "Server Config File have some errors, Please to check it.",
29
+ "-25" => "Merchant Config File open error.",
30
+ "-26" => "Merchant RSA Key File open error.",
31
+ "-27" => "Merchant RSA Key File read error.",
32
+ "-28" => "Merchant Config File has some errors, Please to check it.",
33
+ "-29" => "Server Type is unknown.",
34
+ "-30" => "Comm Type is unknown.",
35
+ "-31" => "Input Parameter [ORDERNO] is null or empty.",
36
+ "-32" => "Input Parameter [STOREID] is null or empty.",
37
+ "-33" => "Input Parameter [ORDERDESC] is null or empty.",
38
+ "-34" => "Input Parameter [CURRENCY] is null or empty.",
39
+ "-35" => "Input Parameter [AMOUNT] is null or empty.",
40
+ "-36" => "Input Parameter [ORDERURL] is null or empty.",
41
+ "-37" => "Input Parameter [RETURNURL] is null or empty.",
42
+ "-38" => "Input Parameter [DEPOSIT] is null or empty.",
43
+ "-39" => "Input Parameter [QUERYFLAG] is null or empty.",
44
+ "-40" => "Input Parameter [UPDATEURL] is null or empty.",
45
+ "-41" => "Input Parameter [MERUPDATEURL] is null or empty.",
46
+ "-42" => "Input Parameter [KEY] is null or empty.",
47
+ "-43" => "Input Parameter [MAC] is null or empty.",
48
+ "-44" => "Input Parameter [CIPHER] is null or empty.",
49
+ "-45" => "Input Parameter [TrxType] is wrong.",
50
+ "-100" => "TrustLink Server is closed. Or Merchant Server IP is not consistent with TrustLink Server setting.",
51
+ "-101" => "TrustLink Server receives NULL.",
52
+ "-308" => "Order Number already exists.",
53
+ "positive" => "Response from Bank. Please contact with Acquirer Bank Service or HiTRUST Call Center."
54
+ }
55
+
56
+ def success?
57
+ params['retcode'] == SUCCESS
58
+ end
59
+
60
+ def message
61
+ CODES[ params['retcode'] ]
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+
2
+ module ActiveMerchant #:nodoc:
3
+ module Billing #:nodoc:
4
+ module Integrations #:nodoc:
5
+ module HiTrust
6
+ autoload :Helper, File.dirname(__FILE__) + '/hi_trust/helper.rb'
7
+ autoload :Return, File.dirname(__FILE__) + '/hi_trust/return.rb'
8
+ autoload :Notification, File.dirname(__FILE__) + '/hi_trust/notification.rb'
9
+
10
+ TEST_URL = 'https://testtrustlink.hitrust.com.tw/TrustLink/TrxReq'
11
+ LIVE_URL = 'https://trustlink.hitrust.com.tw/TrustLink/TrxReq'
12
+
13
+ def self.service_url
14
+ ActiveMerchant::Billing::Base.integration_mode == :test ? TEST_URL : LIVE_URL
15
+ end
16
+
17
+ def self.notification(post)
18
+ Notification.new(post)
19
+ end
20
+
21
+ def self.return(query_string)
22
+ Return.new(query_string)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,120 @@
1
+ require "digest/sha1"
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Ipay88
7
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
8
+ include RequiresParameters
9
+
10
+ # Currencies supported
11
+ # MYR (Malaysian Ringgit - for all payment methods except China Union Pay and PayPal)
12
+ # USD (US Dollar - only for PayPal)
13
+ # CNY (Yuan Renminbi - only for China Union Pay)
14
+ SUPPORTED_CURRENCIES = %w[MYR USD CNY]
15
+
16
+ # Languages supported
17
+ # ISO-8859-1 (English)
18
+ # UTF-8 (Unicode)
19
+ # GB2312 (Chinese Simplified)
20
+ # GD18030 (Chinese Simplified)
21
+ # BIG5 (Chinese Traditional)
22
+ SUPPORTED_LANGS = %w[ISO-8859-1 UTF-8 GB2312 GD18030 BIG5]
23
+
24
+ # Payment methods supported
25
+ # 8 (Alliance Online Transfer)
26
+ # 10 (AmBank)
27
+ # 21 (China Union Pay)
28
+ # 20 (CIMB Click)
29
+ # 2 (Credit Card MYR)
30
+ # 16 (FPX)
31
+ # 15 (Hong Leong Bank Transfer)
32
+ # 6 (Maybank2u.com)
33
+ # 23 (MEPS Cash)
34
+ # 17 (Mobile Money)
35
+ # 33 (PayPal)
36
+ # 14 (RHB)
37
+ PAYMENT_METHODS = %w[8 10 21 20 2 16 15 6 23 17 33 14]
38
+
39
+ attr_reader :amount_in_cents
40
+
41
+ def initialize(order, account, options = {})
42
+ requires!(options, :amount, :currency)
43
+ @amount_in_cents = options[:amount]
44
+ super
45
+ add_field mappings[:signature], signature
46
+ end
47
+
48
+ def amount=(money)
49
+ cents = money.respond_to?(:cents) ? money.cents : money
50
+ if money.is_a?(String) or cents.to_i < 0
51
+ raise ArgumentError, "money amount must be either a Money object or a positive integer in cents."
52
+ end
53
+ add_field mappings[:amount], sprintf("%.2f", cents.to_f/100)
54
+ end
55
+
56
+ def currency(symbol)
57
+ raise ArgumentError, "unsupported currency" unless SUPPORTED_CURRENCIES.include?(symbol)
58
+ add_field mappings[:currency], symbol
59
+ end
60
+
61
+ def language(lang)
62
+ raise ArgumentError, "unsupported language" unless SUPPORTED_LANGS.include?(lang)
63
+ add_field mappings[:language], lang
64
+ end
65
+
66
+ def payment(pay_method)
67
+ raise ArgumentError, "unsupported payment method" unless PAYMENT_METHODS.include?(pay_method.to_s)
68
+ add_field mappings[:payment], pay_method
69
+ end
70
+
71
+ # Generate a Base64-encoded SHA1 given a string
72
+ def self.sign(str)
73
+ [Digest::SHA1.digest(str)].pack("m").chomp
74
+ end
75
+
76
+ def signature
77
+ self.class.sign(self.sig_components)
78
+ end
79
+
80
+ # MerchantCode (required)
81
+ mapping :account, "MerchantCode"
82
+ # Amount (required)
83
+ mapping :amount, "Amount"
84
+ # Currency (required)
85
+ mapping :currency, "Currency"
86
+ # RefNo (required)
87
+ mapping :order, "RefNo"
88
+ # ProdDesc (required)
89
+ mapping :description, "ProdDesc"
90
+ # UserName (required)
91
+ # UserEmail (required)
92
+ # UserContact (required)
93
+ mapping :customer, :name => "UserName",
94
+ :email => "UserEmail",
95
+ :phone => "UserContact"
96
+ # Remark
97
+ mapping :remark, "Remark"
98
+ # Lang
99
+ mapping :language, "Lang"
100
+ # PaymentId
101
+ mapping :payment, "PaymentId"
102
+ # ResponseURL
103
+ mapping :return_url, "ResponseURL"
104
+ # Signature
105
+ mapping :signature, "Signature"
106
+
107
+ protected
108
+ def sig_components #:nodoc:
109
+ components = [Ipay88.merchant_key]
110
+ components << fields[mappings[:account]]
111
+ components << fields[mappings[:order]]
112
+ components << amount_in_cents
113
+ components << fields[mappings[:currency]]
114
+ components.join
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,121 @@
1
+ require "digest/sha1"
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module Ipay88
7
+ class Return < ActiveMerchant::Billing::Integrations::Return
8
+ include ActiveMerchant::PostsData
9
+
10
+ # Merchant Code assigned by iPay88
11
+ def account
12
+ params["MerchantCode"]
13
+ end
14
+
15
+ # The payment method
16
+ def payment
17
+ params["PaymentId"].to_i
18
+ end
19
+
20
+ # Unique merchant transaction number
21
+ def order
22
+ params["RefNo"]
23
+ end
24
+
25
+ # The payment with two decimals
26
+ def amount
27
+ params["Amount"]
28
+ end
29
+
30
+ # The currency. List of possible values:
31
+ # <tt>MYR</tt>::
32
+ # <tt>USD</tt>::
33
+ # <tt>CNY</tt>::
34
+ def currency
35
+ params["Currency"]
36
+ end
37
+
38
+ # Merchant remark
39
+ def remark
40
+ params["Remark"]
41
+ end
42
+
43
+ # Transaction ID from iPay88
44
+ def transaction
45
+ params["TransId"]
46
+ end
47
+
48
+ # Bank's approval code
49
+ def auth_code
50
+ params["AuthCode"]
51
+ end
52
+
53
+ # Payment status. List of possible values:
54
+ # <tt>1</tt>:: Success
55
+ # <tt>0</tt>:: Fail
56
+ def status
57
+ params["Status"]
58
+ end
59
+
60
+ # The error description. List of possible values:
61
+ # <tt>Duplicate reference number</tt>::
62
+ # <tt>Invalid merchant</tt>::
63
+ # <tt>Invalid parameters</tt>::
64
+ # <tt>Overlimit per transaction</tt>::
65
+ # <tt>Payment not allowed</tt>::
66
+ # <tt>Permission not allow</tt>::
67
+ # <tt>Signature not match</tt>::
68
+ # <tt>Status not approved</tt>::
69
+ def error
70
+ params["ErrDesc"]
71
+ end
72
+
73
+ # The hash signature
74
+ def signature
75
+ params["Signature"]
76
+ end
77
+
78
+ # Convenience method to check if the request is secure by
79
+ # checking the incoming signature against our own generated
80
+ # signature
81
+ def secure?
82
+ self.generated_signature == self.signature
83
+ end
84
+
85
+ # Was the transaction successful?
86
+ def success?
87
+ self.secure? && self.requery == "00" && self.status == "1"
88
+ end
89
+
90
+ protected
91
+ def generated_signature #:nodoc:
92
+ Helper.sign(self.sig_components)
93
+ end
94
+
95
+ def sig_components #:nodoc:
96
+ components = [Ipay88.merchant_key]
97
+ [:account, :payment, :order, :amount_in_cents, :currency, :status].each do |i|
98
+ components << self.send(i)
99
+ end
100
+ components.join
101
+ end
102
+
103
+ def requery #:nodoc:
104
+ data = { "MerchantCode" => self.account, "RefNo" => self.order, "Amount" => self.amount }
105
+ params = parameterize(data)
106
+ ssl_post Ipay88.service_url, params, { "Content-Length" => params.size.to_s, "User-Agent" => "Active Merchant -- http://activemerchant.org" }
107
+ end
108
+
109
+ private
110
+ def parameterize(params) #:nodoc:
111
+ params.reject { |k, v| v.blank? }.keys.sort.collect { |key| "#{key}=#{CGI.escape(params[key].to_s)}" }.join("&")
112
+ end
113
+
114
+ def amount_in_cents #:nodoc:
115
+ @amount_in_cents ||= (self.amount || "").gsub(/[.,]/, "")
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
121
+ end
@@ -0,0 +1,40 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Ipay88
5
+ autoload :Return, "active_merchant/billing/integrations/ipay88/return.rb"
6
+ autoload :Helper, "active_merchant/billing/integrations/ipay88/helper.rb"
7
+ autoload :Notification, "active_merchant/billing/integrations/ipay88/notification.rb"
8
+
9
+ mattr_accessor :merch_key
10
+
11
+ # The merchant key provided to you by iPay88.
12
+ def self.merchant_key
13
+ self.merch_key
14
+ end
15
+
16
+ # Set the merchant key (in a Rails initializer, for example)
17
+ #
18
+ # ActiveMerchant::Billing::Integrations::Ipay88.merchant_key = "foo"
19
+ #
20
+ def self.merchant_key=(key)
21
+ self.merch_key = key
22
+ end
23
+
24
+ # The URL to POST your payment form to
25
+ def self.service_url
26
+ "https://www.mobile88.com/epayment/entry.asp"
27
+ end
28
+
29
+ # The requery URL upon returning from iPay88
30
+ def self.entry_url
31
+ "https://www.mobile88.com/epayment/enquiry.asp"
32
+ end
33
+
34
+ def self.return(query_string)
35
+ Return.new(query_string)
36
+ end
37
+ end
38
+ end
39
+ end
40
+ 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,10 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module Nochex
5
+ class Return < ActiveMerchant::Billing::Integrations::Return
6
+ end
7
+ end
8
+ end
9
+ end
10
+ 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)
79
+ Notification.new(post)
80
+ end
81
+
82
+ def self.return(query_string)
83
+ Return.new(query_string)
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end