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