spree_mercado_pago_payment_method 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|