Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit cf18c5d

Browse files
committed
moip checkout
1 parent 2520326 commit cf18c5d

File tree

7 files changed

+260
-6
lines changed

7 files changed

+260
-6
lines changed

Gemfile.lock

+1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ PATH
2525
remote: .
2626
specs:
2727
catarse_moip (0.1.1)
28+
libxml-ruby (~> 2.3.3)
2829
rails (~> 3.2.6)
2930

3031
PATH

app/assets/javascripts/catarse_moip/review.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ var reviewRequest = {
1818
});
1919

2020
$.post('/payment/moip/'+backer_id+'/get_moip_token', function(response){
21-
console.log(response);
21+
$('#footer').prepend(response.widget_tag)
2222
});
2323

2424
} else {

app/controllers/catarse_moip/payment/moip_controller.rb

+5-5
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@ def review
99
def get_moip_token
1010
@backer = current_user.backs.not_confirmed.find params[:id]
1111

12-
::Moip::Config.access_token = ::Configuration[:moip_token]
13-
::Moip::Config.access_key = ::Configuration[:moip_key]
12+
CatarseMoip::Checkout::Config.access_token = ::Configuration[:moip_token]
13+
CatarseMoip::Checkout::Config.access_key = ::Configuration[:moip_key]
1414

15-
@moip = ::Moip::Checkout.new
15+
@moip = CatarseMoip::Checkout::Checkout.new
1616

1717
invoice = {
1818
razao: "Apoio para o projeto '#{@backer.project.name}'",
@@ -24,7 +24,7 @@ def get_moip_token
2424
id: @backer.user.id,
2525
nome: @backer.payer_name,
2626
email: @backer.payer_email,
27-
logradouro: "#{@backer.address_street}, #{@backer.payer_address_number}",
27+
logradouro: "#{@backer.address_street}, #{@backer.address_number}",
2828
complemento: @backer.address_complement,
2929
bairro: @backer.address_neighbourhood,
3030
cidade: @backer.address_city,
@@ -36,7 +36,7 @@ def get_moip_token
3636

3737
@moip.get_token(invoice)
3838

39-
render json: { moip: @moip }
39+
render json: { moip: @moip, widget_tag: @moip.widget_tag('checkoutSuccessful', 'checkoutFailure'), javascript_tag: @moip.javascript_tag }
4040
end
4141

4242
def pay

app/views/catarse_moip/payment/moip/review.html.slim

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
= label_tag 'user_document', t('projects.backers.review.form.labels.document')
55
= text_field_tag 'user_document', nil, { autocomplete: 'off' }
66

7+
= javascript_include_tag 'https://www.moip.com.br/transparente/MoipWidget-v2.js'
8+
79
/= form.inputs do
810
/= form.input :cpf, :as => :string, :input_html => {:autocomplete => 'off'}
911
/.list_payment

lib/catarse_moip.rb

+2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
require "catarse_moip/engine"
2+
require "catarse_moip/checkout/config"
3+
require "catarse_moip/checkout/checkout"
24
#require "moip"
35

46
module CatarseMoip

lib/catarse_moip/checkout/checkout.rb

+220
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,220 @@
1+
require 'net/https'
2+
require 'uri'
3+
require 'xml'
4+
require 'base64'
5+
6+
module CatarseMoip
7+
module Checkout
8+
class Checkout
9+
10+
def javascript_tag
11+
"<script type='text/javascript' src='#{get_javascript_url}' charset='ISO-8859-1'></script>"
12+
end
13+
14+
def widget_tag(success, fail)
15+
"<div id='MoipWidget'
16+
data-token='#{@token}'
17+
callback-method-success='#{success}'
18+
callback-method-error='#{fail}'>
19+
</div>"
20+
end
21+
22+
def get_token(invoice)
23+
doc = XML::Document.new
24+
doc.root = XML::Node.new('EnviarInstrucao')
25+
26+
unica = XML::Node.new('InstrucaoUnica')
27+
unica['TipoValidacao'] = 'Transparente'
28+
29+
30+
description = XML::Node.new('Razao')
31+
description << invoice[:razao]
32+
unica << description
33+
34+
id_invoice = XML::Node.new('IdProprio')
35+
id_invoice << invoice[:id]
36+
unica << id_invoice
37+
38+
valores = XML::Node.new('Valores')
39+
40+
valor = XML::Node.new('Valor')
41+
valor['moeda'] = 'BRL'
42+
valor << invoice[:total]
43+
44+
valores << valor
45+
46+
47+
valor = XML::Node.new('Acrescimo')
48+
valor['moeda'] = 'BRL'
49+
valores << invoice[:acrescimo] || '0.00'
50+
51+
52+
valor = XML::Node.new('Deducao')
53+
valor['moeda'] = 'BRL'
54+
valores << invoice[:desconto] || '0.00'
55+
56+
unica << valores
57+
58+
pagador = XML::Node.new('Pagador')
59+
nome = XML::Node.new('Nome')
60+
nome << invoice[:cliente][:nome]
61+
pagador << nome
62+
63+
email = XML::Node.new('Email')
64+
email << invoice[:cliente][:email]
65+
pagador << email
66+
67+
id = XML::Node.new('IdPagador')
68+
id << invoice[:cliente][:id]
69+
pagador << id
70+
71+
endereco = XML::Node.new('EnderecoCobranca')
72+
73+
logradouro = XML::Node.new('Logradouro')
74+
logradouro << invoice[:cliente][:logradouro]
75+
endereco << logradouro
76+
77+
numero = XML::Node.new('Numero')
78+
numero_or_default = invoice[:cliente][:numero] || '0'
79+
numero << numero_or_default
80+
endereco << numero
81+
82+
complemento = XML::Node.new('Complemento')
83+
complemento << invoice[:cliente][:complemento]
84+
endereco << complemento
85+
86+
bairro = XML::Node.new('Bairro')
87+
bairro << invoice[:cliente][:bairro]
88+
endereco << bairro
89+
90+
cidade = XML::Node.new('Cidade')
91+
cidade << invoice[:cliente][:cidade]
92+
endereco << cidade
93+
94+
estado = XML::Node.new('Estado')
95+
estado << invoice[:cliente][:uf]
96+
endereco << estado
97+
98+
pais = XML::Node.new('Pais')
99+
pais_or_default = invoice[:cliente][:pais] || 'BRA'
100+
pais << pais_or_default
101+
endereco << pais
102+
103+
cep = XML::Node.new('CEP')
104+
cep << invoice[:cliente][:cep]
105+
endereco << cep
106+
107+
telefone = XML::Node.new('TelefoneFixo')
108+
telefone << invoice[:cliente][:telefone]
109+
endereco << telefone
110+
111+
pagador << endereco
112+
unica << pagador
113+
114+
if invoice[:parcelamentos]
115+
parcelamentos = XML::Node.new('Parcelamentos')
116+
invoice[:parcelamentos].each do |parcelamento_item|
117+
parcelamento = XML::Node.new('Parcelamento')
118+
minimo = XML::Node.new('MinimoParcelas')
119+
minimo << parcelamento_item[:minimo]
120+
parcelamento << minimo
121+
122+
maximo = XML::Node.new('MaximoParcelas')
123+
maximo << parcelamento_item[:maximo]
124+
parcelamento << maximo
125+
126+
if parcelamento_item[:repassar]
127+
repassar = XML::Node.new('Repassar')
128+
repassar << '1'
129+
parcelamento << repassar
130+
else
131+
juros = XML::Node.new('Juros')
132+
juros << parcelamento_item[:juros]
133+
parcelamento << juros
134+
end
135+
parcelamentos << parcelamento
136+
end
137+
138+
unica << parcelamentos
139+
end
140+
141+
comissoes = XML::Node.new('Comissoes')
142+
if invoice[:comissoes]
143+
invoice[:comissoes].each do |comissao_item|
144+
comissionamento = XML::Node.new('Comissionamento')
145+
razao = XML::Node.new('Razao')
146+
razao << comissao_item[:razao] || invoice[:razao]
147+
comissionamento << razao
148+
149+
comissionado = XML::Node.new("Comissionado")
150+
login_moip = XML::Node.new("LoginMoIP")
151+
login_moip << comissao_item[:login_moip]
152+
comissionado << login_moip
153+
comissionamento << comissionado
154+
155+
valor = XML::Node.new("ValorFixo")
156+
valor << comissao_item[:valor]
157+
comissionamento << valor
158+
comissoes << comissionamento
159+
end
160+
end
161+
162+
if invoice[:pagador_taxas]
163+
taxas = XML::Node.new('PagadorTaxa')
164+
login_moip = XML::Node.new("LoginMoIP")
165+
login_moip << invoice[:pagador_taxas]
166+
taxas << login_moip
167+
comissoes << taxas
168+
end
169+
170+
unica << comissoes
171+
172+
doc.root << unica
173+
174+
parser = XML::Parser.string(post_data(doc.to_s(:encoding => XML::Encoding::ISO_8859_1)))
175+
176+
dom = parser.parse
177+
resposta = dom.find('./Resposta').first
178+
if resposta.find('Status')[0].content == 'Sucesso'
179+
@token = resposta.find('Token')[0].content
180+
return {:status => :ok, :token => resposta.find('Token')[0].content, :id => resposta.find('ID')[0].content}
181+
elsif resposta.find('Status')[0].content == 'Falha'
182+
return {:status => :fail, :code => resposta.find('Erro')[0]['Codigo'], :message => resposta.find('Erro')[0].content, :id => resposta.find('ID')[0].content }
183+
end
184+
end
185+
186+
private
187+
188+
def get_token_url
189+
if ::CatarseMoip::Checkout::Config.test?
190+
return "https://desenvolvedor.moip.com.br/sandbox/ws/alpha/EnviarInstrucao/Unica"
191+
else
192+
return "https://www.moip.com.br/ws/alpha/EnviarInstrucao/Unica"
193+
end
194+
end
195+
196+
def get_javascript_url
197+
if ::CatarseMoip::Checkout::Config.test?
198+
return "https://desenvolvedor.moip.com.br/sandbox/transparente/MoipWidget-v2.js"
199+
else
200+
return "https://www.moip.com.br/transparente/MoipWidget-v2.js"
201+
end
202+
end
203+
204+
def post_data(xml)
205+
uri = URI.parse(get_token_url)
206+
http = Net::HTTP.new(uri.host, uri.port)
207+
http.use_ssl = true
208+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
209+
#http.set_debug_output $stderr if Moip::Config.test?
210+
211+
request = Net::HTTP::Post.new(uri.path)
212+
request.basic_auth ::CatarseMoip::Checkout::Config.access_token, ::CatarseMoip::Checkout::Config.access_key
213+
214+
request.body = xml
215+
response = http.start {|r| r.request request }
216+
response.body
217+
end
218+
end
219+
end
220+
end

lib/catarse_moip/checkout/config.rb

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
module CatarseMoip
2+
module Checkout
3+
class Config
4+
def self.access_token
5+
@access_token
6+
end
7+
8+
def self.access_token=(value)
9+
@access_token = value
10+
end
11+
12+
def self.access_key
13+
@access_key
14+
end
15+
16+
def self.access_key=(value)
17+
@access_key = value
18+
end
19+
20+
def self.test?
21+
@test || false
22+
end
23+
24+
def self.test=(test)
25+
@test = test
26+
end
27+
end
28+
end
29+
end

0 commit comments

Comments
 (0)