effective_orders 3.0.4 → 3.1.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.
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