angelim / spree_cielo

BSD 3-Clause "New" or "Revised" License
7 stars 10 forks source link

undefined method `purchase' for #<Spree::PaymentMethod::CieloRegularMethod:0x007f9cf7953e68> #1

Closed felipemathies closed 12 years ago

felipemathies commented 12 years ago

eae cara...primeiro parabens pela gem...estou aqui tentando colocar ele pra funcionar..e não estou conseguindo...tentei fazer um fork e alterar mas tb n tive muito sucesso...ainda não entendo muito bem como os pagamentos são processados no spree..o erro que estou tendo é esse no momento que faço o checkout e seleciono o numero de parcelas:

undefined method `purchase' for #Spree::PaymentMethod::CieloRegularMethod:0x007f9cf7953e68

alguma ideia que possa me ajudar cara??? abração...obrigado pela atenção!

angelim commented 12 years ago

Oi Felipe, o estranho é que o #process! desse método de pagamento não usa #purchase como o que acontece com o source padrão de CreditCard do Spree. O ciclo de vida desse método de pagamento é:

  1. Faz requisição server-side pra cielo, recupera uma transação e redireciona o usuário para a página de autorização. Usa o #process! para isso. Quem chama o #process é a própria order em #process_payments!
  2. A volta da requisição da cielo chama #verify
  3. Se a requisição já estiver autorizada, chama o #capture, caso contrário somente atualiza o status retornado pela Cielo.
  4. Você pode chamar #capture futuramente ou somente chamar #verify para ele verificar novamente e capturar caso o pedido permita.

A app em que eu estava usando essa gem usa Spree no branch 1-0-stable. Talvez alguma coisa tenha mudado no Spree desde então e é possível que a interface para qualquer payment precise de um #purchase agora.

Tenta descobrir quem está chamando #purchase.

felipemathies commented 12 years ago

opa cara obrigado pela resposta...

entendi...pois é tb achei estranho...dei uma olhada no código do Spree:PaymentMethod:Check que tb estende de PaymentMethod e não tem nada de purchase...vou dar uma debugada pra ver quem esta chamando esse purchase entaum...

felipemathies commented 12 years ago

opa e ae cara...ainda estou apanhando na gem aqui heheh cuida só aqui esta o trace do erro:

NoMethodError (undefined method purchase' for #<Spree::PaymentMethod::CieloRegularMethod:0x007fdde16068c0>): activemodel (3.2.7) lib/active_model/attribute_methods.rb:407:inmethod_missing' activerecord (3.2.7) lib/active_record/attribute_methods.rb:149:in method_missing' spree_core (1.1.3) app/models/spree/payment/processing.rb:128:inblock in gateway_action' spree_core (1.1.3) app/models/spree/payment/processing.rb:172:in protect_from_connection_error' spree_core (1.1.3) app/models/spree/payment/processing.rb:125:ingateway_action' spree_core (1.1.3) app/models/spree/payment/processing.rb:27:in purchase!' spree_core (1.1.3) app/models/spree/payment/processing.rb:9:inprocess!'

pra min ainda n faz muito sentido visto q não sei o fluxo do pagamento dentro do spree...uma outra coisa que achei estranho eh que na documentacao da gem fala pra selecionar Spree::Gateway::Cielo mas lá só aparece Spree::PaymentMethod::CieloRegularMethod isso é normal??

felipemathies commented 12 years ago

cara taba dando outra olhada aqui e de fato mudou bastante como é feito o processo de pagamento agora...antigamente o metodo process! do payment era assim:

def process!
  if payment_method && payment_method.source_required?
    if source
      if !processing? && source.respond_to?(:process!)
        started_processing!
        source.process!(self) # source is responsible for updating the payment state when it's done processing
      end
    else
      raise Core::GatewayError.new(I18n.t(:payment_processing_failed))
    end
  end
end

ou seja simplismente chamada o metodo process! do source(CieloRegularPayment), mas agora ele mudou para:

def process!
    if payment_method && payment_method.source_required?
      if source
        if !processing?
          if Spree::Config[:auto_capture]
            purchase!
          else
            authorize!
          end
        end
      else
        raise Core::GatewayError.new(I18n.t(:payment_processing_failed))
      end
    end
  end

ele esta dividido em 2 metodos:

def authorize!
    started_processing!
    gateway_action(source, :authorize, :pend)
  end

  def purchase!
    started_processing!
    gateway_action(source, :purchase, :complete)
  end

def gateway_action(source, action, success_state)
  protect_from_connection_error do
    check_environment

    response = payment_method.send(action, (amount * 100).round,
                                   source,
                                   gateway_options)
    handle_response(response, success_state, :failure)
  end
end

que fazem basicamente chamar o metodo referente na PaymentMethod::CieloRegularMethod e não mais na source CieloRegularPayment como antigamente, ou seja alem de mudar os metodos mudou a classe que recebe a chamanda dentro da gem...alguma ideia de como posso resolver isso??? voce tem alguma outra maneira de gente pode conversar?? gtalk, etc?? se voce poder me dar essa força fico muito agradecido...obrigado!

angelim commented 12 years ago

Te mandei um email

felipemathies commented 12 years ago

bah brigadao pela atenção cara...mas n to achando o email aqui...sera que foi para o endereço certo?? felipe.mathies@gmail.com, mais um vez obrigado! abraço!

angelim commented 12 years ago

Usa o branch spree-1-1-3