require 'xml' require 'base64' class MoipTransparente::Checkout def javascript_tag "" end def widget_tag(success, fail) "
" end def get_token(invoice) doc = XML::Document.new doc.root = XML::Node.new('EnviarInstrucao') unica = XML::Node.new('InstrucaoUnica') unica['TipoValidacao'] = 'Transparente' description = XML::Node.new('Razao') description << invoice[:razao] unica << description id_invoice = XML::Node.new('IdProprio') id_invoice << invoice[:id] unica << id_invoice valores = XML::Node.new('Valores') valor = XML::Node.new('Valor') valor['moeda'] = 'BRL' valor << invoice[:total] valores << valor valor = XML::Node.new('Acrescimo') valor['moeda'] = 'BRL' valores << invoice[:acrescimo] || '0.00' valor = XML::Node.new('Deducao') valor['moeda'] = 'BRL' valores << invoice[:desconto] || '0.00' unica << valores pagador = XML::Node.new('Pagador') nome = XML::Node.new('Nome') nome << invoice[:cliente][:nome] pagador << nome email = XML::Node.new('Email') email << invoice[:cliente][:email] pagador << email id = XML::Node.new('IdPagador') id << invoice[:cliente][:id] pagador << id endereco = XML::Node.new('EnderecoCobranca') logradouro = XML::Node.new('Logradouro') logradouro << invoice[:cliente][:logradouro] endereco << logradouro numero = XML::Node.new('Numero') numero_or_default = invoice[:cliente][:numero] || '0' numero << numero_or_default endereco << numero complemento = XML::Node.new('Complemento') complemento << invoice[:cliente][:complemento] endereco << complemento bairro = XML::Node.new('Bairro') bairro << invoice[:cliente][:bairro] endereco << bairro cidade = XML::Node.new('Cidade') cidade << invoice[:cliente][:cidade] endereco << cidade estado = XML::Node.new('Estado') estado << invoice[:cliente][:uf] endereco << estado pais = XML::Node.new('Pais') pais_or_default = invoice[:cliente][:pais] || 'BRA' pais << pais_or_default endereco << pais cep = XML::Node.new('CEP') cep << invoice[:cliente][:cep] endereco << cep telefone = XML::Node.new('TelefoneFixo') telefone << invoice[:cliente][:telefone] endereco << telefone pagador << endereco unica << pagador if invoice[:parcelamentos] parcelamentos = XML::Node.new('Parcelamentos') invoice[:parcelamentos].each do |parcelamento_item| parcelamento = XML::Node.new('Parcelamento') minimo = XML::Node.new('MinimoParcelas') minimo << parcelamento_item[:minimo] parcelamento << minimo maximo = XML::Node.new('MaximoParcelas') maximo << parcelamento_item[:maximo] parcelamento << maximo if parcelamento_item[:repassar] repassar = XML::Node.new('Repassar') repassar << '1' parcelamento << repassar else juros = XML::Node.new('Juros') juros << parcelamento_item[:juros] parcelamento << juros end parcelamentos << parcelamento end unica << parcelamentos end comissoes = XML::Node.new('Comissoes') if invoice[:comissoes] invoice[:comissoes].each do |comissao_item| comissionamento = XML::Node.new('Comissionamento') razao = XML::Node.new('Razao') razao << comissao_item[:razao] || invoice[:razao] comissionamento << razao comissionado = XML::Node.new("Comissionado") login_moip = XML::Node.new("LoginMoIP") login_moip << comissao_item[:login_moip] comissionado << login_moip comissionamento << comissionado valor = XML::Node.new("ValorFixo") valor << comissao_item[:valor] comissionamento << valor comissoes << comissionamento end end if invoice[:pagador_taxas] taxas = XML::Node.new('PagadorTaxa') login_moip = XML::Node.new("LoginMoIP") login_moip << invoice[:pagador_taxas] taxas << login_moip comissoes << taxas end unica << comissoes doc.root << unica begin response = post_data(doc.to_s(:encoding => XML::Encoding::ISO_8859_1)) parser = XML::Parser.string(response) dom = parser.parse rescue LibXML::XML::Error => e puts response.inspect puts parser.inspect Rails.logger.info response.inspect Rails.logger.info parser.inspect end resposta = dom.find('./Resposta').first if resposta.find('Status')[0].content == 'Sucesso' @token = resposta.find('Token')[0].content return {:status => :ok, :token => resposta.find('Token')[0].content, :id => resposta.find('ID')[0].content} elsif resposta.find('Status')[0].content == 'Falha' return {:status => :fail, :code => resposta.find('Erro')[0]['Codigo'], :message => resposta.find('Erro')[0].content, :id => resposta.find('ID')[0].content } end end def get_token_url if ::MoipTransparente::Config.test? return "https://desenvolvedor.moip.com.br/sandbox/ws/alpha/EnviarInstrucao/Unica" else return "https://www.moip.com.br/ws/alpha/EnviarInstrucao/Unica" end end def get_javascript_url if ::MoipTransparente::Config.test? return "https://desenvolvedor.moip.com.br/sandbox/transparente/MoipWidget-v2.js" else return "https://www.moip.com.br/transparente/MoipWidget-v2.js" end end def post_data(xml) uri = URI.parse(get_token_url) http = Net::HTTP.new(uri.host, uri.port) http.use_ssl = true http.verify_mode = OpenSSL::SSL::VERIFY_NONE #http.set_debug_output $stderr if Moip::Config.test? request = Net::HTTP::Post.new(uri.path) request.basic_auth ::MoipTransparente::Config.access_token, ::MoipTransparente::Config.access_key request.body = xml response = http.start {|r| r.request request } response.body end end