yetanothernguyen-activemerchant 1.16.0 → 1.21.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 (86) hide show
  1. data/CHANGELOG +95 -0
  2. data/CONTRIBUTORS +29 -0
  3. data/lib/active_merchant/billing/credit_card.rb +105 -19
  4. data/lib/active_merchant/billing/credit_card_methods.rb +5 -1
  5. data/lib/active_merchant/billing/gateway.rb +1 -1
  6. data/lib/active_merchant/billing/gateways/authorize_net.rb +24 -2
  7. data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +104 -18
  8. data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +110 -4
  9. data/lib/active_merchant/billing/gateways/beanstream.rb +29 -1
  10. data/lib/active_merchant/billing/gateways/braintree_blue.rb +9 -4
  11. data/lib/active_merchant/billing/gateways/braintree_orange.rb +4 -0
  12. data/lib/active_merchant/billing/gateways/card_save.rb +23 -0
  13. data/lib/active_merchant/billing/gateways/certo_direct.rb +279 -0
  14. data/lib/active_merchant/billing/gateways/efsnet.rb +9 -9
  15. data/lib/active_merchant/billing/gateways/elavon.rb +2 -1
  16. data/lib/active_merchant/billing/gateways/epay.rb +12 -6
  17. data/lib/active_merchant/billing/gateways/eway_managed.rb +46 -12
  18. data/lib/active_merchant/billing/gateways/exact.rb +5 -0
  19. data/lib/active_merchant/billing/gateways/ideal/ideal_base.rb +3 -3
  20. data/lib/active_merchant/billing/gateways/ipay88.rb +157 -0
  21. data/lib/active_merchant/billing/gateways/iridium.rb +3 -3
  22. data/lib/active_merchant/billing/gateways/itransact.rb +450 -0
  23. data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +1 -0
  24. data/lib/active_merchant/billing/gateways/moneris.rb +4 -0
  25. data/lib/active_merchant/billing/gateways/nab_transact.rb +244 -0
  26. data/lib/active_merchant/billing/gateways/ogone.rb +94 -56
  27. data/lib/active_merchant/billing/gateways/optimal_payment.rb +277 -0
  28. data/lib/active_merchant/billing/gateways/orbital.rb +57 -34
  29. data/lib/active_merchant/billing/gateways/pay_junction.rb +6 -1
  30. data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -0
  31. data/lib/active_merchant/billing/gateways/payflow/payflow_express_response.rb +2 -2
  32. data/lib/active_merchant/billing/gateways/payflow.rb +10 -2
  33. data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +8 -5
  34. data/lib/active_merchant/billing/gateways/paypal_digital_goods.rb +43 -0
  35. data/lib/active_merchant/billing/gateways/paypal_express.rb +93 -40
  36. data/lib/active_merchant/billing/gateways/paypal_express_common.rb +8 -3
  37. data/lib/active_merchant/billing/gateways/qbms.rb +4 -0
  38. data/lib/active_merchant/billing/gateways/quickpay.rb +97 -22
  39. data/lib/active_merchant/billing/gateways/realex.rb +5 -1
  40. data/lib/active_merchant/billing/gateways/samurai.rb +121 -0
  41. data/lib/active_merchant/billing/gateways/secure_pay_au.rb +136 -49
  42. data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +1 -1
  43. data/lib/active_merchant/billing/gateways/skip_jack.rb +7 -2
  44. data/lib/active_merchant/billing/gateways/stripe.rb +51 -19
  45. data/lib/active_merchant/billing/gateways/usa_epay.rb +13 -184
  46. data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +1496 -0
  47. data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +206 -0
  48. data/lib/active_merchant/billing/gateways/verifi.rb +2 -2
  49. data/lib/active_merchant/billing/gateways/viaklix.rb +1 -1
  50. data/lib/active_merchant/billing/gateways/worldpay.rb +1 -1
  51. data/lib/active_merchant/billing/integrations/action_view_helper.rb +6 -2
  52. data/lib/active_merchant/billing/integrations/authorize_net_sim/helper.rb +228 -0
  53. data/lib/active_merchant/billing/integrations/authorize_net_sim/notification.rb +340 -0
  54. data/lib/active_merchant/billing/integrations/authorize_net_sim.rb +38 -0
  55. data/lib/active_merchant/billing/integrations/direc_pay/helper.rb +4 -4
  56. data/lib/active_merchant/billing/integrations/dwolla/helper.rb +31 -0
  57. data/lib/active_merchant/billing/integrations/dwolla/notification.rb +55 -0
  58. data/lib/active_merchant/billing/integrations/dwolla/return.rb +38 -0
  59. data/lib/active_merchant/billing/integrations/dwolla.rb +30 -0
  60. data/lib/active_merchant/billing/integrations/helper.rb +19 -2
  61. data/lib/active_merchant/billing/integrations/ipay88/helper.rb +120 -0
  62. data/lib/active_merchant/billing/integrations/ipay88/return.rb +121 -0
  63. data/lib/active_merchant/billing/integrations/ipay88.rb +40 -0
  64. data/lib/active_merchant/billing/integrations/nochex.rb +1 -1
  65. data/lib/active_merchant/billing/integrations/payflow_link/helper.rb +100 -0
  66. data/lib/active_merchant/billing/integrations/payflow_link/notification.rb +78 -0
  67. data/lib/active_merchant/billing/integrations/payflow_link.rb +21 -0
  68. data/lib/active_merchant/billing/integrations/sage_pay_form/encryption.rb +4 -4
  69. data/lib/active_merchant/billing/integrations/sage_pay_form/helper.rb +18 -2
  70. data/lib/active_merchant/billing/integrations/two_checkout.rb +1 -2
  71. data/lib/active_merchant/railtie.rb +7 -7
  72. data/lib/active_merchant/railtie.rb.orig +19 -0
  73. data/lib/active_merchant/version.rb +1 -1
  74. data/lib/active_merchant.rb +23 -10
  75. data/lib/active_merchant.rb.orig +78 -0
  76. metadata +147 -63
  77. data/lib/active_merchant/common/connection.rb +0 -177
  78. data/lib/active_merchant/common/country.rb +0 -328
  79. data/lib/active_merchant/common/error.rb +0 -26
  80. data/lib/active_merchant/common/post_data.rb +0 -24
  81. data/lib/active_merchant/common/posts_data.rb +0 -63
  82. data/lib/active_merchant/common/requires_parameters.rb +0 -16
  83. data/lib/active_merchant/common/utils.rb +0 -22
  84. data/lib/active_merchant/common/validateable.rb +0 -81
  85. data/lib/active_merchant/common.rb +0 -14
  86. data/lib/certs/cacert.pem +0 -7815
@@ -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 requery URL upon returning from iPay88
25
+ def self.service_url
26
+ "https://www.mobile88.com/epayment/enquiry.asp"
27
+ end
28
+
29
+ # The URL to POST your payment form to
30
+ def self.entry_url
31
+ "https://www.mobile88.com/epayment/entry.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
@@ -68,7 +68,7 @@ module ActiveMerchant #:nodoc:
68
68
 
69
69
 
70
70
  mattr_accessor :service_url
71
- self.service_url = 'https://www.nochex.com/nochex.dll/checkout'
71
+ self.service_url = 'https://secure.nochex.com'
72
72
 
73
73
  mattr_accessor :notification_confirmation_url
74
74
  self.notification_confirmation_url = 'https://www.nochex.com/nochex.dll/apc/apc'
@@ -0,0 +1,100 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module PayflowLink
5
+ class Helper < ActiveMerchant::Billing::Integrations::Helper
6
+ include PostsData
7
+
8
+ def initialize(order, account, options = {})
9
+ super
10
+ add_field('login', account)
11
+ add_field('echodata', 'True')
12
+ add_field('user2', self.test?)
13
+ add_field('invoice', order)
14
+ add_field('vendor', account)
15
+ add_field('user', options[:credential4] || account)
16
+ add_field('trxtype', options[:transaction_type] || 'S')
17
+ end
18
+
19
+ mapping :account, 'login'
20
+ mapping :credential2, 'pwd'
21
+ mapping :credential3, 'partner'
22
+ mapping :order, 'user1'
23
+ mapping :description, 'description'
24
+
25
+ mapping :amount, 'amt'
26
+
27
+
28
+ mapping :billing_address, :city => 'city',
29
+ :address => 'address',
30
+ :state => 'state',
31
+ :zip => 'zip',
32
+ :country => 'country',
33
+ :phone => 'phone',
34
+ :name => 'name'
35
+
36
+ mapping :customer, :name => 'name'
37
+
38
+ def customer(params = {})
39
+ add_field(mappings[:customer][:name], [params.delete(:first_name), params.delete(:last_name)].compact.join(' '))
40
+ end
41
+
42
+ def billing_address(params = {})
43
+ # Get the country code in the correct format
44
+ # Use what we were given if we can't find anything
45
+ country_code = lookup_country_code(params.delete(:country))
46
+ add_field(mappings[:billing_address][:country], country_code)
47
+
48
+ add_field(mappings[:billing_address][:address], [params.delete(:address1), params.delete(:address2)].compact.join(' '))
49
+
50
+ province_code = params.delete(:state)
51
+ add_field(mappings[:billing_address][:state], province_code.blank? ? 'N/A' : province_code.upcase)
52
+
53
+ # Everything else
54
+ params.each do |k, v|
55
+ field = mappings[:billing_address][k]
56
+ add_field(field, v) unless field.nil?
57
+ end
58
+ end
59
+
60
+ def form_fields
61
+ token, token_id = request_secure_token
62
+
63
+ {"securetoken" => token, "securetokenid" => token_id, "mode" => test? ? "test" : "live"}
64
+ end
65
+
66
+ private
67
+
68
+ def secure_token_id
69
+ @secure_token_id ||= Utils.generate_unique_id
70
+ end
71
+
72
+ def secure_token_url
73
+ test? ? "https://pilot-payflowpro.paypal.com" : "https://payflowpro.paypal.com"
74
+ end
75
+
76
+ def request_secure_token
77
+ @fields["securetokenid"] = secure_token_id
78
+ @fields["createsecuretoken"] = "Y"
79
+
80
+ fields = @fields.collect {|key, value| "#{key}[#{value.length}]=#{value}" }.join("&")
81
+
82
+ response = ssl_post(secure_token_url, fields)
83
+
84
+ parse_response(response)
85
+ end
86
+
87
+ def parse_response(response)
88
+ response = response.split("&").inject({}) do |hash, param|
89
+ key, value = param.split("=")
90
+ hash[key] = value
91
+ hash
92
+ end
93
+
94
+ [response['SECURETOKEN'], response['SECURETOKENID']] if response['RESPMSG'] && response['RESPMSG'].downcase == "approved"
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,78 @@
1
+ require 'net/http'
2
+
3
+ module ActiveMerchant #:nodoc:
4
+ module Billing #:nodoc:
5
+ module Integrations #:nodoc:
6
+ module PayflowLink
7
+ class Notification < ActiveMerchant::Billing::Integrations::Notification
8
+
9
+ # Was the transaction complete?
10
+ def complete?
11
+ status == "Completed"
12
+ end
13
+
14
+ # When was this payment received by the client.
15
+ # sometimes it can happen that we get the notification much later.
16
+ # One possible scenario is that our web application was down. In this case paypal tries several
17
+ # times an hour to inform us about the notification
18
+ def received_at
19
+ DateTime.parse(params['TRANSTIME']) if params['TRANSTIME']
20
+ rescue ArgumentError
21
+ nil
22
+ end
23
+
24
+ def status
25
+ params['RESPMSG']
26
+ end
27
+
28
+ # Id of this transaction (paypal number)
29
+ def transaction_id
30
+ params['PNREF']
31
+ end
32
+
33
+ # What type of transaction are we dealing with?
34
+ def type
35
+ params['TYPE']
36
+ end
37
+
38
+ # the money amount we received in X.2 decimal.
39
+ def gross
40
+ params['AMT']
41
+ end
42
+
43
+ # What currency have we been dealing with
44
+ def currency
45
+ nil
46
+ end
47
+
48
+ def status
49
+ params['RESULT'] == '0' ? 'Completed' : 'Failed'
50
+ end
51
+
52
+ # This is the item number which we submitted to paypal
53
+ def item_id
54
+ params['USER1']
55
+ end
56
+
57
+ # This is the invoice which you passed to paypal
58
+ def invoice
59
+ params['INVNUM']
60
+ end
61
+
62
+ # Was this a test transaction?
63
+ def test?
64
+ params['USER2'] == 'true'
65
+ end
66
+
67
+ def account
68
+ params["ACCT"]
69
+ end
70
+
71
+ def acknowledge
72
+ true
73
+ end
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,21 @@
1
+ module ActiveMerchant #:nodoc:
2
+ module Billing #:nodoc:
3
+ module Integrations #:nodoc:
4
+ module PayflowLink
5
+ autoload :Helper, 'active_merchant/billing/integrations/payflow_link/helper.rb'
6
+ autoload :Notification, 'active_merchant/billing/integrations/payflow_link/notification.rb'
7
+
8
+ mattr_accessor :service_url
9
+ self.service_url = 'https://payflowlink.paypal.com'
10
+
11
+ def self.notification(post, options = {})
12
+ Notification.new(post)
13
+ end
14
+
15
+ def self.return(query_string, options = {})
16
+ ActiveMerchant::Billing::Integrations::Return.new(query_string)
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -4,11 +4,11 @@ module ActiveMerchant #:nodoc:
4
4
  module SagePayForm
5
5
  module Encryption
6
6
  def sage_encrypt(plaintext, key)
7
- ActiveSupport::Base64.encode64s(sage_encrypt_xor(plaintext, key))
7
+ Base64.strict_encode64(sage_encrypt_xor(plaintext, key))
8
8
  end
9
9
 
10
10
  def sage_decrypt(ciphertext, key)
11
- sage_encrypt_xor(ActiveSupport::Base64.decode64(ciphertext), key)
11
+ sage_encrypt_xor(Base64.decode64(ciphertext), key)
12
12
  end
13
13
 
14
14
  def sage_encrypt_salt(min, max)
@@ -21,8 +21,8 @@ module ActiveMerchant #:nodoc:
21
21
  def sage_encrypt_xor(data, key)
22
22
  raise 'No key provided' if key.blank?
23
23
 
24
- key *= (data.length.to_f / key.length.to_f).ceil
25
- key = key[0, data.length]
24
+ key *= (data.bytesize.to_f / key.bytesize.to_f).ceil
25
+ key = key[0, data.bytesize]
26
26
 
27
27
  data.bytes.zip(key.bytes).map { |b1, b2| (b1 ^ b2).chr }.join
28
28
  end
@@ -41,17 +41,33 @@ module ActiveMerchant #:nodoc:
41
41
  mapping :return_url, 'SuccessURL'
42
42
  mapping :description, 'Description'
43
43
 
44
+ def shipping_address(params = {})
45
+ @shipping_address_set = true unless params.empty?
46
+
47
+ params.each do |k, v|
48
+ field = mappings[:shipping_address][k]
49
+ add_field(field, v) unless field.nil?
50
+ end
51
+ end
52
+
53
+ def map_billing_address_to_shipping_address
54
+ %w(City Address1 Address2 State PostCode Country).each do |field|
55
+ fields["Delivery#{field}"] = fields["Billing#{field}"]
56
+ end
57
+ end
58
+
44
59
  def form_fields
60
+ map_billing_address_to_shipping_address unless @shipping_address_set
61
+
45
62
  fields['DeliveryFirstnames'] ||= fields['BillingFirstnames']
46
63
  fields['DeliverySurname'] ||= fields['BillingSurname']
47
-
64
+
48
65
  fields['FailureURL'] ||= fields['SuccessURL']
49
66
 
50
67
  crypt_skip = ['Vendor', 'EncryptKey', 'SendEmail']
51
68
  crypt_skip << 'BillingState' unless fields['BillingCountry'] == 'US'
52
69
  crypt_skip << 'DeliveryState' unless fields['DeliveryCountry'] == 'US'
53
70
  crypt_skip << 'CustomerEMail' unless fields['SendEmail']
54
-
55
71
  key = fields['EncryptKey']
56
72
  @crypt ||= create_crypt_field(fields.except(*crypt_skip), key)
57
73
 
@@ -1,4 +1,3 @@
1
-
2
1
  module ActiveMerchant #:nodoc:
3
2
  module Billing #:nodoc:
4
3
  module Integrations #:nodoc:
@@ -8,7 +7,7 @@ module ActiveMerchant #:nodoc:
8
7
  autoload 'Notification', File.dirname(__FILE__) + '/two_checkout/notification'
9
8
 
10
9
  mattr_accessor :service_url
11
- self.service_url = 'https://www.2checkout.com/2co/buyer/purchase'
10
+ self.service_url = 'https://www.2checkout.com/checkout/purchase'
12
11
 
13
12
  def self.notification(post, options = {})
14
13
  Notification.new(post)
@@ -1,9 +1,9 @@
1
1
  module ActiveMerchant
2
- class Railtie < Rails::Railtie
3
- initializer 'activemerchant.initialize' do
4
- ActiveSupport.on_load(:action_view) do
5
- include ActiveMerchant::Billing::Integrations::ActionViewHelper
6
- end
7
- end
8
- end
2
+ class Railtie < Rails::Railtie
3
+ initializer 'activemerchant.initialize' do
4
+ ActiveSupport.on_load(:action_view) do
5
+ include ActiveMerchant::Billing::Integrations::ActionViewHelper
6
+ end
7
+ end
8
+ end
9
9
  end
@@ -0,0 +1,19 @@
1
+ module ActiveMerchant
2
+ <<<<<<< HEAD
3
+ class Railtie < Rails::Railtie
4
+ initializer 'activemerchant.initialize' do
5
+ ActiveSupport.on_load(:action_view) do
6
+ include ActiveMerchant::Billing::Integrations::ActionViewHelper
7
+ end
8
+ end
9
+ end
10
+ =======
11
+ class Railtie < Rails::Railtie
12
+ initializer 'activemerchant.initialize' do
13
+ ActiveSupport.on_load(:action_view) do
14
+ include ActiveMerchant::Billing::Integrations::ActionViewHelper
15
+ end
16
+ end
17
+ end
18
+ >>>>>>> Use Railtie to include view helpers in Rails 3
19
+ end
@@ -1,3 +1,3 @@
1
1
  module ActiveMerchant
2
- VERSION = "1.16.0"
2
+ VERSION = "1.21.0"
3
3
  end
@@ -20,33 +20,46 @@
20
20
  # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
21
  # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
22
  #++
23
-
24
- $:.unshift File.dirname(__FILE__)
25
23
 
26
24
  require 'active_support'
27
25
  require 'active_support/core_ext/string/inflections'
28
26
  require 'active_support/core_ext/hash/indifferent_access'
29
27
  require 'active_support/core_ext/hash/conversions'
30
- require 'active_support/core_ext/class/inheritable_attributes'
28
+ require 'active_support/core_ext/object/conversions'
29
+ require 'active_support/core_ext/class/attribute'
31
30
  require 'active_support/core_ext/class/attribute_accessors'
32
31
  require 'active_support/core_ext/class/delegating_attributes'
33
32
  require 'active_support/core_ext/module/attribute_accessors'
34
- require 'active_support/core_ext/kernel/requires'
35
- require 'active_support/base64'
36
- require 'active_support/secure_random'
37
33
 
34
+ begin
35
+ require 'active_support/base64'
36
+
37
+ unless defined?(Base64)
38
+ Base64 = ActiveSupport::Base64
39
+ end
40
+
41
+ unless Base64.respond_to?(:strict_encode64)
42
+ def Base64.strict_encode64(v)
43
+ ActiveSupport::Base64.encode64s(v)
44
+ end
45
+ end
46
+ rescue LoadError
47
+ require 'base64'
48
+ end
49
+
50
+ require 'securerandom'
38
51
  require 'builder'
39
52
  require 'cgi'
40
53
  require 'rexml/document'
41
54
 
42
- require 'active_merchant/common'
55
+ require 'active_utils'
43
56
  require 'active_merchant/billing'
44
57
  require 'active_merchant/version'
45
58
 
46
- require 'active_merchant/railtie' if defined?(::Rails)
47
-
48
59
  module ActiveMerchant #:nodoc:
49
- module Billing #:nodoc:
60
+ module Billing #:nodoc:
50
61
  autoload :Integrations, 'active_merchant/billing/integrations'
51
62
  end
52
63
  end
64
+
65
+ require 'active_merchant/railtie' if defined?(Rails) && ActiveSupport::VERSION::MAJOR >= 3