Skip to content

Instantly share code, notes, and snippets.

@diegok
Created January 8, 2012 19:34
Show Gist options
  • Save diegok/1579406 to your computer and use it in GitHub Desktop.
Save diegok/1579406 to your computer and use it in GitHub Desktop.
Small ruby object to interact with MercadoPago API
class MercadoPago
require 'rubygems'
require 'json/add/core'
require 'uri'
require 'net/https'
attr_accessor :client, :secret, :currency
def initialize(options={})
@client = options[:client_id]
@secret = options[:secret]
end
def token
@token or get_token
end
def get_token(url='https://api.mercadolibre.com/oauth/token')
data = post_request URI.parse(url),
:grant_type => 'client_credentials',
:client_id => @client,
:client_secret => @secret
return @token = data['access_token']
end
# prepare checkout and returns reference to it
# Accept config as: http://developers.mercadopago.com/ar/api-checkout
# :external_reference => Referencia para uso propio del vendedor Opcional
#
# :items => [
# :id => Código Opcional
# :title => Título. Será mostrado en el proceso de pago. Obligatoria
# :description => Descripción Opcional
# :quantity => Cantidad Obligatoria
# :unit_price => Precio unitario Obligatoria
# :currency_id => Tipo de moneda. Ver API de Currencies Obligatoria
# :picture_url => URL de la imagen Opcional
# ],
#
# :payer => {
# :name => Nombre del comprador
# :surname Apellido del comprador
# :email E-mail del comprador Opcional
# },
#
# :back_urls => { # URLs de retorno al sitio del vendedor:
# :success => URL de pago acreditado
# :pending => URL de pago pendiente Opcional
# },
#
# :payment_methods => { # Configuración de medios de pago a excluír en el proceso de pago:
# :excluded_payment_methods => Listado de medios de pagos a excluír:
# :excluded_payment_types => Listado de medios de pagos a excluír:
# :installments => Cantidad máxima de cuotas que deseas. aceptar con tarjeta de crédito Opcional
# },
def create_cart(cart=nil, url='https://api.mercadolibre.com/checkout/preferences')
raise "Need cart data!" unless cart;
data = post_request URI.parse("#{url}?access_token=#{token}"),
:payload => cart.to_json
end
def get_notification(id=nil)
raise "Need notification ID" unless id
uri = URI.parse("https://api.mercadolibre.com/collections/notifications/#{id}?access_token=#{token}")
req = Net::HTTP::Get.new(uri.request_uri)
req['Accept'] = 'application/json'
case res = build_agent(uri).request(req)
when Net::HTTPSuccess
return @last_response = JSON.parse(res.body)
else
raise res.error!
end
end
private
def post_request(uri, data={})
req = Net::HTTP::Post.new(uri.request_uri)
req['Accept'] = 'application/json'
if req.body = data.delete(:payload)
req['Content-Type'] = 'application/json'
end
req.set_form_data(data) if data.size > 0
case res = build_agent(uri).request(req)
when Net::HTTPSuccess
return @last_response = JSON.parse(res.body)
else
raise res.error!
end
end
def build_agent(uri)
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = uri.scheme == 'https'
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
http
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment