pagamento_digital 0.1.2beta

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,94 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pagamento_digital (0.1.1.6alpha)
5
+
6
+ GEM
7
+ remote: http://rubygems.org/
8
+ specs:
9
+ actionmailer (3.1.1)
10
+ actionpack (= 3.1.1)
11
+ mail (~> 2.3.0)
12
+ actionpack (3.1.1)
13
+ activemodel (= 3.1.1)
14
+ activesupport (= 3.1.1)
15
+ builder (~> 3.0.0)
16
+ erubis (~> 2.7.0)
17
+ i18n (~> 0.6)
18
+ rack (~> 1.3.2)
19
+ rack-cache (~> 1.1)
20
+ rack-mount (~> 0.8.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.0.2)
23
+ activemodel (3.1.1)
24
+ activesupport (= 3.1.1)
25
+ builder (~> 3.0.0)
26
+ i18n (~> 0.6)
27
+ activerecord (3.1.1)
28
+ activemodel (= 3.1.1)
29
+ activesupport (= 3.1.1)
30
+ arel (~> 2.2.1)
31
+ tzinfo (~> 0.3.29)
32
+ activeresource (3.1.1)
33
+ activemodel (= 3.1.1)
34
+ activesupport (= 3.1.1)
35
+ activesupport (3.1.1)
36
+ multi_json (~> 1.0)
37
+ arel (2.2.1)
38
+ builder (3.0.0)
39
+ erubis (2.7.0)
40
+ hike (1.2.1)
41
+ i18n (0.6.0)
42
+ json (1.6.1)
43
+ mail (2.3.0)
44
+ i18n (>= 0.4.0)
45
+ mime-types (~> 1.16)
46
+ treetop (~> 1.4.8)
47
+ mime-types (1.17.2)
48
+ multi_json (1.0.3)
49
+ polyglot (0.3.3)
50
+ rack (1.3.5)
51
+ rack-cache (1.1)
52
+ rack (>= 0.4)
53
+ rack-mount (0.8.3)
54
+ rack (>= 1.0.0)
55
+ rack-ssl (1.3.2)
56
+ rack
57
+ rack-test (0.6.1)
58
+ rack (>= 1.0)
59
+ rails (3.1.1)
60
+ actionmailer (= 3.1.1)
61
+ actionpack (= 3.1.1)
62
+ activerecord (= 3.1.1)
63
+ activeresource (= 3.1.1)
64
+ activesupport (= 3.1.1)
65
+ bundler (~> 1.0)
66
+ railties (= 3.1.1)
67
+ railties (3.1.1)
68
+ actionpack (= 3.1.1)
69
+ activesupport (= 3.1.1)
70
+ rack-ssl (~> 1.3.2)
71
+ rake (>= 0.8.7)
72
+ rdoc (~> 3.4)
73
+ thor (~> 0.14.6)
74
+ rake (0.9.2.2)
75
+ rdoc (3.11)
76
+ json (~> 1.4)
77
+ sprockets (2.0.3)
78
+ hike (~> 1.2)
79
+ rack (~> 1.0)
80
+ tilt (~> 1.1, != 1.3.0)
81
+ thor (0.14.6)
82
+ tilt (1.3.3)
83
+ treetop (1.4.10)
84
+ polyglot
85
+ polyglot (>= 0.3.1)
86
+ tzinfo (0.3.31)
87
+
88
+ PLATFORMS
89
+ ruby
90
+
91
+ DEPENDENCIES
92
+ pagamento_digital!
93
+ rails (~> 3.1)
94
+ rake (~> 0.9)
data/README.markdown ADDED
@@ -0,0 +1,267 @@
1
+ # PagamentoDigital
2
+
3
+ ## Atenção esta gem é ALPHA utilize por sua CONTA e RISCO
4
+ ### Não dou suporte para esta gem, faça um fork e modifique o quanto quiser
5
+
6
+
7
+ Este é um plugin do Ruby on Rails que permite utilizar o [PagamentoDigital](www.pagamentodigital.com.br).
8
+
9
+ ## SOBRE O PAGAMENTO DIGITAL
10
+
11
+ ### Retorno Automático
12
+
13
+ Após o processo de compra e pagamento, o usuário é enviado de volta a seu site. Para isso, você deve configurar uma [URL de retorno](https://www.pagamentodigital.com.br/site/Integracao/RetornoAutomatico).
14
+
15
+ Antes de enviar o usuário para essa URL, o robô do PagamentoDigital faz um POST para ela, em segundo plano, com os dados e status da transação. Lendo esse POST, você pode obter o status do pedido. Se o pagamento entrou em análise, ou se o usuário pagou usando boleto bancário, o status será "Aguardando Pagamento" ou "Em Análise". Nesses casos, quando a transação for confirmada (o que pode acontecer alguns dias depois) a loja receberá outro POST, informando o novo status. **Cada vez que a transação muda de status, um POST é enviado.**
16
+
17
+ ## REQUISITOS
18
+
19
+ A versão atual que está sendo mantida suporta Rails 3.0.0 ou superior.
20
+
21
+
22
+ ### Configuração
23
+
24
+ O primeiro passo é instalar a biblioteca. Para isso, basta executar o comando
25
+
26
+ gem install PagamentoDigital
27
+
28
+ Adicione a biblioteca ao arquivo Gemfile:
29
+
30
+ ~~~.ruby
31
+ gem "pagamento_digital"
32
+ ~~~
33
+
34
+ Lembre-se de utilizar a versão que você acabou de instalar.
35
+
36
+ Depois de instalar a biblioteca, você precisará executar gerar o arquivo de configuração, que deve residir em `config/PagamentoDigital.yml`. Para gerar um arquivo de modelo execute
37
+
38
+ rails generate PagamentoDigital:install
39
+
40
+ O arquivo de configuração gerado será parecido com isto:
41
+
42
+ ~~~.rb
43
+ #...
44
+ lambda_retorno = lambda{Rails.application.routes.url_helpers.send :pagamento_digital_retorno_url }
45
+
46
+ #redirect após pagamento
47
+ return_to lambda_retorno
48
+ #notificaçoes retorno automático
49
+ url_aviso lambda_retorno
50
+ #email da loja
51
+ email lambda{_pagamento.config[:email]}
52
+ #token gerado para sua conta
53
+ authenticity_token lambda{_pagamento.config[:token]}
54
+
55
+
56
+ development do
57
+ developer true #modo de desenvolvimento
58
+ base "http://localhost:3000" #url base do servidor só necessário para developer
59
+ end
60
+ ~~~
61
+
62
+ Esta gem possui um modo de desenvolvimento que permite simular a realização de pedidos e envio de notificações; basta utilizar a opção `developer`. Ela é ativada por padrão nos ambientes de desenvolvimento e teste. Você deve configurar as opções `base`, que deverá apontar para o seu servidor e a URL de retorno, que deverá ser configurada no próprio [PagamentoDigital](https://PagamentoDigital.uol.com.br/?ind=689659), na página <https://PagamentoDigital.uol.com.br/Security/ConfiguracoesWeb/RetornoAutomatico.aspx>.
63
+
64
+ Para o ambiente de produção, que irá efetivamente enviar os dados para o [PagamentoDigital](https://PagamentoDigital.uol.com.br/?ind=689659), você precisará adicionar o e-mail cadastrado como vendedor e o `authenticity_token`, que é o Token para Conferência de Segurança, que pode ser conseguido na página <https://PagamentoDigital.uol.com.br/Security/ConfiguracoesWeb/RetornoAutomatico.aspx>.
65
+
66
+ ### Montando o formulário
67
+
68
+ Para montar o seu formulário, você deverá utilizar a classe `PagamentoDigital::Order`. Esta classe deverá ser instanciada recebendo um identificador único do pedido. Este identificador permitirá identificar o pedido quando o [PagamentoDigital](https://PagamentoDigital.uol.com.br/?ind=689659) notificar seu site sobre uma alteração no status do pedido.
69
+
70
+ ~~~.ruby
71
+ class CartController < ApplicationController
72
+ def checkout
73
+ # Busca o pedido associado ao usuario; esta logica deve
74
+ # ser implementada por voce, da maneira que achar melhor
75
+ @invoice = current_user.invoices.last
76
+
77
+ # Instanciando o objeto para geracao do formulario
78
+ @order = PagamentoDigital::Order.new(@invoice.id)
79
+
80
+ # adicionando os produtos do pedido ao objeto do formulario
81
+ @invoice.products.each do |product|
82
+ # Estes sao os atributos necessarios. Por padrao, peso (:weight) eh definido para 0,
83
+ # quantidade eh definido como 1 e frete (:shipping) eh definido como 0.
84
+ @order.add :id => product.id, :preco => product.price, :descricao => product.title, :qtde => 1
85
+ end
86
+ end
87
+ end
88
+ ~~~
89
+
90
+ Se você precisar, pode definir os dados de cobrança com o método `billing`.
91
+
92
+ ~~~.ruby
93
+ @order.billing = {
94
+ :nome => "nome",
95
+ :cpf => "cpf",
96
+ :sexo => "sexo",
97
+ :data_nasc => 'data_nascimento',
98
+ :email => "email",
99
+ :telefone => "telefone",
100
+ :celular => "celular",
101
+ :endereco => "endereco",
102
+ :complemento => "complemento",
103
+ :bairro => "bairro",
104
+ :cidade => "cidade",
105
+ :estado => "estado",
106
+ :cep => "cep",
107
+ :free => "free",
108
+ :tipo_frete => "tipo_frete",
109
+ :desconto => "desconto",
110
+ :acrescimo => "acrescimo",
111
+ :razao_social => 'cliente_razao_social',
112
+ :cnpj => "cliente_cnpj",
113
+ :rg => 'rg',
114
+ :hash => "hash",
115
+ }
116
+ ~~~
117
+
118
+ Depois que você definiu os produtos do pedido, você pode exibir o formulário.
119
+
120
+ ~~~.erb
121
+ <!-- app/views/cart/checkout.html.erb -->
122
+ <%= pagamento_digital_form @order, :submit => "Efetuar pagamento!" %>
123
+ ~~~
124
+
125
+ Por padrão, o formulário é enviado para o email no arquivo de configuração. Você pode mudar o email com a opção `:email`.
126
+
127
+ ~~~.erb
128
+ <%= PagamentoDigital_form @order, :submit => "Efetuar pagamento!", :email => @account.email %>
129
+ ~~~
130
+
131
+ ### Recebendo notificações
132
+
133
+ Toda vez que o status de pagamento for alterado, o [PagamentoDigital](http://www.pagamentodigital.com.br) irá notificar sua URL de retorno com diversos dados. Você pode interceptar estas notificações com o método `PagamentoDigital_notification`. O bloco receberá um objeto da classe `PagamentoDigital::Notification` e só será executado se for uma notificação verificada junto ao [PagamentoDigital](http://www.pagamentodigital.com.br).
134
+
135
+ ~~~.ruby
136
+ class CartController < ApplicationController
137
+ skip_before_filter :verify_authenticity_token
138
+
139
+ def confirm
140
+ return unless request.post?
141
+
142
+ pagamento_digital_notification do |notification|
143
+ # Aqui voce deve verificar se o pedido possui os mesmos produtos
144
+ # que voce cadastrou. O produto soh deve ser liberado caso o status
145
+ # do pedido seja "completed" ou "approved"
146
+ #exemplo abaixo#
147
+ valor_notify = notification.valor_original.to_f.round(2) #valor que veio do pagamento digital
148
+ valor_loja = @pedido.preco_final.to_f.round(2) #valor que está em sua loja
149
+ raise "valor retornado pelo pagamento digital é diferente que preço da loja
150
+ p. digital=#{valor_notify} loja=#{valor_loja}" if valor_notify != valor_loja
151
+ if notification.valid?#valida a notificação antes de prosseguir
152
+ if notification.aprovada? #status aprovada
153
+ @pedido.status_financeiro = Pedido::StatusFinanceiro::PAGO
154
+ elsif notification.cancelada? #cancelada
155
+ @pedido.status_financeiro = Pedido::StatusFinanceiro::CANCELADO
156
+ @pedido.status_processo = Pedido::StatusProcesso::CANCELADO #cancela faz estorno ect...
157
+ else
158
+ #//pendente não faz nada
159
+ end
160
+ end
161
+ end
162
+
163
+ render :nothing => true
164
+ end
165
+ end
166
+ ~~~
167
+ O método `pagamento_digital_notification` também pode receber como parâmetro o `authenticity_token` que será usado pra verificar a autenticação.
168
+
169
+ ~~~.ruby
170
+ class CartController < ApplicationController
171
+ skip_before_filter :verify_authenticity_token
172
+
173
+ def confirm
174
+ return unless request.post?
175
+ # Se voce receber pagamentos de contas diferentes, pode passar o
176
+ # authenticity_token adequado como parametro para PagamentoDigital_notification
177
+ account = Account.find(params[:seller_id])
178
+ pagamento_digital_notification(account.authenticity_token) do |notification|
179
+
180
+ end
181
+
182
+ render :nothing => true
183
+ end
184
+ end
185
+ ~~~
186
+
187
+ O objeto `notification` possui os seguintes métodos:
188
+
189
+ * `PagamentoDigital::Notification#products`: Lista de produtos enviados na notificação.
190
+ * `PagamentoDigital::Notification#frete`: Valor do frete
191
+ * `PagamentoDigital::Notification#status`: Status do pedido
192
+ * `PagamentoDigital::Notification#payment_method`: Tipo de pagamento
193
+ * `PagamentoDigital::Notification#processed_at`: Data e hora da transação
194
+ * `PagamentoDigital::Notification#cliente`: Dados do comprador
195
+ * `PagamentoDigital::Notification#valid?(force=false)`: Verifica se a notificação é válida, confirmando-a junto ao PagamentoDigital. A resposta é jogada em cache e pode ser forçada com `PagamentoDigital::Notification#valid?(:force)`
196
+
197
+ **ATENÇÃO:** Não se esqueça de adicionar `skip_before_filter :verify_authenticity_token` ao controller que receberá a notificação; caso contrário, uma exceção será lançada.
198
+
199
+ ### Utilizando modo de desenvolvimento
200
+
201
+ Toda vez que você enviar o formulário no modo de desenvolvimento, um arquivo YAML será criado em `tmp/PagamentoDigital-#{Rails.env}.yml`. Esse arquivo conterá todos os pedidos enviados.
202
+
203
+ Depois, você será redirecionado para a URL de retorno que você configurou no arquivo `config/PagamentoDigital.yml`. Para simular o envio de notificações, você deve utilizar a rake `PagamentoDigital:notify`.
204
+
205
+ $ rake PagamentoDigital:notify ID=<id do pedido>
206
+
207
+ O ID do pedido deve ser o mesmo que foi informado quando você instanciou a class `PagamentoDigital::Order`. Por padrão, o status do pedido será `completed` e o tipo de pagamento `credit_card`. Você pode especificar esses parâmetros como no exemplo abaixo.
208
+
209
+ $ rake PagamentoDigital:notify ID=1 PAYMENT_METHOD=boleto STATUS=canceled NOTE="Enviar por motoboy" NAME="José da Silva" EMAIL="jose@dasilva.com"
210
+
211
+ #### PAYMENT_METHOD
212
+
213
+ * `credicard_visa`: Cartão de crédito visa
214
+ * `credicard_mastercard`: Cartão de crédito mastercard
215
+ * `credicard_amex`: Cartão de crédito amex
216
+ * `credicard_diners`: Cartão de crédito diners
217
+ * `credicard_aura`: Cartão de crédito Aura
218
+ * `credicard_hiper`: Cartão de crédito HiperCard
219
+ * `boleto`: Boleto
220
+ * `trans_bb`: Transferencia online Banco do Brasil
221
+ * `trans_bradesco`: Transferenciaonline Bradesco
222
+ * `trans_itau`: Transferencia online Itau
223
+ * `trans_banrisul`: Transferencia online Banrisul
224
+ * `trans_hsbc`: Transferencia online HSBC
225
+
226
+
227
+ #### STATUS
228
+
229
+ * `aprovada`: aprovada
230
+ * `pendente`: Aguardando pagamento
231
+ * `cancelada`: Cancelada
232
+
233
+
234
+ ### Codificação (Encoding)
235
+
236
+ Esta biblioteca assume que você está usando UTF-8 como codificação de seu projeto. Neste caso, o único ponto onde os dados são convertidos para UTF-8 é quando uma notificação é enviada do UOL em ISO-8859-1.
237
+
238
+ Se você usa sua aplicação como ISO-8859-1, esta biblioteca NÃO IRÁ FUNCIONAR. Nenhum patch dando suporte ao ISO-8859-1 será aplicado; você sempre pode manter o seu próprio fork, caso precise.
239
+
240
+
241
+ ## AUTOR:
242
+
243
+ Reinaldo Mendes (http://reinaldo-mendes.blogspot.com/) baseado em https://github.com/fnando/pagseguro
244
+
245
+
246
+ ## LICENÇA:
247
+
248
+ (The MIT License)
249
+
250
+ Permission is hereby granted, free of charge, to any person obtaining
251
+ a copy of this software and associated documentation files (the
252
+ 'Software'), to deal in the Software without restriction, including
253
+ without limitation the rights to use, copy, modify, merge, publish,
254
+ distribute, sublicense, and/or sell copies of the Software, and to
255
+ permit persons to whom the Software is furnished to do so, subject to
256
+ the following conditions:
257
+
258
+ The above copyright notice and this permission notice shall be
259
+ included in all copies or substantial portions of the Software.
260
+
261
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
262
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
263
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
264
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
265
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
266
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
267
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,5 @@
1
+ require "bundler"
2
+ Bundler::GemHelper.install_tasks
3
+
4
+ require "rspec/core/rake_task"
5
+ RSpec::Core::RakeTask.new
@@ -0,0 +1,68 @@
1
+ <%
2
+ hash_fields = {}
3
+
4
+ options[:url_retorno] = options.fetch(:url_retorno, PagamentoDigital.config["return_to"])
5
+ if options[:url_retorno].present?
6
+ #URL completa para onde seu cliente será direcionado depois da finalização do pedido no Pagamento Digital.
7
+ hash_fields = hash_fields.merge! (
8
+ {
9
+ "url_retorno" => options[:url_retorno],
10
+ "redirect" => 'true',
11
+ "redirect_time" => options.fetch(:redirect_time, PagamentoDigital.config["redirect_time"])
12
+ }
13
+ )
14
+ end
15
+
16
+
17
+ options[:url_aviso] = options.fetch(:url_aviso, PagamentoDigital.config["url_aviso"])
18
+ options[:url_aviso] ||= options[:url_retorno]
19
+ if options[:url_aviso].present?
20
+ hash_fields = hash_fields.merge! "url_aviso" => options[:url_aviso]
21
+ end
22
+
23
+ hash_fields = hash_fields.merge! ({
24
+ #"encoding" => 'UTF-8',
25
+ 'email_loja' => options.fetch(:email, PagamentoDigital.config["email"]),
26
+ 'tipo_integracao' => 'PAD',
27
+ 'id_pedido' => order.id,
28
+ 'frete' => order.frete
29
+ } )
30
+
31
+
32
+ order.products.each_with_index do |product, i|
33
+ i+=1
34
+ hash_fields = hash_fields.merge! ({
35
+ :"produto_qtde_#{i}" => product[:qtde],
36
+ :"produto_codigo_#{i}" => product[:id],
37
+ :"produto_descricao_#{i}" => product[:descricao],
38
+ :"produto_valor_#{i}" => product[:preco],
39
+
40
+ })
41
+ end
42
+
43
+ order.billing.each do |name, value|
44
+ key = PagamentoDigital::Order::BILLING_MAPPING[name.to_sym]
45
+ value = number_with_precision value, :precision => 2, :separator => '.', :delimiter => ' ' if ['desconto'].include? name.to_s
46
+ hash_fields[key] = value
47
+ end
48
+
49
+ to_gen_md5 = hash_fields.sort {|a,b| a[0].to_s <=> b[0].to_s }.map{|key,value|
50
+ "#{key}=#{URI.escape(value.to_s)}"
51
+ }.join('&')+PagamentoDigital.config[:authenticity_token]
52
+
53
+ #hash_fields[:hash] = Digest::MD5.hexdigest(to_gen_md5)
54
+
55
+
56
+ %>
57
+
58
+
59
+
60
+
61
+ <form action="<%=PagamentoDigital.gateway_url%>" method='post' style="display:none">
62
+ <%= hash_fields.map{ |k,v| label_tag{text_field_tag(k,v)+k} }.join("\n<br/>").html_safe %>
63
+ <%= submit_tag options[:submit] %>
64
+ </form>
65
+
66
+ <%#*<script>%>
67
+ <%#*document.getElementById('pagamento_digital_form').style.display='';%>
68
+ <%#*</script>%>
@@ -0,0 +1,16 @@
1
+ require "net/https"
2
+ require "uri"
3
+ require "time"
4
+ require 'digest/md5'
5
+
6
+
7
+ require "pagamento_digital/base"
8
+ require "pagamento_digital/engine"
9
+ require "pagamento_digital/faker"
10
+ require "pagamento_digital/rake"
11
+ require "pagamento_digital/railtie"
12
+ require "pagamento_digital/notification"
13
+ require "pagamento_digital/order"
14
+ require "pagamento_digital/action_controller"
15
+ require "pagamento_digital/helper"
16
+ require "pagamento_digital/utils"