marnen-moip 1.0.2.pre.39f9dab38fc33fe9bf614deb8e90ca166ab2d6bf

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NzAxOTU4NjljM2RlYzA4ZmMyMjk1OWZhMGM5NDY4NDFiYWM0MDAzNQ==
5
+ data.tar.gz: !binary |-
6
+ MGMwNmE3MDY0NTFiOWQ2Njc0ZTI0YzIzMTdkNzY0NDRjZGVhZTgyMg==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NjdmOTMzODE1NWVhZmY4YTQ1NjA4ODkxNDM2YTgwZThiNjJiMTNhYzJkYTJm
10
+ MzRiYjJhNzUxYThlZGE5ZTBiOGU5NWRhMmZhYjE0OWNhMTRkZjhiMjYxNDE3
11
+ ZmFlZjkwZjdhMDQ3ODE4M2FjM2ZlZjE4NTMxNTU5ODNkMzE5MTE=
12
+ data.tar.gz: !binary |-
13
+ M2YyZTA2YTY2NjMzMTllYWEyODQ5YzM3OWE3NTkwNThlZmUzNWRkOWIwZWVm
14
+ MWVjMjliYjViNjlhNzA5NjAwNDAzMmMzNDNkMzU2MzVlZDE2ZmU0ZDllNzY3
15
+ NjQ0NWY1ZDc4YjM2ZGNlNGJmZjYwNjE0NGRkOGM2M2YzZGI5MTg=
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
@@ -0,0 +1,26 @@
1
+ ## MAC OS
2
+ .DS_Store
3
+
4
+ ## TEXTMATE
5
+ *.tmproj
6
+ tmtags
7
+
8
+ ## EMACS
9
+ *~
10
+ \#*
11
+ .\#*
12
+
13
+ ## VIM
14
+ *.swp
15
+
16
+ ## PROJECT::GENERAL
17
+ coverage
18
+ rdoc
19
+ pkg
20
+ .bundle
21
+
22
+ ## PROJECT::SPECIFIC
23
+ lib/main.rb
24
+ config.yaml
25
+ config/
26
+ config/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ # A sample Gemfile
2
+ source "http://rubygems.org"
3
+
4
+ gemspec
@@ -0,0 +1,43 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ marnen-moip (1.0.2.pre.39f9dab38fc33fe9bf614deb8e90ca166ab2d6bf)
5
+ activesupport (>= 2.3.2)
6
+ httparty (~> 0.6.1)
7
+ nokogiri (~> 1.5.0)
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ specs:
12
+ activesupport (4.1.4)
13
+ i18n (~> 0.6, >= 0.6.9)
14
+ json (~> 1.7, >= 1.7.7)
15
+ minitest (~> 5.1)
16
+ thread_safe (~> 0.1)
17
+ tzinfo (~> 1.1)
18
+ crack (0.1.8)
19
+ diff-lcs (1.2.4)
20
+ httparty (0.6.1)
21
+ crack (= 0.1.8)
22
+ i18n (0.6.11)
23
+ json (1.8.1)
24
+ minitest (5.4.0)
25
+ nokogiri (1.5.11)
26
+ rspec (2.13.0)
27
+ rspec-core (~> 2.13.0)
28
+ rspec-expectations (~> 2.13.0)
29
+ rspec-mocks (~> 2.13.0)
30
+ rspec-core (2.13.1)
31
+ rspec-expectations (2.13.0)
32
+ diff-lcs (>= 1.1.3, < 2.0)
33
+ rspec-mocks (2.13.1)
34
+ thread_safe (0.3.4)
35
+ tzinfo (1.2.1)
36
+ thread_safe (~> 0.1)
37
+
38
+ PLATFORMS
39
+ ruby
40
+
41
+ DEPENDENCIES
42
+ marnen-moip!
43
+ rspec (>= 2.1.0)
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Guilherme Nascimento
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,86 @@
1
+ # MoIP
2
+
3
+ Esta Gem permite utilizar a API do MoIP, gateway de pagamentos do IG.
4
+
5
+ ## Pagamento direto
6
+
7
+ O Pagamento Direto é um recurso que a MoIP disponibiliza para aqueles clientes que necessitam de uma flexibilidade maior do que a Integração HTML pode oferecer.
8
+
9
+ Diferentemente de como é feito com a Integração HTML, seu cliente não precisa ser redirecionado para o site da MoIP para concluir a compra: tudo é feito dentro do ambiente do seu site, dando ao cliente uma maior segurança e confiança no processo.
10
+
11
+ As formas de pagamento disponibilizadas pela Gem são:
12
+
13
+ * Boleto
14
+ * Débito
15
+ * Cartão de Crédito
16
+
17
+ ## Instalação
18
+
19
+ Instale a Gem
20
+ gem install moip
21
+
22
+ Adicione a Gem ao Gemfile
23
+ gem "moip"
24
+
25
+ ## Utilização
26
+
27
+ O MoIP possui uma SandBox de testes que permite a simulação de pagamentos. Para utilizar a Gem com o SandBox, adicione a seguinte configuração no arquivo do environment que deseja utilizar.
28
+
29
+ ### config/environments/development.rb
30
+
31
+ MoIP.setup do |config|
32
+ config.uri = "https://desenvolvedor.moip.com.br/sandbox"
33
+ config.token = SEU_TOKEN
34
+ config.key = SUA_KEY
35
+ end
36
+
37
+ Após realizar os testes na SandBox, você poderá fazer a mudança para o ambiente de produção do MoIP de maneira simples. Basta inserir no arquivo de environment de produção o token e chave que serão utilizados. Por padrão a gem já utiliza a URI de produção do MoIP.
38
+
39
+ ###Crie os dados do pagador
40
+
41
+ pagador = { :nome => "Luiz Inácio Lula da Silva",
42
+ :login_moip => "lula",
43
+ :email => "presidente@planalto.gov.br",
44
+ :tel_cel => "(61)9999-9999",
45
+ :apelido => "Lula",
46
+ :identidade => "111.111.111-11",
47
+ :logradouro => "Praça dos Três Poderes",
48
+ :numero => "0",
49
+ :complemento => "Palácio do Planalto",
50
+ :bairro => "Zona Cívico-Administrativa",
51
+ :cidade => "Brasília",
52
+ :estado => "DF",
53
+ :pais => "BRA",
54
+ :cep => "70100-000",
55
+ :tel_fixo => "(61)3211-1221" }
56
+
57
+ ###Dados do boleto
58
+
59
+ boleto = { :valor => "50",
60
+ :id_proprio => "Pag#{rand(1000)}",
61
+ :forma => "BoletoBancario",
62
+ :dias_expiracao => 5,
63
+ :pagador => pagador }
64
+
65
+ ###Checkout
66
+
67
+ def checkout
68
+ response = MoIP::Client.checkout(boleto)
69
+
70
+ # exibe o boleto para impressão
71
+ redirect_to MoIP::Client.moip_page(response["Token"])
72
+ end
73
+
74
+ ###Erros
75
+
76
+ - MoIP::MissingPaymentTypeError - Quando falta a razão do pagamento na requisição.
77
+ - MoIP::MissingPayerError - Quando falta as informações do pagador na requisição.
78
+ - MoIP::WebServerResponseError - Quando há algum erro ao se enviar a solicitação ao servidor. Normalmente a razão do erro vem como resposta da mensagem.
79
+
80
+ ## Futuras implementações
81
+
82
+ * Pagamento Simples
83
+ * Pagamento Recorrente
84
+
85
+
86
+ Baseado no projeto do [Daniel Lopes](http://github.com/danielvlopes/moip_usage).
@@ -0,0 +1,19 @@
1
+ # coding: utf-8
2
+ require 'rubygems'
3
+ require 'rake'
4
+
5
+ require 'rspec/core/rake_task'
6
+
7
+ task :default => :spec
8
+ RSpec::Core::RakeTask.new
9
+
10
+ require 'rake/rdoctask'
11
+ Rake::RDocTask.new do |rdoc|
12
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
13
+
14
+ rdoc.rdoc_dir = 'rdoc'
15
+ rdoc.title = "moip #{version}"
16
+ rdoc.rdoc_files.include('README*')
17
+ rdoc.rdoc_files.include('lib/**/*.rb')
18
+ end
19
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.1
@@ -0,0 +1,61 @@
1
+ # encoding: utf-8
2
+ require "rubygems"
3
+ require 'active_support/core_ext/module/attribute_accessors'
4
+ require 'active_support/deprecation'
5
+
6
+ module MoIP
7
+
8
+ class ValidationError < StandardError; end
9
+
10
+ class MissingPaymentTypeError < ValidationError; end
11
+ class MissingPayerError < ValidationError; end
12
+ class MissingBirthdate < ValidationError; end
13
+
14
+ class InvalidCellphone < ValidationError; end
15
+ class InvalidExpiry < ValidationError; end
16
+ class InvalidInstitution < ValidationError; end
17
+ class InvalidPhone < ValidationError; end
18
+ class InvalidReceiving < ValidationError; end
19
+ class InvalidValue < ValidationError; end
20
+
21
+ autoload :DirectPayment, 'moip/direct_payment'
22
+ autoload :Client, 'moip/client'
23
+
24
+ # URI para acessar o serviço
25
+ mattr_accessor :uri
26
+ @@uri = 'https://www.moip.com.br'
27
+
28
+ # Token de autenticação
29
+ mattr_accessor :token
30
+
31
+ # Chave de acesso ao serviço
32
+ mattr_accessor :key
33
+
34
+ def self.setup
35
+ yield self
36
+ end
37
+
38
+ STATUS = {1 => "authorized", 2 => "started", 3 => "printed", 4 => "completed", 5 => "canceled", 6 => "analysing"}
39
+
40
+ class << self
41
+ def checkout(attributes = {})
42
+ ActiveSupport::Deprecation.warn("MoIP.checkout has been deprecated. Use MoIP::Client.checkout instead", caller)
43
+ MoIP::Client.checkout(attributes)
44
+ end
45
+
46
+ def query(token)
47
+ ActiveSupport::Deprecation.warn("MoIP.query has been deprecated. Use MoIP::Client.query instead", caller)
48
+ MoIP::Client.query(token)
49
+ end
50
+
51
+ def moip_page(token)
52
+ ActiveSupport::Deprecation.warn("MoIP.moip_page has been deprecated. use MoIP::Client.moip_page instead", caller)
53
+ MoIP::Client.moip_page(token)
54
+ end
55
+
56
+ def notification(params)
57
+ ActiveSupport::Deprecation.warn("MoIP.notification has been deprecated. use MoIP::Client.notification instead", caller)
58
+ MoIP::Client.moip_page(token)
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,97 @@
1
+ # encoding: utf-8
2
+ require 'httparty'
3
+
4
+ module MoIP
5
+ class WebServerResponseError < StandardError ; end
6
+ class MissingConfigError < StandardError ; end
7
+ class MissingTokenError < StandardError ; end
8
+ class MissingKeyError < StandardError ; end
9
+
10
+ class Client
11
+ include HTTParty
12
+
13
+ base_uri "#{MoIP.uri}/ws/alpha"
14
+ basic_auth MoIP.token, MoIP.key
15
+
16
+ class << self
17
+
18
+ # Verifica conta
19
+ # URL Produção: https://www.moip.com.br/ws/alpha/VerificarConta/{login_moip}
20
+ # URL SandBox: https://desenvolvedor.moip.com.br/sandbox/ws/alpha/VerificarConta/{login_moip}
21
+ # XML de Resposta:
22
+ # <ns1:verificarContaResponse>
23
+ # <RespostaVerificarConta>
24
+ # <Status>{status da conta}</Status>
25
+ # </RespostaVerificarConta>
26
+ # </ns1:verificarContaResponse>
27
+ #
28
+ # Valores Esperados: {status da conta}
29
+ # Inexistente " Login inexistente no sistema MoIP "
30
+ # Criado " Login criado, porem não verificado "
31
+ # Verificado " Login verificado "
32
+ # MoIP::Client.verify 'aaa'
33
+
34
+ def verify account
35
+ full_data = peform_action!(:get, "VerificarConta/#{account}")
36
+ return full_data["ns1:verificarContaResponse"]["RespostaVerificarConta"]["Status"] == "Verificado"
37
+ end
38
+
39
+ # Envia uma instrução para pagamento único
40
+ def checkout(attributes = {})
41
+ body = DirectPayment.body(attributes)
42
+ puts "************ XML ************"
43
+ puts body
44
+ full_data = peform_action!(:post, 'EnviarInstrucao/Unica', :body => body)
45
+ # raise full_data.inspect
46
+ get_response!(full_data["ns1:EnviarInstrucaoUnicaResponse"]["Resposta"])
47
+ end
48
+
49
+ # Consulta dos dados das autorizações e pagamentos associados à Instrução
50
+ def query(token)
51
+ full_data = peform_action!(:get, "ConsultarInstrucao/#{token}")
52
+
53
+ get_response!(full_data["ns1:ConsultarTokenResponse"]["RespostaConsultar"])
54
+ end
55
+
56
+ # Retorna a URL de acesso ao MoIP
57
+ def moip_page(token)
58
+ raise(MissingTokenError, "É necessário informar um token para retornar os dados da transação") if token.nil?
59
+ "#{MoIP.uri}/Instrucao.do?token=#{token}"
60
+ end
61
+
62
+ # Monta o NASP
63
+ def notification(params)
64
+ notification = {}
65
+ notification[:transaction_id] = params["id_transacao"]
66
+ notification[:amount] = params["valor"]
67
+ notification[:status] = MoIP::STATUS[params["status_pagamento"].to_i]
68
+ notification[:code] = params["cod_moip"]
69
+ notification[:payment_type] = params["tipo_pagamento"]
70
+ notification[:email] = params["email_consumidor"]
71
+ notification
72
+ end
73
+
74
+ private
75
+
76
+ def peform_action!(action_name, url, options = {})
77
+
78
+ raise(MissingConfigError, "É necessário criar um arquivo de configuração para o moip. Veja mais em: https://github.com/moiplabs/moip-ruby") if MoIP.token.nil? && MoIP.key.nil?
79
+
80
+ raise(MissingTokenError, "É necessário informar um token na configuração") if MoIP.token.nil? || MoIP.token.empty?
81
+
82
+ raise(MissingKeyError, "É necessário informar um key na configuração") if MoIP.key.nil? || MoIP.key.empty?
83
+
84
+ response = self.send(action_name, url, options)
85
+ raise(WebServerResponseError, "Ocorreu um erro ao chamar o webservice") if response.nil?
86
+ response
87
+ end
88
+
89
+ def get_response!(data)
90
+ # raise data.inspect
91
+ err = data["Erro"].is_a?(Array) ? data["Erro"].join(", ") : data["Erro"]
92
+ raise(WebServerResponseError, err) if data["Status"] == "Falha"
93
+ data
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,186 @@
1
+ # encoding: utf-8
2
+ require "nokogiri"
3
+
4
+ module MoIP
5
+
6
+ # Baseado em http://labs.moip.com.br/pdfs/Integra%C3%A7%C3%A3o%20API%20-%20Autorizar%20e%20Cancelar%20Pagamentos.pdf
7
+ CodigoErro = 0..999
8
+ CodigoEstado = %w{AC AL AM AP BA CE DF ES GO MA MG MS MT PA PB PE PI PR RJ RN RO RR RS SC SE SP TO}
9
+ CodigoMoeda = "BRL"
10
+ CodigoPais = "BRA"
11
+ Destino = %w{Nenhum MesmoCobranca AInformar PreEstabelecido}
12
+ InstituicaoPagamento = %w{MoIP Visa AmericanExpress Mastercard Diners BancoDoBrasil Bradesco Itau BancoReal Unibanco Aura Hipercard Paggo Banrisul}
13
+ FormaPagamento = %w{CarteiraMoIP CartaoCredito CartaoDebito DebitoBancario FinanciamentoBancario BoletoBancario}
14
+ FormaRestricao = %w{Contador Valor}
15
+ PapelIndividuo = %w{Integrador Recebedor Comissionado Pagado}
16
+ OpcaoDisponivel = %w{Sim Não PagadorEscolhe}
17
+ Parcelador = %w{Nenhum Administradora MoIP Recebedor}
18
+ StatusLembrete = %w{Enviado Realizado EmAndamento Aguardando Falha}
19
+ StatusPagamento = %w{Concluido EmAnalise Autorizado Iniciado Cancelado BoletoImpresso Estornado}
20
+ TipoDias = %w{Corridos Uteis}
21
+ TipoDuracao = %w{Minutos Horas Dias Semanas Meses Ano}
22
+ TipoFrete = %w{Proprio Correio}
23
+ TipoIdentidade = %w{CPF CNPJ}
24
+ TipoInstrucao = %w{Unico Recorrente PrePago PosPago Remessa}
25
+ TipoLembrete = %w{Email SMS}
26
+ TipoPeriodicidade = %w{Anual Mensal Semanal Diaria}
27
+ TipoRecebimento = %w{AVista Parcelado}
28
+ TipoRestricao = %w{Autorizacao Pagamento}
29
+ TipoStatus = %w{Sucesso Falha}
30
+
31
+ #
32
+ TiposComInstituicao = %w{CartaoCredito CartaoCredito DebitoBancario}
33
+
34
+ class DirectPayment
35
+
36
+ class << self
37
+
38
+ # Cria uma instrução de pagamento direto
39
+ def body(attributes = {})
40
+
41
+ #raise "#{attributes[:valor]}--#{attributes[:valor].to_f}"
42
+ raise(MissingPaymentTypeError, "É necessário informar a razão do pagamento") if attributes[:razao].nil?
43
+ raise(MissingPayerError, "É obrigatório passar as informarções do pagador") if attributes[:pagador].nil?
44
+
45
+ raise(InvalidValue, "Valor deve ser maior que zero.") if attributes[:valor].to_f <= 0.0
46
+ raise(InvalidPhone, "Telefone deve ter o formato (99)9999-9999.") if attributes[:pagador][:tel_fixo] !~ /\(\d{2}\)?\d{4}-\d{4}/
47
+ raise(InvalidCellphone, "Telefone celular deve ter o formato (99)9999-9999.") if attributes[:pagador][:tel_cel] !~ /\(\d{2}\)?\d{4}-\d{4}/
48
+
49
+ raise(MissingBirthdate, "É obrigatório passar as informarções do pagador") if TiposComInstituicao.include?(attributes[:forma]) && attributes[:data_nascimento].nil?
50
+
51
+ raise(InvalidExpiry, "Data de expiração deve ter o formato 01-00 até 12-99.") if TiposComInstituicao.include?(attributes[:forma]) && attributes[:expiracao] !~ /(1[0-2]|0\d)\/\d{2}/
52
+
53
+
54
+ raise(InvalidReceiving, "Recebimento é inválido. Escolha um destes: #{TipoRecebimento.join(', ')}") if !TipoRecebimento.include?(attributes[:recebimento]) && TiposComInstituicao.include?(attributes[:forma])
55
+
56
+ raise(InvalidInstitution, "A instituição #{attributes[:instituicao]} é inválida. Escolha uma destas: #{InstituicaoPagamento.join(', ')}") if TiposComInstituicao.include?(attributes[:forma]) && !InstituicaoPagamento.include?(attributes[:instituicao])
57
+
58
+ builder = Nokogiri::XML::Builder.new(:encoding => "UTF-8") do |xml|
59
+
60
+ # Identificador do tipo de instrução
61
+ xml.EnviarInstrucao {
62
+ xml.InstrucaoUnica {
63
+
64
+ # Dados da transação
65
+ xml.Razao {
66
+ xml.text attributes[:razao]
67
+ }
68
+ xml.Valores {
69
+ xml.Valor(:moeda => "BRL") {
70
+ xml.text attributes[:valor]
71
+ }
72
+ }
73
+ xml.IdProprio {
74
+ xml.text attributes[:id_proprio]
75
+ }
76
+
77
+ # Definindo o pagamento direto
78
+ xml.PagamentoDireto {
79
+ xml.Forma {
80
+ xml.text attributes[:forma]
81
+ }
82
+
83
+ # Débito Bancário
84
+ if ["DebitoBancario"].include?(attributes[:forma])
85
+ xml.Instituicao {
86
+ xml.text attributes[:instituicao]
87
+ }
88
+ end
89
+
90
+ # Cartão de Crédito
91
+ if attributes[:forma] == "CartaoCredito"
92
+ xml.Instituicao {
93
+ xml.text attributes[:instituicao]
94
+ }
95
+ xml.CartaoCredito {
96
+ xml.Numero {
97
+ xml.text attributes[:numero]
98
+ }
99
+ xml.Expiracao {
100
+ xml.text attributes[:expiracao]
101
+ }
102
+ xml.CodigoSeguranca {
103
+ xml.text attributes[:codigo_seguranca]
104
+ }
105
+ xml.Portador {
106
+ xml.Nome {
107
+ xml.text attributes[:nome]
108
+ }
109
+ xml.Identidade(:Tipo => "CPF") {
110
+ xml.text attributes[:identidade]
111
+ }
112
+ xml.Telefone {
113
+ xml.text attributes[:telefone]
114
+ }
115
+ xml.DataNascimento {
116
+ xml.text attributes[:data_nascimento]
117
+ }
118
+ }
119
+ }
120
+ xml.Parcelamento {
121
+ xml.Parcelas {
122
+ xml.text attributes[:parcelas]
123
+ }
124
+ xml.Recebimento {
125
+ xml.text attributes[:recebimento]
126
+ }
127
+ }
128
+ end
129
+ }
130
+
131
+ # Dados do pagador
132
+ xml.Pagador {
133
+ xml.Nome { xml.text attributes[:pagador][:nome] }
134
+ xml.LoginMoIP { xml.text attributes[:pagador][:login_moip] }
135
+ xml.Email { xml.text attributes[:pagador][:email] }
136
+ xml.TelefoneCelular { xml.text attributes[:pagador][:tel_cel] }
137
+ xml.Apelido { xml.text attributes[:pagador][:apelido] }
138
+ xml.Identidade(:Tipo => "CPF") { xml.text attributes[:pagador][:identidade] }
139
+ xml.EnderecoCobranca {
140
+ xml.Logradouro { xml.text attributes[:pagador][:logradouro] }
141
+ xml.Numero { xml.text attributes[:pagador][:numero] }
142
+ xml.Complemento { xml.text attributes[:pagador][:complemento] }
143
+ xml.Bairro { xml.text attributes[:pagador][:bairro] }
144
+ xml.Cidade { xml.text attributes[:pagador][:cidade] }
145
+ xml.Estado { xml.text attributes[:pagador][:estado] }
146
+ xml.Pais { xml.text attributes[:pagador][:pais] }
147
+ xml.CEP { xml.text attributes[:pagador][:cep] }
148
+ xml.TelefoneFixo { xml.text attributes[:pagador][:tel_fixo] }
149
+ }
150
+ }
151
+
152
+ # Boleto Bancario
153
+ if attributes[:forma] == "BoletoBancario"
154
+ # Dados extras
155
+ xml.Boleto {
156
+ xml.DiasExpiracao(:Tipo => "Corridos") {
157
+ xml.text attributes[:dias_expiracao]
158
+ }
159
+ xml.Instrucao1 {
160
+ xml.text attributes[:instrucao_1]
161
+ }
162
+ xml.URLLogo {
163
+ xml.text attributes[:url_logo]
164
+ }
165
+ }
166
+ end
167
+
168
+ if attributes[:url_retorno]
169
+ # URL de retorno
170
+ xml.URLRetorno {
171
+ xml.text attributes[:url_retorno]
172
+ }
173
+ end
174
+
175
+ }
176
+ }
177
+ end
178
+
179
+ builder.to_xml
180
+ end
181
+
182
+ end
183
+
184
+ end
185
+
186
+ end
@@ -0,0 +1,27 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |gem|
4
+ gem.name = %q{marnen-moip}
5
+ gem.version = "1.0.2-39f9dab38fc33fe9bf614deb8e90ca166ab2d6bf"
6
+
7
+ gem.authors = ["Guilherme Nascimento", 'Marnen Laibow-Koser']
8
+ gem.date = %q{2010-11-10}
9
+ gem.description = %q{Gem para utilização da API MoIP}
10
+ gem.email = ['guilherme.ruby@gmail.com', 'marnen@marnen.org']
11
+ gem.summary = %q{Gem para utilização da API MoIP}
12
+
13
+ gem.files = `git ls-files`.split("\n")
14
+ gem.test_files = `git ls-files -- spec/*.rb`.split("\n")
15
+
16
+ gem.homepage = %q{http://github.com/marnen/moip-ruby}
17
+ gem.require_paths = ["lib"]
18
+
19
+ gem.rdoc_options = ["--charset=UTF-8"]
20
+ gem.extra_rdoc_files = [ "LICENSE", "README.markdown"]
21
+
22
+ gem.add_development_dependency(%q<rspec>, [">= 2.1.0"])
23
+
24
+ gem.add_runtime_dependency(%q<nokogiri>, ["~> 1.5.0"])
25
+ gem.add_runtime_dependency(%q<httparty>, ["~> 0.6.1"])
26
+ gem.add_runtime_dependency(%q<activesupport>, [">= 2.3.2"])
27
+ end
@@ -0,0 +1,465 @@
1
+ # encoding: utf-8
2
+ require "moip"
3
+ require "digest/sha1"
4
+
5
+ MoIP::Client
6
+ MoIP::DirectPayment
7
+
8
+ describe "Make payments with the MoIP API" do
9
+ let(:id){ '1' }
10
+
11
+ before :all do
12
+
13
+ @pagador = { :nome => "Luiz Inácio Lula da Silva",
14
+ :login_moip => "lula",
15
+ :email => "presidente@planalto.gov.br",
16
+ :tel_cel => "(61)9999-9999",
17
+ :apelido => "Lula",
18
+ :identidade => "111.111.111-11",
19
+ :logradouro => "Praça dos Três Poderes",
20
+ :numero => "0",
21
+ :complemento => "Palácio do Planalto",
22
+ :bairro => "Zona Cívico-Administrativa",
23
+ :cidade => "Brasília",
24
+ :estado => "DF",
25
+ :pais => "BRA",
26
+ :cep => "70100-000",
27
+ :tel_fixo => "(61)3211-1221" }
28
+
29
+ @billet_without_razao = { :valor => "8.90", :id_proprio => id,
30
+ :forma => "BoletoBancario", :pagador => @pagador}
31
+ @billet = { :valor => "8.90", :id_proprio => id,
32
+ :forma => "BoletoBancario", :pagador => @pagador ,
33
+ :razao=> "Pagamento" }
34
+
35
+ @debit = { :valor => "8.90", :id_proprio => id, :forma => "DebitoBancario",
36
+ :instituicao => "BancoDoBrasil", :pagador => @pagador,
37
+ :razao => "Pagamento"}
38
+
39
+ @credit = { :valor => "8.90", :id_proprio => id, :forma => "CartaoCredito",
40
+ :instituicao => "AmericanExpress",:numero => "345678901234564",
41
+ :expiracao => "08/11", :codigo_seguranca => "1234",
42
+ :nome => "João Silva", :identidade => "134.277.017.00",
43
+ :telefone => "(21)9208-0547", :data_nascimento => "25/10/1980",
44
+ :parcelas => "2", :recebimento => "AVista",
45
+ :pagador => @pagador, :razao => "Pagamento"}
46
+ end
47
+
48
+ context "misconfigured" do
49
+ it "should raise a missing config error " do
50
+ MoIP.setup do |config|
51
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
52
+ config.token = nil
53
+ config.key = nil
54
+ end
55
+
56
+ MoIP::Client # for autoload
57
+ lambda { MoIP::Client.checkout(@billet) }.should raise_error(MoIP::MissingConfigError)
58
+ end
59
+
60
+ it "should raise a missing token error when token is nil" do
61
+ MoIP.setup do |config|
62
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
63
+ config.token = nil
64
+ config.key = 'key'
65
+ end
66
+
67
+ MoIP::Client # for autoload
68
+ lambda { MoIP::Client.checkout(@billet) }.should raise_error(MoIP::MissingTokenError)
69
+ end
70
+
71
+ it "should raise a missing key error when key is nil" do
72
+
73
+ MoIP.setup do |config|
74
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
75
+ config.token = 'token'
76
+ config.key = nil
77
+ end
78
+
79
+ MoIP::Client # for autoload
80
+ lambda { MoIP::Client.checkout(@billet) }.should raise_error(MoIP::MissingKeyError)
81
+ end
82
+
83
+
84
+
85
+ it "should raise a missing token error when token is empty" do
86
+ MoIP.setup do |config|
87
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
88
+ config.token = ''
89
+ config.key = 'key'
90
+ end
91
+
92
+ MoIP::Client # for autoload
93
+ lambda { MoIP::Client.checkout(@billet) }.should raise_error(MoIP::MissingTokenError)
94
+ end
95
+
96
+ it "should raise a missing key error when key is empty" do
97
+
98
+ MoIP.setup do |config|
99
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
100
+ config.token = 'token'
101
+ config.key = ''
102
+ end
103
+
104
+ MoIP::Client # for autoload
105
+ lambda { MoIP::Client.checkout(@billet) }.should raise_error(MoIP::MissingKeyError)
106
+ end
107
+ end
108
+
109
+ context "validations" do
110
+
111
+
112
+ before(:each) do
113
+ MoIP.setup do |config|
114
+ config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
115
+ config.token = 'token'
116
+ config.key = 'key'
117
+ end
118
+ end
119
+ it "should raise invalid phone" do
120
+ @data = @credit.merge({:pagador => {:tel_fixo => 'InvalidPhone', :tel_cel => "(61)9999-9999"}})
121
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::InvalidPhone)
122
+ end
123
+ it "should raise invalid cellphone" do
124
+ @data = @credit.merge({:pagador => {:tel_cel => 'InvalidCellphone', :tel_fixo => "(61)9999-9999"}})
125
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::InvalidCellphone)
126
+ end
127
+ it "should raise invalid expiry" do
128
+ @data = @credit.merge({:expiracao => 'InvalidExpiry'})
129
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::InvalidExpiry)
130
+ end
131
+ it "should raise missing birthdate" do
132
+ @data = @credit.merge({:data_nascimento => nil})
133
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::MissingBirthdate)
134
+ end
135
+ it "should raise invalid institution error" do
136
+ @data = @credit.merge({:instituicao => 'InvalidInstitution'})
137
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::InvalidInstitution)
138
+ end
139
+ it "should raise invalid receiving error" do
140
+ @data = @credit.merge({:recebimento => 'InvalidReceiving'})
141
+ lambda { MoIP::Client.checkout(@data) }.should raise_error(MoIP::InvalidReceiving)
142
+ end
143
+ it "should raise invalid value error if 0" do
144
+ @credit[:valor] = 0
145
+ lambda { MoIP::Client.checkout(@credit) }.should raise_error(MoIP::InvalidValue)
146
+ end
147
+ it "should raise invalid value error if '0'" do
148
+ @credit[:valor] = '0'
149
+ lambda { MoIP::Client.checkout(@credit) }.should raise_error(MoIP::InvalidValue)
150
+ end
151
+ it "should raise invalid value error if 0.0" do
152
+ @credit[:valor] = 0.0
153
+ lambda { MoIP::Client.checkout(@credit) }.should raise_error(MoIP::InvalidValue)
154
+ end
155
+ it "should raise invalid value error if '0.0'" do
156
+ @credit[:valor] = '0.0'
157
+ lambda { MoIP::Client.checkout(@credit) }.should raise_error(MoIP::InvalidValue)
158
+ end
159
+ it "should raise invalid value error if -1" do
160
+ @credit[:valor] = -1
161
+ lambda { MoIP::Client.checkout(@credit) }.should raise_error(MoIP::InvalidValue)
162
+ end
163
+ end
164
+ #
165
+ # context "checkout" do
166
+ # before(:each) do
167
+ # MoIP.setup do |config|
168
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
169
+ # config.token = 'token'
170
+ # config.key = 'key'
171
+ # end
172
+ # MoIP::Client.stub!(:post).
173
+ # and_return("ns1:EnviarInstrucaoUnicaResponse"=>
174
+ # { "Resposta"=>
175
+ # { "ID"=>Time.now.strftime("%y%m%d%H%M%S"),
176
+ # "Status"=>"Sucesso",
177
+ # "Token" => "T2N0L0X8E0S71217U2H3W1T4F4S4G4K731D010V0S0V0S080M010E0Q082X2"
178
+ # }
179
+ # })
180
+ # end
181
+ #
182
+ # it "with old api should be deprecated" do
183
+ # deprecations = collect_deprecations{ MoIP.checkout(@billet) }
184
+ #
185
+ # deprecations.should_not be_empty
186
+ # deprecations.any? {|w| w =~ /MoIP.checkout has been deprecated/ }.should be_true
187
+ # end
188
+ #
189
+ # context "when it is a billet checkout" do
190
+ # before(:each) do
191
+ # MoIP.setup do |config|
192
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
193
+ # config.token = 'token'
194
+ # config.key = 'key'
195
+ # end
196
+ # end
197
+ # it "should raise an exception when razao parameter is not passed" do
198
+ # error = "É necessário informar a razão do pagamento"
199
+ #
200
+ # lambda { MoIP::Client.checkout(@billet_without_razao) }.should raise_error(MoIP::MissingPaymentTypeError,error)
201
+ # end
202
+ #
203
+ # it "should have status 'Sucesso'" do
204
+ # response = MoIP::Client.checkout(@billet)
205
+ # response["Status"].should == "Sucesso"
206
+ # end
207
+ # end
208
+ #
209
+ # context "when it is a debit checkout" do
210
+ # before(:each) do
211
+ # MoIP.setup do |config|
212
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
213
+ # config.token = 'token'
214
+ # config.key = 'key'
215
+ # end
216
+ # end
217
+ # it "should have status 'Sucesso' with valid arguments" do
218
+ # response = MoIP::Client.checkout(@debit)
219
+ # response["Status"].should == "Sucesso"
220
+ # end
221
+ #
222
+ # it "should have status 'Falha' when a instituition is not passed as argument" do
223
+ # @incorrect_debit = { :valor => "37.90", :id_proprio => id,
224
+ # :forma => "DebitoBancario", :pagador => @pagador,
225
+ # :razao => "Pagamento"}
226
+ #
227
+ # error = "Pagamento direto não é possível com a instituição de pagamento enviada"
228
+ #
229
+ # MoIP::Client.stub!(:post).and_return("ns1:EnviarInstrucaoUnicaResponse"=>
230
+ # { "Resposta"=>
231
+ # {
232
+ # "Status"=>"Falha",
233
+ # "Erro"=>error
234
+ # }
235
+ # })
236
+ # error = "Pagamento direto não é possível com a instituição de pagamento enviada"
237
+ # lambda { MoIP::Client.checkout(@incorrect_debit) }.should
238
+ # raise_error(MoIP::WebServerResponseError, error)
239
+ # end
240
+ #
241
+ # it "should raise an exception if payer informations were not passed" do
242
+ # @incorrect_debit = { :valor => "37.90", :id_proprio => id,
243
+ # :forma => "DebitoBancario",
244
+ # :instituicao => "BancoDoBrasil",
245
+ # :razao => "Pagamento"
246
+ # }
247
+ #
248
+ # lambda { MoIP::Client.checkout(@incorrect_debit) }.should
249
+ # raise_error(MoIP::MissingPayerError, "É obrigatório passar as informações do pagador")
250
+ # end
251
+ # end
252
+ #
253
+ # context "when it is a credit card checkout" do
254
+ # before(:each) do
255
+ # MoIP.setup do |config|
256
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
257
+ # config.token = 'token'
258
+ # config.key = 'key'
259
+ # end
260
+ # end
261
+ # it "should have status 'Sucesso' with valid arguments" do
262
+ # response = MoIP::Client.checkout(@credit)
263
+ # response["Status"].should == "Sucesso"
264
+ # end
265
+ #
266
+ # it "should have status 'Falha' when the card informations were not passed as argument" do
267
+ # @incorrect_credit = { :valor => "8.90", :id_proprio => id,
268
+ # :forma => "CartaoCredito", :pagador => @pagador,
269
+ # :razao => "Pagamento"
270
+ # }
271
+ #
272
+ # error = "Pagamento direto não é possível com a instituição de pagamento enviada"
273
+ # MoIP::Client.stub!(:post).and_return("ns1:EnviarInstrucaoUnicaResponse"=>
274
+ # {
275
+ # "Resposta"=>
276
+ # {
277
+ # "Status"=>"Falha",
278
+ # "Erro"=>error
279
+ # }
280
+ # })
281
+ #
282
+ # error = "Pagamento direto não é possível com a instituição de pagamento enviada"
283
+ # lambda { MoIP::Client.checkout(@incorrect_credit) }.should
284
+ # raise_error(MoIP::WebServerResponseError, error)
285
+ # end
286
+ # end
287
+ #
288
+ # context "in error scenario" do
289
+ # before(:each) do
290
+ # MoIP.setup do |config|
291
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
292
+ # config.token = 'token'
293
+ # config.key = 'key'
294
+ # end
295
+ # end
296
+ # it "should raise an exception if response is nil" do
297
+ # MoIP::Client.stub!(:post).and_return(nil)
298
+ # lambda { MoIP::Client.checkout(@billet) }.should
299
+ # raise_error(StandardError,"Ocorreu um erro ao chamar o webservice")
300
+ # end
301
+ #
302
+ # it "should raise an exception if status is fail" do
303
+ # MoIP::Client.stub!(:post).and_return("ns1:EnviarInstrucaoUnicaResponse"=>
304
+ # { "Resposta"=>
305
+ # {"Status"=>"Falha",
306
+ # "Erro"=>"O status da resposta é Falha"
307
+ # }
308
+ # })
309
+ #
310
+ # lambda { MoIP::Client.checkout(@billet) }.should raise_error(StandardError, "O status da resposta é Falha")
311
+ # end
312
+ # end
313
+ # end
314
+ #
315
+ # context "query a transaction token" do
316
+ #
317
+ # before(:each) do
318
+ #
319
+ # MoIP.setup do |config|
320
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
321
+ # config.token = 'token'
322
+ # config.key = 'key'
323
+ # end
324
+ # MoIP::Client.stub!(:get).and_return("ns1:ConsultarTokenResponse"=>
325
+ # { "RespostaConsultar"=>
326
+ # {"Status"=>"Sucesso",
327
+ # "ID"=>"201010291031001210000000046760"
328
+ # }
329
+ # })
330
+ # end
331
+ #
332
+ # it "with old api should be deprecated" do
333
+ # deprecations = collect_deprecations{ MoIP.query(token) }
334
+ #
335
+ # deprecations.should_not be_empty
336
+ # deprecations.any? {|w| w =~ /MoIP.query has been deprecated/ }.should be_true
337
+ # end
338
+ #
339
+ # it "should retrieve the transaction" do
340
+ # response = MoIP::Client.query(token)
341
+ # response["Status"].should == "Sucesso"
342
+ # end
343
+ #
344
+ # context "in a error scenario" do
345
+ # before(:each) do
346
+ # MoIP.setup do |config|
347
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
348
+ # config.token = 'token'
349
+ # config.key = 'key'
350
+ # end
351
+ # end
352
+ # it "should retrieve status 'Falha'" do
353
+ # MoIP::Client.stub!(:get).and_return("ns1:ConsultarTokenResponse"=>
354
+ # { "RespostaConsultar"=>
355
+ # {"Status"=>"Falha",
356
+ # "Erro"=>"Instrução não encontrada",
357
+ # "ID"=>"201010291102522860000000046768"
358
+ # }
359
+ # })
360
+ # query = "000000000000000000000000000000000000000000000000000000000000"
361
+ # lambda { MoIP::Client.query(query) }.should raise_error(StandardError, "Instrução não encontrada")
362
+ # end
363
+ # end
364
+ # end
365
+ #
366
+ # context "build the MoIP URL" do
367
+ # before(:each) do
368
+ # MoIP.setup do |config|
369
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
370
+ # config.token = 'token'
371
+ # config.key = 'key'
372
+ # end
373
+ # end
374
+ # it "with old api should be deprecated" do
375
+ # deprecations = collect_deprecations{ MoIP.moip_page(token) }
376
+ #
377
+ # deprecations.should_not be_empty
378
+ # deprecations.any? {|w| w =~ /MoIP.moip_page has been deprecated/ }.should be_true
379
+ # end
380
+ #
381
+ # it "should build the correct URL" do
382
+ # page = "https://desenvolvedor.moip.com.br/sandbox/Instrucao.do?token=#{token}"
383
+ # MoIP::Client.moip_page(token).should == page
384
+ # end
385
+ #
386
+ # it "should raise an error if the token is not informed" do
387
+ # error = "É necessário informar um token para retornar os dados da transação"
388
+ # lambda { MoIP::Client.moip_page("").should
389
+ # raise_error(ArgumentError, error) }
390
+ # end
391
+ #
392
+ # it "should raise an error if nil is passed as the token" do
393
+ # error = "É necessário informar um token para retornar os dados da transação"
394
+ # lambda { MoIP::Client.moip_page(nil).should
395
+ # raise_error(ArgumentError, error) }
396
+ # end
397
+ #
398
+ # it "should raise a missing token error if nil is passed as the token" do
399
+ # lambda { MoIP::Client.moip_page(nil).should raise_error(MissingTokenError) }
400
+ # end
401
+ #
402
+ # it "should raise a missing token error if an empty string is passed as the token" do
403
+ # lambda { MoIP::Client.moip_page("").should raise_error(MissingTokenError) }
404
+ # end
405
+ # end
406
+ #
407
+ # context "when receive notification" do
408
+ # before(:each) do
409
+ # MoIP.setup do |config|
410
+ # config.uri = 'https://desenvolvedor.moip.com.br/sandbox'
411
+ # config.token = 'token'
412
+ # config.key = 'key'
413
+ # end
414
+ # @params = { "id_transacao" => "Pag62", "valor" => "8.90",
415
+ # "status_pagamento" => "3", "cod_moip" => "001",
416
+ # "forma_pagamento" => "73", "tipo_pagamento" => "BoletoBancario",
417
+ # "email_consumidor" => "presidente@planalto.gov.br" }
418
+ # end
419
+ #
420
+ # it "with old api should be deprecated" do
421
+ # deprecations = collect_deprecations{ MoIP.notification(@param) }
422
+ #
423
+ # deprecations.should_not be_empty
424
+ # deprecations.any? {|w| w =~ /MoIP.notification has been deprecated/ }.should be_true
425
+ # end
426
+ #
427
+ # it "should return a hash with the params extracted from NASP" do
428
+ # response = { :transaction_id => "Pag62", :amount => "8.90",
429
+ # :status => "printed", :code => "001",
430
+ # :payment_type => "BoletoBancario",
431
+ # :email => "presidente@planalto.gov.br" }
432
+ #
433
+ # MoIP::Client.notification(@params).should == response
434
+ # end
435
+ #
436
+ # it "should return valid status based on status code" do
437
+ # MoIP::STATUS[1].should == "authorized"
438
+ # MoIP::STATUS[2].should == "started"
439
+ # MoIP::STATUS[3].should == "printed"
440
+ # MoIP::STATUS[4].should == "completed"
441
+ # MoIP::STATUS[5].should == "canceled"
442
+ # MoIP::STATUS[6].should == "analysing"
443
+ # end
444
+ # end
445
+ #
446
+ # def id
447
+ # "transaction_" + Digest::SHA1.hexdigest([Time.now, rand].join)
448
+ # end
449
+ #
450
+ # def token
451
+ # "T2X0Q1N021E0B2S9U1P0V3Y0G1F570Y2P4M0P000M0Z0F0J0G0U4N6C7W5T9"
452
+ # end
453
+ #
454
+ # def collect_deprecations
455
+ # old_behavior = ActiveSupport::Deprecation.behavior
456
+ # deprecations = []
457
+ # ActiveSupport::Deprecation.behavior = Proc.new do |message, callstack|
458
+ # deprecations << message
459
+ # end
460
+ # result = yield
461
+ # deprecations
462
+ # ensure
463
+ # ActiveSupport::Deprecation.behavior = old_behavior
464
+ # end
465
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: marnen-moip
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.2.pre.39f9dab38fc33fe9bf614deb8e90ca166ab2d6bf
5
+ platform: ruby
6
+ authors:
7
+ - Guilherme Nascimento
8
+ - Marnen Laibow-Koser
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2010-11-10 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - ! '>='
19
+ - !ruby/object:Gem::Version
20
+ version: 2.1.0
21
+ type: :development
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ! '>='
26
+ - !ruby/object:Gem::Version
27
+ version: 2.1.0
28
+ - !ruby/object:Gem::Dependency
29
+ name: nokogiri
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ~>
33
+ - !ruby/object:Gem::Version
34
+ version: 1.5.0
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ~>
40
+ - !ruby/object:Gem::Version
41
+ version: 1.5.0
42
+ - !ruby/object:Gem::Dependency
43
+ name: httparty
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ~>
47
+ - !ruby/object:Gem::Version
48
+ version: 0.6.1
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ version: 0.6.1
56
+ - !ruby/object:Gem::Dependency
57
+ name: activesupport
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: 2.3.2
63
+ type: :runtime
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: 2.3.2
70
+ description: Gem para utilização da API MoIP
71
+ email:
72
+ - guilherme.ruby@gmail.com
73
+ - marnen@marnen.org
74
+ executables: []
75
+ extensions: []
76
+ extra_rdoc_files:
77
+ - LICENSE
78
+ - README.markdown
79
+ files:
80
+ - .document
81
+ - .gitignore
82
+ - Gemfile
83
+ - Gemfile.lock
84
+ - LICENSE
85
+ - README.markdown
86
+ - Rakefile
87
+ - VERSION
88
+ - lib/moip.rb
89
+ - lib/moip/client.rb
90
+ - lib/moip/direct_payment.rb
91
+ - moip.gemspec
92
+ - spec/moip_spec.rb
93
+ homepage: http://github.com/marnen/moip-ruby
94
+ licenses: []
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options:
98
+ - --charset=UTF-8
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ! '>='
104
+ - !ruby/object:Gem::Version
105
+ version: '0'
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ! '>'
109
+ - !ruby/object:Gem::Version
110
+ version: 1.3.1
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.1.11
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: Gem para utilização da API MoIP
117
+ test_files:
118
+ - spec/moip_spec.rb