spree_mercado_pago_payment_method 0.0.2
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.
- data/app/assets/javascripts/admin/spree_mercado_pago_payment_method.js +1 -0
- data/app/assets/javascripts/store/spree_mercado_pago_payment_method.js +1 -0
- data/app/assets/stylesheets/admin/spree_mercado_pago_payment_method.css +3 -0
- data/app/assets/stylesheets/store/spree_mercado_pago_payment_method.css +3 -0
- data/app/controllers/spree/checkout_controller_decorator.rb +29 -0
- data/app/controllers/spree/mercado_pago_controller.rb +47 -0
- data/app/models/payment_method/mercado_pago.rb +33 -0
- data/app/models/spree_mercado_pago_client.rb +102 -0
- data/app/views/spree/admin/payments/source_forms/_mercadopago.html.erb +1 -0
- data/app/views/spree/admin/payments/source_views/_mercadopago.html.erb +1 -0
- data/app/views/spree/checkout/mercado_pago_error.html.erb +0 -0
- data/app/views/spree/checkout/payment/_mercadopago.html.erb +1 -0
- data/app/views/spree/mercado_pago/failure.html.erb +1 -0
- data/app/views/spree/mercado_pago/pending.html.erb +1 -0
- data/app/views/spree/mercado_pago/success.html.erb +1 -0
- data/config/locales/en.yml +13 -0
- data/config/locales/es.yml +14 -0
- data/config/routes.rb +8 -0
- data/lib/generators/spree_mercado_pago_payment_method/install/install_generator.rb +29 -0
- data/lib/spree_mercado_pago_payment_method.rb +3 -0
- data/lib/spree_mercado_pago_payment_method/engine.rb +23 -0
- data/lib/tasks/mercado_user.rake +6 -0
- data/spec/controllers/spree/checkout_controller_spec.rb +57 -0
- data/spec/controllers/spree/mercado_pago_controller_spec.rb +90 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/admin/all.js +12 -0
- data/spec/dummy/app/assets/javascripts/store/all.js +12 -0
- data/spec/dummy/app/assets/stylesheets/admin/all.css +11 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/assets/stylesheets/store/all.css +11 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +74 -0
- data/spec/dummy/config/boot.rb +6 -0
- data/spec/dummy/config/database.yml +11 -0
- data/spec/dummy/config/environment.rb +7 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/custom_user.rb +1 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/spree.rb +14 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +3 -0
- data/spec/dummy/config/spree.yml +2 -0
- data/spec/dummy/db/migrate/20121121030140_spree_zero_nine_zero.spree.rb +392 -0
- data/spec/dummy/db/migrate/20121121030141_create_indexes_for_inventory_units.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030142_add_count_on_hand_to_variants_and_products.spree.rb +50 -0
- data/spec/dummy/db/migrate/20121121030143_change_taxons_to_nested_set.spree.rb +47 -0
- data/spec/dummy/db/migrate/20121121030144_move_to_configurable_gateways.spree.rb +55 -0
- data/spec/dummy/db/migrate/20121121030145_add_open_id_authentication_tables.spree.rb +16 -0
- data/spec/dummy/db/migrate/20121121030146_add_openid_field_to_users.spree.rb +27 -0
- data/spec/dummy/db/migrate/20121121030147_change_preference_value_type.spree.rb +11 -0
- data/spec/dummy/db/migrate/20121121030148_create_billing_integrations.spree.rb +13 -0
- data/spec/dummy/db/migrate/20121121030149_charge_refactoring.spree.rb +40 -0
- data/spec/dummy/db/migrate/20121121030150_add_some_indexes.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030151_checkout_state_machine.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030152_state_for_shipments.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030153_make_state_events_polymorphic.spree.rb +13 -0
- data/spec/dummy/db/migrate/20121121030154_ship_address_id_for_checkouts.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030155_shipping_method_id_for_checkouts.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030156_creditcard_last_four_digits.spree.rb +15 -0
- data/spec/dummy/db/migrate/20121121030157_populate_legacy_shipment_state.spree.rb +16 -0
- data/spec/dummy/db/migrate/20121121030158_add_cost_price.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030159_shipment_id_for_inventory_units.spree.rb +26 -0
- data/spec/dummy/db/migrate/20121121030160_cim_fields_for_creditcards.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030161_create_return_authorizations.spree.rb +13 -0
- data/spec/dummy/db/migrate/20121121030162_add_return_authorization_to_inventory_units.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030163_create_trackers.spree.rb +11 -0
- data/spec/dummy/db/migrate/20121121030164_creditcard_id_for_creditcard_txns.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030165_original_creditcard_txn_id_for_creditcard_txns.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030166_add_test_mode_to_billing_integration.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030167_create_payment_methods.spree.rb +17 -0
- data/spec/dummy/db/migrate/20121121030168_polymorphic_payments.spree.rb +43 -0
- data/spec/dummy/db/migrate/20121121030169_change_payments_payment_method_to_belongs_to.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030170_assign_creditcard_txns_to_payment.spree.rb +24 -0
- data/spec/dummy/db/migrate/20121121030171_sti_for_transactions.spree.rb +16 -0
- data/spec/dummy/db/migrate/20121121030172_drop_billing_integrations.spree.rb +17 -0
- data/spec/dummy/db/migrate/20121121030173_deleted_at_for_payment_methods.spree.rb +15 -0
- data/spec/dummy/db/migrate/20121121030174_add_adjustments_index.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030175_add_alt_text_to_images.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030176_fix_existing_coupon_credits.spree.rb +14 -0
- data/spec/dummy/db/migrate/20121121030177_add_display_to_payment_methods.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030178_add_addresses_checkouts_indexes.spree.rb +9 -0
- data/spec/dummy/db/migrate/20121121030179_add_icon_to_taxons.spree.rb +18 -0
- data/spec/dummy/db/migrate/20121121030180_add_description_to_taxons.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030181_index_for_shipments_number.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030182_add_index_on_users_persistence_token.spree.rb +8 -0
- data/spec/dummy/db/migrate/20121121030183_add_default_to_tax_categories.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030184_add_display_to_shipping_methods.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030185_rename_payment_method_display.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030186_rename_preferences_field.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030187_add_guest_flag.spree.rb +8 -0
- data/spec/dummy/db/migrate/20121121030188_drop_order_token.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030189_payments_state_and_assigned_to_order_only.spree.rb +15 -0
- data/spec/dummy/db/migrate/20121121030190_create_address_keys_for_order.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030191_payment_total_for_orders.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030192_shipping_method_id_for_orders.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030193_add_shipment_and_payment_state.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030194_refactor_adjustments.spree.rb +30 -0
- data/spec/dummy/db/migrate/20121121030195_response_code_and_avs_response_for_payments.spree.rb +7 -0
- data/spec/dummy/db/migrate/20121121030196_change_guest_flag_to_anonymous.spree.rb +8 -0
- data/spec/dummy/db/migrate/20121121030197_email_for_orders.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030198_create_mail_methods.spree.rb +11 -0
- data/spec/dummy/db/migrate/20121121030199_rename_frozen_to_locked.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030200_move_special_instructions_to_orders.spree.rb +11 -0
- data/spec/dummy/db/migrate/20121121030201_create_log_entries.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030202_migrate_transactions_to_payment_state.spree.rb +99 -0
- data/spec/dummy/db/migrate/20121121030203_delete_in_progress_orders.spree.rb +20 -0
- data/spec/dummy/db/migrate/20121121030204_migrate_checkout_to_orders.spree.rb +24 -0
- data/spec/dummy/db/migrate/20121121030205_remove_shipped_state.spree.rb +13 -0
- data/spec/dummy/db/migrate/20121121030206_prevent_nil_payment_total.spree.rb +9 -0
- data/spec/dummy/db/migrate/20121121030207_prevent_nil_email.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030208_generate_anonymous_users.spree.rb +21 -0
- data/spec/dummy/db/migrate/20121121030209_update_order_state.spree.rb +13 -0
- data/spec/dummy/db/migrate/20121121030210_cleanup_legacy_tables.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030211_remove_number_and_cvv_from_credicard.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030212_drop_anonymous_field_for_user.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030213_renamed_rma_cancelled_state.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030214_fix_problematic_index_names.spree.rb +14 -0
- data/spec/dummy/db/migrate/20121121030215_add_position_to_variants.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030216_add_next_state_to_state_events.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030217_add_position_to_option_types.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030218_remove_trailing_slashes_in_taxon_permalinks.spree.rb +20 -0
- data/spec/dummy/db/migrate/20121121030219_create_activators.spree.rb +15 -0
- data/spec/dummy/db/migrate/20121121030220_eligible_for_adjustments.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030221_namespace_top_level_models.spree.rb +67 -0
- data/spec/dummy/db/migrate/20121121030222_migrate_namespaced_polymorphic_models.spree.rb +53 -0
- data/spec/dummy/db/migrate/20121121030223_make_adjustments_polymorphic.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030224_add_company_to_addresses.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030225_add_inc_tax_to_tax_rates.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030226_rename_inc_price_attribute.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030227_add_default_tax_zone.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030228_associate_shipping_methods_and_shipping_categories.spree.rb +8 -0
- data/spec/dummy/db/migrate/20121121030229_add_match_rules_to_shipping_methods.spree.rb +8 -0
- data/spec/dummy/db/migrate/20121121030230_new_preferences.spree.rb +49 -0
- data/spec/dummy/db/migrate/20121121030231_rename_state_events_to_state_changes.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030232_add_deleted_at_to_tax_category.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030233_migrate_images_from_products_to_variants.spree.rb +38 -0
- data/spec/dummy/db/migrate/20121121030234_rename_attachment_size_to_attachment_file_size.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030235_increase_scale_of_tax_rate_amount.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030236_create_tokenized_permissions_table.spree.rb +17 -0
- data/spec/dummy/db/migrate/20121121030237_convert_sales_tax_to_default_tax.spree.rb +10 -0
- data/spec/dummy/db/migrate/20121121030238_rename_creditcards_to_credit_cards.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030239_add_deleted_at_to_spree_shipping_methods.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030240_remove_credit_total_from_orders.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030241_add_counter_cache_to_zone_members.spree.rb +15 -0
- data/spec/dummy/db/migrate/20121121030242_add_tax_rate_label.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030243_add_toggle_tax_rate_display.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030244_add_lock_version_to_variant.spree.rb +6 -0
- data/spec/dummy/db/migrate/20121121030245_remove_not_null_constraint_from_products_on_hand.spree.rb +12 -0
- data/spec/dummy/db/migrate/20121121030246_create_users.spree_auth.rb +30 -0
- data/spec/dummy/db/migrate/20121121030247_rename_columns_for_devise.spree_auth.rb +38 -0
- data/spec/dummy/db/migrate/20121121030248_convert_user_remember_field.spree_auth.rb +12 -0
- data/spec/dummy/db/migrate/20121121030249_add_reset_password_sent_at_to_spree_users.spree_auth.rb +9 -0
- data/spec/dummy/db/migrate/20121121030250_make_users_email_index_unique.spree_auth.rb +10 -0
- data/spec/dummy/db/schema.rb +548 -0
- data/spec/dummy/db/seeds.rb +11 -0
- data/spec/dummy/db/spree_development.sqlite3 +0 -0
- data/spec/dummy/db/spree_test.sqlite3 +0 -0
- data/spec/dummy/log/development.log +1439 -0
- data/spec/dummy/log/test.log +37662 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/fixtures/authenticated.json +7 -0
- data/spec/fixtures/preferences_created.json +41 -0
- data/spec/models/spree_mercado_pago_client_spec.rb +131 -0
- data/spec/spec_helper.rb +95 -0
- metadata +524 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require admin/spree_core
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//= require store/spree_core
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
Spree::CheckoutController.class_eval do
|
|
3
|
+
before_filter :redirect_to_mercado_pago_if_needed, :only => [:update]
|
|
4
|
+
|
|
5
|
+
def redirect_to_mercado_pago_if_needed
|
|
6
|
+
return unless params[:state] == "payment"
|
|
7
|
+
|
|
8
|
+
selected_method_id = params[:order][:payments_attributes].first[:payment_method_id]
|
|
9
|
+
@payment_method = Spree::PaymentMethod.find(selected_method_id)
|
|
10
|
+
|
|
11
|
+
if @payment_method && @payment_method.kind_of?(PaymentMethod::MercadoPago)
|
|
12
|
+
@order.update_attributes(object_params)
|
|
13
|
+
|
|
14
|
+
back_urls = {
|
|
15
|
+
success: spree.mercado_pago_success_url(order_number: @order.number),
|
|
16
|
+
pending: spree.mercado_pago_pending_url(order_number: @order.number),
|
|
17
|
+
failure: spree.mercado_pago_failure_url(order_number: @order.number)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
m = SpreeMercadoPagoClient.new(@order, back_urls)
|
|
21
|
+
|
|
22
|
+
if m.authenticate && m.send_data
|
|
23
|
+
redirect_to m.redirect_url
|
|
24
|
+
else
|
|
25
|
+
render :action => :mercado_pago_error
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
require 'rest_client'
|
|
3
|
+
|
|
4
|
+
module Spree
|
|
5
|
+
class MercadoPagoController < Spree::BaseController
|
|
6
|
+
before_filter :get_order
|
|
7
|
+
|
|
8
|
+
def success
|
|
9
|
+
advance_state
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def pending
|
|
13
|
+
advance_state
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def failure
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
def correct_order_state
|
|
21
|
+
(@order.state == 'payment' || @order.state == 'complete') &&
|
|
22
|
+
@order.payment_method &&
|
|
23
|
+
(@order.payment_method.type == "PaymentMethod::MercadoPago")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def advance_state
|
|
27
|
+
@order.update_attributes( { :state => "complete", :completed_at => Time.now },
|
|
28
|
+
:without_protection => true)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def get_order
|
|
32
|
+
user = spree_current_user
|
|
33
|
+
order_no = params[:order_number]
|
|
34
|
+
@order = Order.where(number: order_no).where(user_id: user.id).first
|
|
35
|
+
|
|
36
|
+
unless @order && correct_order_state
|
|
37
|
+
if @order.present?
|
|
38
|
+
redirect_to checkout_state_path(@order.state)
|
|
39
|
+
else
|
|
40
|
+
flash[:error] = I18n.t(:mp_invalid_order)
|
|
41
|
+
redirect_to root_path
|
|
42
|
+
end
|
|
43
|
+
return
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
class PaymentMethod::MercadoPago < Spree::PaymentMethod
|
|
3
|
+
attr_accessible :preferred_client_id, :preferred_client_secret
|
|
4
|
+
|
|
5
|
+
preference :client_id, :integer
|
|
6
|
+
preference :client_secret, :string
|
|
7
|
+
|
|
8
|
+
def payment_profiles_supported?
|
|
9
|
+
false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def actions
|
|
13
|
+
%w{capture void}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Indicates whether its possible to capture the payment
|
|
17
|
+
def can_capture?(payment)
|
|
18
|
+
['checkout', 'pending'].include?(payment.state)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Indicates whether its possible to void the payment.
|
|
22
|
+
def can_void?(payment)
|
|
23
|
+
payment.state != 'void'
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def capture(*args)
|
|
27
|
+
ActiveMerchant::Billing::Response.new(true, "", {}, {})
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def void(*args)
|
|
31
|
+
ActiveMerchant::Billing::Response.new(true, "", {}, {})
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
require 'rest_client'
|
|
3
|
+
|
|
4
|
+
class SpreeMercadoPagoClient
|
|
5
|
+
# These three includes are because of the user of line_item_description from
|
|
6
|
+
# ProductsHelper
|
|
7
|
+
include ActionView::Helpers::TextHelper
|
|
8
|
+
include ActionView::Helpers::SanitizeHelper
|
|
9
|
+
include Spree::ProductsHelper
|
|
10
|
+
|
|
11
|
+
attr_reader :errors
|
|
12
|
+
attr_reader :auth_response
|
|
13
|
+
attr_reader :preferences_response
|
|
14
|
+
|
|
15
|
+
def initialize(order, callbacks)
|
|
16
|
+
unless callbacks[:success] && callbacks[:pending] && callbacks[:failure]
|
|
17
|
+
raise "Url callbacks where not specified"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@order = order
|
|
21
|
+
@callbacks = callbacks
|
|
22
|
+
@errors = []
|
|
23
|
+
config_options
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def authenticate
|
|
27
|
+
response = send_authentication_request
|
|
28
|
+
|
|
29
|
+
if response.code != 200
|
|
30
|
+
@auth_response = nil
|
|
31
|
+
@errors << I18n.t(:mp_authentication_error)
|
|
32
|
+
else
|
|
33
|
+
@errors = []
|
|
34
|
+
@auth_response = ActiveSupport::JSON.decode(response)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
@auth_response
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def send_data
|
|
41
|
+
response = send_preferences_request
|
|
42
|
+
|
|
43
|
+
if response.code != 201
|
|
44
|
+
@preferences_response = nil
|
|
45
|
+
@errors << I18n.t(:mp_preferences_setup_error)
|
|
46
|
+
else
|
|
47
|
+
@errors = []
|
|
48
|
+
@preferences_response = ActiveSupport::JSON.decode(response)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
@preferences_response
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def redirect_url
|
|
55
|
+
@preferences_response["init_point"] if @preferences_response.present?
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
def send_authentication_request
|
|
60
|
+
client_id = @order.payment_method.preferred_client_id
|
|
61
|
+
client_secret = @order.payment_method.preferred_client_secret
|
|
62
|
+
|
|
63
|
+
response = RestClient.post(
|
|
64
|
+
'https://api.mercadolibre.com/oauth/token',
|
|
65
|
+
{:grant_type => 'client_credentials', :client_id => client_id, :client_secret => client_secret},
|
|
66
|
+
:content_type=> "application/x-www-form-urlencoded", :accept => 'application/json'
|
|
67
|
+
)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def send_preferences_request
|
|
71
|
+
RestClient.post(
|
|
72
|
+
mp_preferences_url(@auth_response["access_token"]),
|
|
73
|
+
@options.to_json,
|
|
74
|
+
:content_type=> 'application/json', :accept => 'application/json'
|
|
75
|
+
)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def mp_preferences_url(token)
|
|
79
|
+
"https://api.mercadolibre.com/checkout/preferences?access_token=#{token}"
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def config_options
|
|
83
|
+
@options = Hash.new
|
|
84
|
+
@options[:external_reference] = @order.number
|
|
85
|
+
@options[:back_urls] = {
|
|
86
|
+
:success => @callbacks[:success],
|
|
87
|
+
:pending => @callbacks[:pending],
|
|
88
|
+
:failure => @callbacks[:failure]
|
|
89
|
+
}
|
|
90
|
+
@options[:items] = Array.new
|
|
91
|
+
|
|
92
|
+
@order.line_items.each do |li|
|
|
93
|
+
h = {
|
|
94
|
+
:title => line_item_description(li.variant),
|
|
95
|
+
:unit_price => li.price.to_f,
|
|
96
|
+
:quantity => li.quantity,
|
|
97
|
+
:currency_id => "ARS"
|
|
98
|
+
}
|
|
99
|
+
@options[:items] << h
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- Source form -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<!-- Source view -->
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<img src="http://imgmp.mlstatic.com/org-img/banners/ar/medios/575X40.jpg" title="MercadoPago - Medios de pago" alt="MercadoPago - Medios de pago" width="575" height="40"/>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= simple_format(I18n.t(:mp_payment_failure)) %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= simple_format(I18n.t(:mp_payment_pending)) %>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<%= simple_format(I18n.t(:mp_payment_success)) %>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
en:
|
|
2
|
+
mp_authentication_error: "It was not possible to authenticate with Mercado Pago"
|
|
3
|
+
mp_preferences_setup_error: "Couldn't send order preferences to Mercado Pago"
|
|
4
|
+
mp_payment_success:
|
|
5
|
+
Your payent with Mercado Pago was successful.
|
|
6
|
+
|
|
7
|
+
Please take into account that this payment may take some hours to reflect
|
|
8
|
+
on this site.
|
|
9
|
+
mp_payment_failure: "Your payment could not be processed by Mercado Pago"
|
|
10
|
+
mp_payment_pending:
|
|
11
|
+
Your order has been placed but your payment is still pending we will ship
|
|
12
|
+
your order and contact you as soon as the payment is processed"
|
|
13
|
+
mp_invalid_order: "The specified order is invalid"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
es:
|
|
2
|
+
mp_authentication_error: "Hubo un error al realizar la autenticación con Mercado Pago"
|
|
3
|
+
mp_preferences_setup_error: "Hubo un error al enviar sus pedido a Mercado Pago"
|
|
4
|
+
mp_payment_success:
|
|
5
|
+
Su pago con Mercado Pago se ha efectuado con éxito.
|
|
6
|
+
|
|
7
|
+
Por favor tenga en cuenta que el estado de su pago puede tardar
|
|
8
|
+
algunas horas en reflejarse en este sitio.
|
|
9
|
+
mp_payment_failure: "Su pago no pudo ser procesado por Mercado Pago"
|
|
10
|
+
mp_payment_pending:
|
|
11
|
+
Su orden fue procesada con éxito aunque su pago aún se encuentra pendiente.
|
|
12
|
+
|
|
13
|
+
En cuanto su pago se concrete su pedido será finalizado.
|
|
14
|
+
mp_invalid_order: "La órden especificada es inválida"
|
data/config/routes.rb
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module SpreeMercadoPagoPaymentMethod
|
|
2
|
+
module Generators
|
|
3
|
+
class InstallGenerator < Rails::Generators::Base
|
|
4
|
+
|
|
5
|
+
def add_javascripts
|
|
6
|
+
append_file 'app/assets/javascripts/store/all.js', "//= require store/spree_mercado_pago_payment_method\n"
|
|
7
|
+
append_file 'app/assets/javascripts/admin/all.js', "//= require admin/spree_mercado_pago_payment_method\n"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def add_stylesheets
|
|
11
|
+
inject_into_file 'app/assets/stylesheets/store/all.css', " *= require store/spree_mercado_pago_payment_method\n", :before => /\*\//, :verbose => true
|
|
12
|
+
inject_into_file 'app/assets/stylesheets/admin/all.css', " *= require admin/spree_mercado_pago_payment_method\n", :before => /\*\//, :verbose => true
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def add_migrations
|
|
16
|
+
run 'bundle exec rake railties:install:migrations FROM=spree_mercado_pago_payment_method'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def run_migrations
|
|
20
|
+
res = ask 'Would you like to run the migrations now? [Y/n]'
|
|
21
|
+
if res == '' || res.downcase == 'y'
|
|
22
|
+
run 'bundle exec rake db:migrate'
|
|
23
|
+
else
|
|
24
|
+
puts 'Skipping rake db:migrate, don\'t forget to run it!'
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
require 'spree_core'
|
|
3
|
+
|
|
4
|
+
module SpreeMercadoPagoPaymentMethod
|
|
5
|
+
class Engine < Rails::Engine
|
|
6
|
+
|
|
7
|
+
def self.activate
|
|
8
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../app/**/*_decorator*.rb")) do |c|
|
|
9
|
+
Rails.application.config.cache_classes ? require(c) : load(c)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../app/overrides/*.rb")) do |c|
|
|
13
|
+
Rails.application.config.cache_classes ? require(c) : load(c)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
initializer "spree_payment_network.register.payment_methods" do |app|
|
|
18
|
+
app.config.spree.payment_methods += [PaymentMethod::MercadoPago]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
config.to_prepare &method(:activate).to_proc
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
describe Spree::CheckoutController do
|
|
4
|
+
|
|
5
|
+
let(:order) do
|
|
6
|
+
mock_model(
|
|
7
|
+
Spree::Order,
|
|
8
|
+
:checkout_allowed? => true,
|
|
9
|
+
:user => nil,
|
|
10
|
+
:email => nil,
|
|
11
|
+
:completed? => false,
|
|
12
|
+
:update_attributes => true,
|
|
13
|
+
:payment? => false,
|
|
14
|
+
:insufficient_stock_lines => [],
|
|
15
|
+
:coupon_code => nil
|
|
16
|
+
).as_null_object
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
before(:each) do
|
|
20
|
+
user = double("User", :last_incomplete_spree_order => nil)
|
|
21
|
+
order.stub(:user => user)
|
|
22
|
+
controller.stub :current_order => order
|
|
23
|
+
controller.stub(:spree_current_user => user)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
context "Using Mercado Pago payment method" do
|
|
27
|
+
let(:order_attributes) { { payments_attributes: [{payment_method_id: "fake_id"}] } }
|
|
28
|
+
|
|
29
|
+
before(:each) do
|
|
30
|
+
payment_method = double("PaymentMethod::MercadoPago")
|
|
31
|
+
payment_method.should_receive(:kind_of?).with(PaymentMethod::MercadoPago) { true }
|
|
32
|
+
Spree::PaymentMethod.should_receive(:find) { payment_method }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "redirects to m.redirect_url on success" do
|
|
36
|
+
client = double("client")
|
|
37
|
+
client.should_receive(:authenticate) { true }
|
|
38
|
+
client.should_receive(:send_data) { true }
|
|
39
|
+
client.should_receive(:redirect_url) { "http://www.example.com" }
|
|
40
|
+
SpreeMercadoPagoClient.should_receive(:new) { client }
|
|
41
|
+
|
|
42
|
+
spree_post :update, {state: "payment", order: order_attributes }
|
|
43
|
+
response.should redirect_to("http://www.example.com")
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "renders mercado_pago_error.html.erb on error" do
|
|
47
|
+
client = double("client")
|
|
48
|
+
client.should_receive(:authenticate) { false }
|
|
49
|
+
client.stub(:send_data) { true }
|
|
50
|
+
client.stub(:redirect_url) { "http://www.example.com" }
|
|
51
|
+
SpreeMercadoPagoClient.should_receive(:new) { client }
|
|
52
|
+
|
|
53
|
+
spree_post :update, {state: "payment", order: order_attributes }
|
|
54
|
+
response.should render_template("mercado_pago_error")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# -*- encoding : utf-8 -*-
|
|
2
|
+
require 'spec_helper'
|
|
3
|
+
|
|
4
|
+
describe Spree::MercadoPagoController do
|
|
5
|
+
it "doesn't affect current order if there is one (session[:order_id])"
|
|
6
|
+
|
|
7
|
+
context "Logged out user" do
|
|
8
|
+
it "redirects to login and back again"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
context "Logged in user" do
|
|
12
|
+
let(:user) { create(:user) }
|
|
13
|
+
let(:payment_method) { create(:payment_method, type: "PaymentMethod::MercadoPago") }
|
|
14
|
+
let(:order) do
|
|
15
|
+
order = create(:order, user: user, state: "payment")
|
|
16
|
+
create(:payment, payment_method: payment_method, order: order)
|
|
17
|
+
order
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
before { controller.stub(:spree_current_user => user) }
|
|
21
|
+
before do
|
|
22
|
+
order.payment.should_not be_nil
|
|
23
|
+
order.payment_method.should_not be_nil
|
|
24
|
+
order.payment_method.type.should eq("PaymentMethod::MercadoPago")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "#success" do
|
|
28
|
+
context "with valid order" do
|
|
29
|
+
before do
|
|
30
|
+
spree_get :success, { order_number: order.number }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
it { response.should be_success }
|
|
34
|
+
it { assigns(:order).should_not be_nil }
|
|
35
|
+
it { assigns(:order).state.should eq("complete") }
|
|
36
|
+
it { assigns(:order).id.should eq(order.id)}
|
|
37
|
+
it { assigns(:order).payment.state.should eq("pending") }
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
context "with invalid order" do
|
|
41
|
+
before { spree_get :success }
|
|
42
|
+
|
|
43
|
+
it { response.should redirect_to(spree.root_path) }
|
|
44
|
+
it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
describe "#pending" do
|
|
49
|
+
context "with valid order" do
|
|
50
|
+
before do
|
|
51
|
+
spree_get :pending, { order_number: order.number }
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it { response.should be_success }
|
|
55
|
+
it { assigns(:order).should_not be_nil }
|
|
56
|
+
it { assigns(:order).state.should eq("complete") }
|
|
57
|
+
it { assigns(:order).id.should eq(order.id)}
|
|
58
|
+
it { assigns(:order).payment.state.should eq("pending") }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
context "with invalid order" do
|
|
62
|
+
before { spree_get :pending }
|
|
63
|
+
|
|
64
|
+
it { response.should redirect_to(spree.root_path) }
|
|
65
|
+
it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
describe "#failure" do
|
|
70
|
+
context "with valid order" do
|
|
71
|
+
before do
|
|
72
|
+
spree_get :failure, { order_number: order.number }
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
it { response.should be_success }
|
|
76
|
+
it { assigns(:order).should_not be_nil }
|
|
77
|
+
it { assigns(:order).state.should eq("payment") }
|
|
78
|
+
it { assigns(:order).id.should eq(order.id)}
|
|
79
|
+
it { assigns(:order).payment.state.should eq("pending") }
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
context "with invalid order" do
|
|
83
|
+
before { spree_get :failure }
|
|
84
|
+
|
|
85
|
+
it { response.should redirect_to(spree.root_path) }
|
|
86
|
+
it { flash[:error].should eq(I18n.t(:mp_invalid_order)) }
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end
|