effective_orders 3.0.4 → 3.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c63ea13e03cd733ba8ee14f51ab78df6fbbfc25f4b6546d946b20facfa15aaa6
4
- data.tar.gz: 1a5c4d4ca4ce70f3c20c8984cfe2063104908c292f7b37a8ebb0e209c2e60e58
3
+ metadata.gz: f8a648d7e8218c51c4733d02e64c542fcebf91d04d5bb78c457a1fa835e2b319
4
+ data.tar.gz: f062fbd9fd8973ea30c1c62e470a327d6d4cac533606a65cfbe43fbc19fd7418
5
5
  SHA512:
6
- metadata.gz: 9e66345b50629cd33f2e046d910d3d5cf10f735d730e3810c919cfe8fae0fff6731ff85370d2184104898441d9bcc58e7d0bbbdbe06194182e58e70e4d92636d
7
- data.tar.gz: 7f6a851d15695bea583d3ba315e2df215df31be66e1bf3d8d46766ffbf500e111bce198be45b4b947373fac3776d3a1c7dfe1827c60b36efd3bba38c5293d5d9
6
+ metadata.gz: 317b8781f567e20c92ed714b7f7aa823b4de332722fb7d054eaa4134888f95495b5ac138e4677ae746a0566a522e9f346279f53b950bb129c5dd188fe3c3cd50
7
+ data.tar.gz: 931166730fdbed8d51a34fc3bea22b8d791644050a2673ba74093c7f158b7a187b7de8b5580f94d0b23448d2e9427bf1feda17c89bd5ca83cd65d4caca9a16a3
@@ -17,33 +17,39 @@ module Effective
17
17
  declined_url = params.delete(:rvar_declined_url)
18
18
 
19
19
  if @order.purchased? # Fallback to a success condition of the Order is already purchased
20
- order_purchased(details: params, provider: 'moneris', card: params[:card], purchased_url: purchased_url)
21
- return
20
+ return order_purchased(details: params, provider: 'moneris', card: params[:card], purchased_url: purchased_url)
22
21
  end
23
22
 
24
- if params[:result].to_s == '1' && params[:transactionKey].present?
25
- verify_params = parse_moneris_response(send_moneris_verify_request(params[:transactionKey])) || {}
23
+ # Invalid Result
24
+ if params[:result].to_s != '1' || params[:transactionKey].blank?
25
+ return order_declined(details: params, provider: 'moneris', card: params[:card], declined_url: declined_url)
26
+ end
26
27
 
27
- response_code = verify_params[:response_code].to_i # Sometimes moneris sends us the string 'null'
28
+ payment = params.merge(verify_moneris_transaction(params[:transactionKey]))
29
+ valid = (1..49).include?(payment[:response_code].to_i) # Must be > 0 and < 50 to be valid. Sometimes we get the string 'null'
28
30
 
29
- if response_code > 0 && response_code < 50 # Less than 50 means a successful validation
30
- order_purchased(details: params.merge(verify_params), provider: 'moneris', card: params[:card], purchased_url: purchased_url)
31
- else
32
- order_declined(details: params.merge(verify_params), provider: 'moneris', card: params[:card], declined_url: declined_url)
33
- end
34
- else
35
- order_declined(details: params, provider: 'moneris', card: params[:card], declined_url: declined_url)
31
+ if valid == false
32
+ return order_declined(details: payment, provider: 'moneris', card: params[:card], declined_url: declined_url)
36
33
  end
34
+
35
+ order_purchased(details: payment, provider: 'moneris', card: params[:card], purchased_url: purchased_url)
37
36
  end
38
37
 
39
38
  private
40
39
 
41
- def parse_moneris_response(text)
42
- text.split("<br>").inject(Hash.new()) { |h, i| h[i.split(' ').first.to_sym] = i.split(' ').last ; h } rescue {response: text}
43
- end
40
+ def verify_moneris_transaction(transactionKey)
41
+ # Send a verification POST request
42
+ uri = URI.parse(EffectiveOrders.moneris[:verify_url])
43
+ params = { ps_store_id: EffectiveOrders.moneris[:ps_store_id], hpp_key: EffectiveOrders.moneris[:hpp_key], transactionKey: transactionKey }
44
+ headers = { 'Referer': effective_orders.orders_url }
45
+
46
+ http = Net::HTTP.new(uri.host, uri.port)
47
+ http.use_ssl = true
48
+
49
+ body = http.post(uri.path, params.to_query, headers).body
44
50
 
45
- def send_moneris_verify_request(verify_key)
46
- `curl -F ps_store_id='#{EffectiveOrders.moneris[:ps_store_id]}' -F hpp_key='#{EffectiveOrders.moneris[:hpp_key]}' -F transactionKey='#{verify_key}' --referer #{effective_orders.moneris_postback_orders_url} #{EffectiveOrders.moneris[:verify_url]}`
51
+ # Parse response into a Hash
52
+ body.split('<br>').inject({}) { |h, i| h[i.split(' ').first.to_sym] = i.split(' ').last; h }
47
53
  end
48
54
 
49
55
  end
@@ -310,7 +310,16 @@ module Effective
310
310
  self.purchase_state = EffectiveOrders::PURCHASED
311
311
  self.purchased_at ||= Time.zone.now
312
312
 
313
- self.payment = details.kind_of?(Hash) ? details : { details: details.to_s }
313
+ self.payment = (
314
+ if details.kind_of?(Hash)
315
+ details
316
+ elsif details.respond_to?(:to_unsafe_h)
317
+ details.to_unsafe_h
318
+ else
319
+ { details: details.to_s }
320
+ end
321
+ )
322
+
314
323
  self.payment_provider = provider.to_s
315
324
  self.payment_card = card.to_s.presence || 'none'
316
325
 
@@ -0,0 +1,114 @@
1
+ require 'nokogiri'
2
+
3
+ module Effective
4
+ module Providers
5
+ class MonerisCharge
6
+ attr_accessor :order, :purchased_url, :declined_url
7
+ attr_accessor :hpp_id, :ticket # return values
8
+
9
+ def initialize(order:, purchased_url: nil, declined_url: nil)
10
+ @order = order
11
+ @purchased_url = purchased_url
12
+ @declined_url = declined_url
13
+
14
+ moneris_preload!
15
+ end
16
+
17
+ def present?
18
+ ticket.present? && hpp_id.present?
19
+ end
20
+
21
+ def moneris_preload!
22
+ # Make the moneris preload request
23
+ uri = URI.parse(EffectiveOrders.moneris[:hpp_url])
24
+ params = moneris_preload_payload.to_query
25
+ headers = {}
26
+
27
+ http = Net::HTTP.new(uri.host, uri.port)
28
+ http.use_ssl = true
29
+
30
+ body = http.post(uri.path, params, headers).body
31
+ doc = ::Nokogiri::XML(body)
32
+
33
+ # Parse preload request
34
+ moneris = [:hpp_id, :ticket, :order_id, :response_code].inject({}) do |h, key|
35
+ h[key] = doc.xpath("//#{key}").children.first.to_s; h
36
+ end
37
+
38
+ # Transaction Response Code: < 50: data successfully loaded, >= 50: data not loaded
39
+ moneris[:response_code] = (moneris[:response_code].to_i rescue 50)
40
+
41
+ raise 'data not loaded' unless moneris[:response_code] < 50
42
+
43
+ # Our return value
44
+ @hpp_id = moneris[:hpp_id]
45
+ @ticket = moneris[:ticket]
46
+ end
47
+
48
+ def moneris_preload_payload
49
+ payload = {
50
+ ps_store_id: EffectiveOrders.moneris[:ps_store_id],
51
+ hpp_key: EffectiveOrders.moneris[:hpp_key],
52
+ hpp_preload: '',
53
+ charge_total: ('%.2f' % (order.total / 100.0)),
54
+
55
+ # Optional
56
+ order_id: order_id,
57
+ lang: 'en-ca',
58
+ email: order.user.email,
59
+
60
+ rvar_purchased_url: purchased_url,
61
+ rvar_declined_url: declined_url
62
+ }.compact
63
+
64
+ if order.tax.present?
65
+ payload[:gst] = ('%.2f' % (order.tax / 100.0))
66
+ end
67
+
68
+ if order.billing_name.present?
69
+ payload[:bill_first_name] = order.billing_name.split(' ')[0]
70
+ payload[:bill_last_name] = order.billing_name.split(' ')[1..-1].join(' ')
71
+ end
72
+
73
+ if order.billing_address.present?
74
+ address = order.billing_address
75
+ payload[:bill_address_one] = address.address1
76
+ payload[:bill_city] = address.city
77
+ payload[:bill_state_or_province] = address.state
78
+ payload[:bill_postal_code] = address.postal_code
79
+ payload[:bill_country] = address.country
80
+ end
81
+
82
+ if order.shipping_address.present?
83
+ address = order.shipping_address
84
+ payload[:ship_address_one] = address.address1
85
+ payload[:ship_city] = address.city
86
+ payload[:ship_state_or_province] = address.state
87
+ payload[:ship_postal_code] = address.postal_code
88
+ payload[:ship_country] = address.country
89
+ end
90
+
91
+ order.order_items.each_with_index do |item, index|
92
+ payload["id#{index}"] = index
93
+ payload["description#{index}"] = item.title
94
+ payload["quantity#{index}"] = item.quantity
95
+ payload["price#{index}"] = ('%.2f' % (item.price / 100.0))
96
+ payload["subtotal#{index}"] = ('%.2f' % (item.subtotal / 100.0))
97
+ end
98
+
99
+ payload
100
+ end
101
+
102
+ private
103
+
104
+ def order_id
105
+ [
106
+ order.to_param,
107
+ (order.billing_name.to_s.parameterize.presence if EffectiveOrders.moneris[:include_billing_name_in_order_id])
108
+ ].compact.join('-')
109
+ end
110
+
111
+ end
112
+
113
+ end
114
+ end
@@ -1,36 +1,37 @@
1
1
  = render partial: 'effective/orders/order', locals: { order: order }
2
+ - form_locals = { order: order, purchased_url: purchased_url, declined_url: declined_url }
2
3
 
3
4
  .effective-order.effective-order-purchase-actions
4
5
  - if EffectiveOrders.allow_free_orders && order.free?
5
- = render partial: '/effective/orders/free/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
6
+ = render partial: '/effective/orders/free/form', locals: form_locals
6
7
 
7
8
  - elsif EffectiveOrders.allow_refunds && order.refund?
8
9
  -# Nothing
9
10
 
10
11
  - else
11
12
  - if EffectiveOrders.allow_pretend_purchase_in_development && !Rails.env.production?
12
- = render partial: '/effective/orders/pretend/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
13
+ = render partial: '/effective/orders/pretend/form', locals: form_locals
13
14
 
14
15
  - if EffectiveOrders.allow_pretend_purchase_in_production && Rails.env.production?
15
- = render partial: '/effective/orders/pretend/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
16
+ = render partial: '/effective/orders/pretend/form', locals: form_locals
16
17
 
17
18
  - if EffectiveOrders.moneris_enabled
18
- = render partial: '/effective/orders/moneris/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
19
+ = render partial: '/effective/orders/moneris/form', locals: form_locals
19
20
 
20
21
  - if EffectiveOrders.paypal_enabled
21
- = render partial: '/effective/orders/paypal/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
22
+ = render partial: '/effective/orders/paypal/form', locals: form_locals
22
23
 
23
24
  - if EffectiveOrders.stripe_enabled
24
- = render partial: '/effective/orders/stripe/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
25
+ = render partial: '/effective/orders/stripe/form', locals: form_locals
25
26
 
26
27
  - if EffectiveOrders.ccbill_enabled
27
- = render partial: '/effective/orders/ccbill/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
28
+ = render partial: '/effective/orders/ccbill/form', locals: form_locals
28
29
 
29
30
  - if EffectiveOrders.app_checkout_enabled && EffectiveOrders.authorized?(controller, :app_checkout, order)
30
- = render partial: '/effective/orders/app_checkout/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
31
+ = render partial: '/effective/orders/app_checkout/form', locals: form_locals
31
32
 
32
33
  - if EffectiveOrders.cheque_enabled && order.user == current_user
33
- = render partial: '/effective/orders/cheque/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
34
+ = render partial: '/effective/orders/cheque/form', locals: form_locals
34
35
 
35
36
  - if EffectiveOrders.allow_pretend_purchase_in_production && Rails.env.production? && EffectiveOrders.allow_pretend_purchase_in_production_message.present?
36
37
  %br
@@ -39,8 +40,8 @@
39
40
  - if EffectiveOrders.authorized?(controller, :admin, :effective_orders) && order.user != current_user
40
41
  - if EffectiveOrders.allow_refunds && order.refund?
41
42
  .effective-order.effective-order-admin-purchase-actions
42
- = render partial: '/effective/orders/refund/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
43
+ = render partial: '/effective/orders/refund/form', locals: form_locals
43
44
  - elsif EffectiveOrders.mark_as_paid_enabled
44
45
  .effective-order.effective-order-admin-purchase-actions
45
- = render partial: '/effective/orders/mark_as_paid/form', locals: { order: order, purchased_url: purchased_url, declined_url: declined_url }
46
+ = render partial: '/effective/orders/mark_as_paid/form', locals: form_locals
46
47
 
@@ -4,7 +4,7 @@
4
4
  - if order.purchased?
5
5
  = link_to 'Resend Receipt', effective_orders.send_buyer_receipt_order_path(order), class: 'btn btn-default', data: { confirm: 'This action will email the buyer a copy of the original email receipt. Send receipt now?', disable_with: 'Resending...' }
6
6
 
7
- - elsif EffectiveOrders.authorized?(controller, :admin, :effective_orders)
7
+ - elsif EffectiveOrders.authorized?(controller, :admin, :effective_orders) && order.user != current_user
8
8
  - if order.pending?
9
9
  = link_to 'Admin: Send Payment Request', effective_orders.send_payment_request_admin_order_path(order), class: 'btn btn-default', data: { method: :post, confirm: 'This action will email buyer a payment request. Send it now?', disable_with: 'Sending...' }
10
10
  = link_to 'Admin: Delete', effective_orders.admin_order_path(order), class: 'btn btn-default', data: { method: :delete, confirm: 'Are you sure you want to delete? This cannot be undone.', disable_with: 'Deleting...' }
@@ -1,47 +1,8 @@
1
1
  = form_tag(EffectiveOrders.moneris[:hpp_url], method: :post) do
2
- = hidden_field_tag(:ps_store_id, EffectiveOrders.moneris[:ps_store_id])
3
- = hidden_field_tag(:hpp_key, EffectiveOrders.moneris[:hpp_key])
4
- = hidden_field_tag(:lang, 'en-ca')
5
- = hidden_field_tag(:rvar_authenticity_token, form_authenticity_token)
2
+ - moneris = Effective::Providers::MonerisCharge.new(order: order, purchased_url: purchased_url, declined_url: declined_url)
6
3
 
7
- - if purchased_url.present?
8
- = hidden_field_tag(:rvar_purchased_url, purchased_url)
9
-
10
- - if declined_url.present?
11
- = hidden_field_tag(:rvar_declined_url, declined_url)
12
-
13
- = hidden_field_tag(:email, order.user.try(:email))
14
- = hidden_field_tag(:cust_id, order.user.to_param)
15
-
16
- = hidden_field_tag(:order_id, [order.to_param, order.billing_name.try(:parameterize).presence, Time.zone.now.to_i].compact.join('-'))
17
- = hidden_field_tag(:gst, '%.2f' % (order.tax / 100.0))
18
- = hidden_field_tag(:charge_total, '%.2f' % (order.total / 100.0))
19
-
20
- - order.order_items.each_with_index do |item, x|
21
- = hidden_field_tag("id#{x}", x)
22
- = hidden_field_tag("description#{x}", item.title)
23
- = hidden_field_tag("quantity#{x}", item.quantity)
24
- = hidden_field_tag("price#{x}", '%.2f' % (item.price / 100.0))
25
- = hidden_field_tag("subtotal#{x}", '%.2f' % (item.subtotal / 100.0))
26
-
27
- - if order.billing_address.present?
28
- - address = order.billing_address
29
- = hidden_field_tag(:bill_first_name, address.first_name || order.try(:user).try(:first_name))
30
- = hidden_field_tag(:bill_last_name, address.last_name || order.try(:user).try(:last_name))
31
- = hidden_field_tag(:bill_address_one, address.address1)
32
- = hidden_field_tag(:bill_city, address.city)
33
- = hidden_field_tag(:bill_state_or_province, address.state)
34
- = hidden_field_tag(:bill_postal_code, address.postal_code)
35
- = hidden_field_tag(:bill_country, address.country)
36
-
37
- - if order.shipping_address.present?
38
- - address = order.shipping_address
39
- = hidden_field_tag(:ship_first_name, address.first_name || order.try(:user).try(:first_name))
40
- = hidden_field_tag(:ship_last_name, address.last_name || order.try(:user).try(:last_name))
41
- = hidden_field_tag(:ship_address_one, address.address1)
42
- = hidden_field_tag(:ship_city, address.city)
43
- = hidden_field_tag(:ship_state_or_province, address.state)
44
- = hidden_field_tag(:ship_postal_code, address.postal_code)
45
- = hidden_field_tag(:ship_country, address.country)
4
+ = hidden_field_tag :hpp_preload, ''
5
+ = hidden_field_tag :hpp_id, moneris.hpp_id
6
+ = hidden_field_tag :ticket, moneris.ticket
46
7
 
47
8
  = submit_tag order_checkout_label(:moneris), class: 'btn btn-primary', data: { disable_with: 'Continuing...' }
@@ -1,3 +1,3 @@
1
1
  module EffectiveOrders
2
- VERSION = '3.0.4'.freeze
2
+ VERSION = '3.1.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_orders
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.4
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-07 00:00:00.000000000 Z
11
+ date: 2019-08-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -167,6 +167,7 @@ files:
167
167
  - app/models/effective/order_item.rb
168
168
  - app/models/effective/product.rb
169
169
  - app/models/effective/providers/ccbill_postback.rb
170
+ - app/models/effective/providers/moneris_charge.rb
170
171
  - app/models/effective/providers/stripe_charge.rb
171
172
  - app/models/effective/subscripter.rb
172
173
  - app/models/effective/subscription.rb