pagamento_digital 0.1.2beta
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +2 -0
- data/Gemfile.lock +94 -0
- data/README.markdown +267 -0
- data/Rakefile +5 -0
- data/app/views/pagamento_digital/_form.erb +68 -0
- data/lib/pagamento_digital.rb +16 -0
- data/lib/pagamento_digital/action_controller.rb +11 -0
- data/lib/pagamento_digital/base.rb +123 -0
- data/lib/pagamento_digital/cacert.pem +3987 -0
- data/lib/pagamento_digital/developer_controller.rb +29 -0
- data/lib/pagamento_digital/engine.rb +4 -0
- data/lib/pagamento_digital/faker.rb +172 -0
- data/lib/pagamento_digital/generator.rb +12 -0
- data/lib/pagamento_digital/helper.rb +6 -0
- data/lib/pagamento_digital/notification.rb +247 -0
- data/lib/pagamento_digital/order.rb +106 -0
- data/lib/pagamento_digital/railtie.rb +26 -0
- data/lib/pagamento_digital/rake.rb +134 -0
- data/lib/pagamento_digital/routes.rb +4 -0
- data/lib/pagamento_digital/utils.rb +13 -0
- data/lib/pagamento_digital/version.rb +8 -0
- data/lib/tasks/pagamento_digital.rake +6 -0
- data/nbproject/private/config.properties +0 -0
- data/nbproject/private/private.properties +3 -0
- data/nbproject/private/rake-d.txt +0 -0
- data/nbproject/project.properties +9 -0
- data/nbproject/project.xml +15 -0
- data/pagamento_digital.gemspec +26 -0
- data/templates/config.rb +43 -0
- metadata +126 -0
@@ -0,0 +1,106 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PagamentoDigital
|
3
|
+
class Order
|
4
|
+
include ActionView::Helpers::NumberHelper
|
5
|
+
# Map all billing attributes that will be added as form inputs.
|
6
|
+
BILLING_MAPPING = {
|
7
|
+
:nome => "nome",
|
8
|
+
:cpf => "cpf",
|
9
|
+
:sexo => "sexo",
|
10
|
+
:data_nasc => 'data_nascimento',
|
11
|
+
:email => "email",
|
12
|
+
:telefone => "telefone",
|
13
|
+
:celular => "celular",
|
14
|
+
:endereco => "endereco",
|
15
|
+
:complemento => "complemento",
|
16
|
+
:bairro => "bairro",
|
17
|
+
:cidade => "cidade",
|
18
|
+
:estado => "estado",
|
19
|
+
:cep => "cep",
|
20
|
+
:free => "free",
|
21
|
+
:tipo_frete => "tipo_frete",
|
22
|
+
:desconto => "desconto",
|
23
|
+
:acrescimo => "acrescimo",
|
24
|
+
:razao_social => 'cliente_razao_social',
|
25
|
+
:cnpj => "cliente_cnpj",
|
26
|
+
:rg => 'rg',
|
27
|
+
:hash => "hash",
|
28
|
+
}
|
29
|
+
|
30
|
+
# The list of products added to the order
|
31
|
+
attr_accessor :products
|
32
|
+
|
33
|
+
# The billing info that will be sent to PagamentoDigital.
|
34
|
+
attr_accessor :billing
|
35
|
+
|
36
|
+
|
37
|
+
def frete= value
|
38
|
+
@frete = convert_unit(value, 2)
|
39
|
+
end
|
40
|
+
def frete
|
41
|
+
@frete
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
# Define the shipping type.
|
47
|
+
# Can be EN (PAC) or SD (Sedex)
|
48
|
+
#attr_accessor :tipo_frete
|
49
|
+
|
50
|
+
def initialize(order_id = nil)
|
51
|
+
reset!
|
52
|
+
self.id = order_id
|
53
|
+
self.billing = {}
|
54
|
+
end
|
55
|
+
|
56
|
+
# Set the order identifier. Should be a unique
|
57
|
+
# value to identify this order on your own application
|
58
|
+
def id=(identifier)
|
59
|
+
@id = identifier
|
60
|
+
end
|
61
|
+
|
62
|
+
# Get the order identifier
|
63
|
+
def id
|
64
|
+
@id
|
65
|
+
end
|
66
|
+
|
67
|
+
# Remove all products from this order
|
68
|
+
def reset!
|
69
|
+
@products = []
|
70
|
+
end
|
71
|
+
|
72
|
+
# Add a new product to the PagamentoDigital order
|
73
|
+
# The allowed values are:
|
74
|
+
# - weight (Optional. If float, will be multiplied by 1000g)
|
75
|
+
# - shipping (Optional. If float, will be multiplied by 100 cents)
|
76
|
+
# - quantity (Optional. Defaults to 1)
|
77
|
+
# - price (Required. If float, will be multiplied by 100 cents)
|
78
|
+
# - description (Required. Identifies the product)
|
79
|
+
# - id (Required. Should match the product on your database)
|
80
|
+
# - fees (Optional. If float, will be multiplied by 100 cents)
|
81
|
+
def <<(options)
|
82
|
+
options = {
|
83
|
+
:preco => nil,
|
84
|
+
:qtde => 1
|
85
|
+
}.merge(options)
|
86
|
+
|
87
|
+
# convert shipping to cents
|
88
|
+
#options[:frete] = convert_unit(options[:frete], 100)
|
89
|
+
# convert price to cents
|
90
|
+
options[:preco] = convert_unit(options[:preco], 2)
|
91
|
+
products.push(options)
|
92
|
+
end
|
93
|
+
|
94
|
+
def add(options)
|
95
|
+
self << options
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def convert_unit(number, unit)
|
100
|
+
|
101
|
+
number = number.to_f.round(unit) rescue 0
|
102
|
+
number = number_with_precision number, :precision => unit, :separator => '.', :delimiter => ' '
|
103
|
+
number
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module PagamentoDigital
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
# generators do
|
4
|
+
# require "pagamento_digital/generator"
|
5
|
+
# end
|
6
|
+
|
7
|
+
initializer :add_routing_paths do |app|
|
8
|
+
if PagSeguro.developer?
|
9
|
+
app.routes_reloader.paths.unshift(File.dirname(__FILE__) + "/routes.rb")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
rake_tasks do
|
14
|
+
load File.dirname(__FILE__) + "/../tasks/pagamento_digital.rake"
|
15
|
+
end
|
16
|
+
|
17
|
+
initializer "pagamento_digital.initialize" do |app|
|
18
|
+
::ActionView::Base.send(:include, PagamentoDigital::Helper)
|
19
|
+
::ActionController::Base.send(:include, PagamentoDigital::ActionController)
|
20
|
+
end
|
21
|
+
|
22
|
+
config.after_initialize do
|
23
|
+
require "pagamento_digital/developer_controller" if PagamentoDigital.developer?
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module PagamentoDigital
|
3
|
+
module Rake
|
4
|
+
extend self
|
5
|
+
def run
|
6
|
+
require "digest/md5"
|
7
|
+
|
8
|
+
env = ENV.inject({}) do |buffer, (name, value)|
|
9
|
+
value = value.respond_to?(:force_encoding) ? value.dup.force_encoding("UTF-8") : value
|
10
|
+
buffer.merge(name => value)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Not running in developer mode? Exit!
|
14
|
+
unless PagamentoDigital.developer?
|
15
|
+
puts "=> [PagamentoDigital] Can only notify development URLs"
|
16
|
+
puts "=> [PagamentoDigital] Double check your config/pagseguro.yml file"
|
17
|
+
exit 1
|
18
|
+
end
|
19
|
+
|
20
|
+
# There's no orders file! Exit!
|
21
|
+
unless File.exist?(PagamentoDigital::DeveloperController::ORDERS_FILE)
|
22
|
+
puts "=> [PagamentoDigital] No orders added. Exiting now!"
|
23
|
+
exit 1
|
24
|
+
end
|
25
|
+
|
26
|
+
# Load the orders file
|
27
|
+
orders = YAML.load_file(PagamentoDigital::DeveloperController::ORDERS_FILE)
|
28
|
+
|
29
|
+
# Ops! No orders added! Exit!
|
30
|
+
unless orders
|
31
|
+
puts "=> [PagamentoDigital] No invoices created. Exiting now!"
|
32
|
+
exit 1
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get the specified order
|
36
|
+
order = orders[env["ID"]]
|
37
|
+
|
38
|
+
# Not again! No order! Exit!
|
39
|
+
unless order
|
40
|
+
puts "=> [PagamentoDigital] The order #{env['ID'].inspect} could not be found. Exiting now!"
|
41
|
+
exit 1
|
42
|
+
end
|
43
|
+
|
44
|
+
# Set the client's info
|
45
|
+
name = env.fetch("NAME", Faker.name)
|
46
|
+
email = env.fetch("EMAIL", Faker.email)
|
47
|
+
|
48
|
+
order["cliente_nome"] = name
|
49
|
+
order["cliente_email"] = email
|
50
|
+
order["cliente_endereco"] = Faker.street_name + ", Nº #{rand(1000)}"
|
51
|
+
|
52
|
+
order["cliente_complemento"] = Faker.secondary_address
|
53
|
+
order["cliente_bairro"] = Faker.city
|
54
|
+
order["cliente_cidade"] = Faker.city
|
55
|
+
order["cliente_estado"] = Faker.state
|
56
|
+
|
57
|
+
order["cliente_cep"] = Faker.zipcode
|
58
|
+
order["cliente_telefone"] = Faker.phone_number
|
59
|
+
order["cliente_celular"] = Faker.phone_number
|
60
|
+
|
61
|
+
# Set the transaction date
|
62
|
+
order["data_transacao"] = Time.now.strftime("%d/%m/%Y %H:%M:%S")
|
63
|
+
|
64
|
+
# Replace the order id to the correct name
|
65
|
+
order["id_pedido"] = order.delete("id_pedido")
|
66
|
+
|
67
|
+
|
68
|
+
to_price = proc do |price|
|
69
|
+
if price.to_s =~ /^(.*?)[,\.](.*?)$/
|
70
|
+
"#{$1}.#{$2}".to_f.round
|
71
|
+
else
|
72
|
+
"0.00".to_f.round
|
73
|
+
end
|
74
|
+
end
|
75
|
+
sum_valor_produtos = 0
|
76
|
+
index = 0
|
77
|
+
loop do
|
78
|
+
index+=1
|
79
|
+
break unless order.has_key?("produto_valor_#{index}")
|
80
|
+
order["produto_codigo_#{index}"] = order.delete("produto_codigo_#{index}")
|
81
|
+
order["produto_descricao_#{index}"] = order.delete("produto_descricao_#{index}")
|
82
|
+
order["produto_valor_#{index}"] = to_price.call(order.delete("produto_valor_#{index}"))
|
83
|
+
order["produto_qtde_#{index}"] = order.delete("produto_qtde_#{index}")
|
84
|
+
#soma produtos
|
85
|
+
sum_valor_produtos += order["produto_valor_#{index}"].to_f * order["produto_qtde_#{index}"].to_f
|
86
|
+
end
|
87
|
+
|
88
|
+
order['frete'] = to_price.call(order.delete "frete")
|
89
|
+
|
90
|
+
order['valor_original'] = sum_valor_produtos + order['frete'].to_f
|
91
|
+
order['valor_loja'] = order['valor_original']
|
92
|
+
order['valor_total'] = order['valor_loja'] + 1.5#taxa só para sacanear
|
93
|
+
|
94
|
+
# Retrieve the specified status or default to :completed
|
95
|
+
status = env.fetch("COD_STATUS", :aprovada).to_sym
|
96
|
+
|
97
|
+
# Retrieve the specified payment method or default to :credit_card
|
98
|
+
payment_method = env.fetch("PAYMENT_METHOD", :credicard_visa).to_sym
|
99
|
+
|
100
|
+
# Set a random transaction id
|
101
|
+
order["id_transacao"] = Digest::MD5.hexdigest(Time.now.to_s)
|
102
|
+
|
103
|
+
# Set note
|
104
|
+
order["free"] = env["NOTE"].to_s
|
105
|
+
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
# Retrieve index
|
110
|
+
index = proc do |hash, value|
|
111
|
+
if hash.respond_to?(:key)
|
112
|
+
hash.key(value)
|
113
|
+
else
|
114
|
+
hash.index(value)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
# Set payment method and status
|
119
|
+
order["tipo_pagamento"] = index[PagamentoDigital::Notification::PAYMENT_METHOD, payment_method]
|
120
|
+
order["cod_status"] = index[PagamentoDigital::Notification::COD_STATUS, status]
|
121
|
+
|
122
|
+
# Finally, ping the configured return URL
|
123
|
+
|
124
|
+
uri = URI.parse File.join(PagamentoDigital.config["base"], PagamentoDigital.config["return_to"])
|
125
|
+
response = Net::HTTP.post_form uri, order
|
126
|
+
basedir = "#{Rails.root}/tmp/pagamento_digital"
|
127
|
+
FileUtils.makedirs basedir
|
128
|
+
tmp = File.open("#{basedir}/#{order['id_pedido']}.html",'w'){|out| out << PagamentoDigital::Utils.to_utf8(response.body)}
|
129
|
+
puts "saida salva em #{tmp.path}"
|
130
|
+
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,9 @@
|
|
1
|
+
file.reference.pagamento_digital-app=app
|
2
|
+
file.reference.pagamento_digital-lib=lib
|
3
|
+
javac.classpath=
|
4
|
+
lib.dir=${file.reference.pagamento_digital-lib}
|
5
|
+
main.file=
|
6
|
+
platform.active=Ruby_0
|
7
|
+
source.encoding=UTF-8
|
8
|
+
src.dir=${file.reference.pagamento_digital-app}
|
9
|
+
src.templates.dir=templates
|
@@ -0,0 +1,15 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<project xmlns="http://www.netbeans.org/ns/project/1">
|
3
|
+
<type>org.netbeans.modules.ruby.rubyproject</type>
|
4
|
+
<configuration>
|
5
|
+
<data xmlns="http://www.netbeans.org/ns/ruby-project/1">
|
6
|
+
<name>pagamento_digital</name>
|
7
|
+
<source-roots>
|
8
|
+
<root id="src.templates.dir"/>
|
9
|
+
<root id="src.dir"/>
|
10
|
+
<root id="lib.dir"/>
|
11
|
+
</source-roots>
|
12
|
+
<test-roots/>
|
13
|
+
</data>
|
14
|
+
</configuration>
|
15
|
+
</project>
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "pagamento_digital/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "pagamento_digital"
|
7
|
+
s.version = PagamentoDigital::Version::STRING
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Reinaldo Mendes"]
|
10
|
+
s.email = ["reinaldombox-blog@yahoo.com.br"]
|
11
|
+
s.homepage = "http://rubygems.org/gems/pagamento_digital"
|
12
|
+
s.summary = "Pagamento digital alpha, usar por sua conta"
|
13
|
+
s.description = s.summary
|
14
|
+
|
15
|
+
s.files = `git ls-files`.split("\n")
|
16
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
17
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_development_dependency "rails" , "~> 3.1"
|
21
|
+
s.add_development_dependency "rake" , "~> 0.9"
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
end
|
data/templates/config.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
################################################################
|
2
|
+
#######só para exemplo utilizar da forma que melhor entender
|
3
|
+
################################################################
|
4
|
+
_pagamento = {
|
5
|
+
}
|
6
|
+
def pagamento.config
|
7
|
+
{
|
8
|
+
:email => "xxx@xxx.com",
|
9
|
+
:token => "xxxxxxxxxxxx"
|
10
|
+
}
|
11
|
+
end
|
12
|
+
def pagamento.reload
|
13
|
+
self
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
################################################################################
|
18
|
+
#_pagamento = FormaPagamento.find_by_chave('pagamento_digital')
|
19
|
+
lambda_retorno = lambda{Rails.application.routes.url_helpers.send :pagamento_digital_retorno_url }
|
20
|
+
|
21
|
+
#redirect após pagamento
|
22
|
+
return_to lambda_retorno
|
23
|
+
#notificaçoes retorno automático
|
24
|
+
url_aviso lambda_retorno
|
25
|
+
#email da loja
|
26
|
+
email lambda{_pagamento.reload.config[:email]}
|
27
|
+
#token gerado para sua conta
|
28
|
+
authenticity_token lambda{_pagamento.config[:token]}
|
29
|
+
|
30
|
+
|
31
|
+
development do
|
32
|
+
developer true #modo de desenvolvimento
|
33
|
+
base "http://localhost:3000" #url base do servidor só necessário para developer
|
34
|
+
end
|
35
|
+
|
36
|
+
|
37
|
+
#production do
|
38
|
+
# #developer false
|
39
|
+
## email lambda{_pagamento.reload.config[:email]}
|
40
|
+
## authenticity_token lambda{_pagamento.reload.config[:token]}
|
41
|
+
#end
|
42
|
+
|
43
|
+
|
metadata
ADDED
@@ -0,0 +1,126 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pagamento_digital
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
hash: 699835116
|
5
|
+
prerelease: 5
|
6
|
+
segments:
|
7
|
+
- 0
|
8
|
+
- 1
|
9
|
+
- 2
|
10
|
+
- beta
|
11
|
+
version: 0.1.2beta
|
12
|
+
platform: ruby
|
13
|
+
authors:
|
14
|
+
- Reinaldo Mendes
|
15
|
+
autorequire:
|
16
|
+
bindir: bin
|
17
|
+
cert_chain: []
|
18
|
+
|
19
|
+
date: 2012-03-26 00:00:00 Z
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rails
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
hash: 5
|
30
|
+
segments:
|
31
|
+
- 3
|
32
|
+
- 1
|
33
|
+
version: "3.1"
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: rake
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ~>
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
hash: 25
|
45
|
+
segments:
|
46
|
+
- 0
|
47
|
+
- 9
|
48
|
+
version: "0.9"
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
51
|
+
description: Pagamento digital alpha, usar por sua conta
|
52
|
+
email:
|
53
|
+
- reinaldombox-blog@yahoo.com.br
|
54
|
+
executables: []
|
55
|
+
|
56
|
+
extensions: []
|
57
|
+
|
58
|
+
extra_rdoc_files: []
|
59
|
+
|
60
|
+
files:
|
61
|
+
- Gemfile
|
62
|
+
- Gemfile.lock
|
63
|
+
- README.markdown
|
64
|
+
- Rakefile
|
65
|
+
- app/views/pagamento_digital/_form.erb
|
66
|
+
- lib/pagamento_digital.rb
|
67
|
+
- lib/pagamento_digital/action_controller.rb
|
68
|
+
- lib/pagamento_digital/base.rb
|
69
|
+
- lib/pagamento_digital/cacert.pem
|
70
|
+
- lib/pagamento_digital/developer_controller.rb
|
71
|
+
- lib/pagamento_digital/engine.rb
|
72
|
+
- lib/pagamento_digital/faker.rb
|
73
|
+
- lib/pagamento_digital/generator.rb
|
74
|
+
- lib/pagamento_digital/helper.rb
|
75
|
+
- lib/pagamento_digital/notification.rb
|
76
|
+
- lib/pagamento_digital/order.rb
|
77
|
+
- lib/pagamento_digital/railtie.rb
|
78
|
+
- lib/pagamento_digital/rake.rb
|
79
|
+
- lib/pagamento_digital/routes.rb
|
80
|
+
- lib/pagamento_digital/utils.rb
|
81
|
+
- lib/pagamento_digital/version.rb
|
82
|
+
- lib/tasks/pagamento_digital.rake
|
83
|
+
- nbproject/private/config.properties
|
84
|
+
- nbproject/private/private.properties
|
85
|
+
- nbproject/private/rake-d.txt
|
86
|
+
- nbproject/project.properties
|
87
|
+
- nbproject/project.xml
|
88
|
+
- pagamento_digital.gemspec
|
89
|
+
- templates/config.rb
|
90
|
+
homepage: http://rubygems.org/gems/pagamento_digital
|
91
|
+
licenses: []
|
92
|
+
|
93
|
+
post_install_message:
|
94
|
+
rdoc_options: []
|
95
|
+
|
96
|
+
require_paths:
|
97
|
+
- lib
|
98
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
99
|
+
none: false
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
hash: 3
|
104
|
+
segments:
|
105
|
+
- 0
|
106
|
+
version: "0"
|
107
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
108
|
+
none: false
|
109
|
+
requirements:
|
110
|
+
- - ">"
|
111
|
+
- !ruby/object:Gem::Version
|
112
|
+
hash: 25
|
113
|
+
segments:
|
114
|
+
- 1
|
115
|
+
- 3
|
116
|
+
- 1
|
117
|
+
version: 1.3.1
|
118
|
+
requirements: []
|
119
|
+
|
120
|
+
rubyforge_project:
|
121
|
+
rubygems_version: 1.8.15
|
122
|
+
signing_key:
|
123
|
+
specification_version: 3
|
124
|
+
summary: Pagamento digital alpha, usar por sua conta
|
125
|
+
test_files: []
|
126
|
+
|