cielo-ws15 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 14f65e9edcee6d1d490c57a751e224dafe60645f
4
+ data.tar.gz: 0adb601a95ed3140e120713a5311cf8b57abee6c
5
+ SHA512:
6
+ metadata.gz: a88aab5616c3af7dc90b6f539065b82d30861454650d2af4db0d2bed8b67f61fd37b330181bc816ee676408ee7e83acd45c472ea6f3129727b9725823f65fb72
7
+ data.tar.gz: 25bf32a0b05a3b17968d4270280937ed39d484e46519cb5a915c0b0635a5b1af028b83e0d8a76cc0d1ddb393ab7d80e683077e66fa2390fd5dd7553c2789162a
data/lib/cielo/ws15.rb ADDED
@@ -0,0 +1,214 @@
1
+ require "cielo/ws15/holder"
2
+ require "cielo/ws15/merchant"
3
+ require "cielo/ws15/order"
4
+ require "cielo/ws15/payment_method"
5
+ require "cielo/ws15/transaction"
6
+ require "cielo/ws15/token"
7
+
8
+ require "cielo/ws15/authorization_message"
9
+ require "cielo/ws15/cancellation_message"
10
+ require "cielo/ws15/capture_message"
11
+ require "cielo/ws15/transaction_message"
12
+ require "cielo/ws15/token_message"
13
+ require "net/http"
14
+
15
+ # SDK de integração com o Webservice 1.5 da Cielo
16
+ module Cielo
17
+ # Integração com o Webservice 1.5; esse participante faz um papel de facilitador
18
+ # para a construção de todos os participantes importantes para a integração.
19
+ # Através de factory methods, é possível criar as instâncias pré-configuradas
20
+ # com os parâmetros mínimos necessários para a execução das operações.
21
+ class WS15
22
+ # Ambiente de produção da Cielo
23
+ PRODUCTION = "https://ecommerce.cielo.com.br/servicos/ecommwsec.do"
24
+
25
+ # Ambiente de testes da Cielo
26
+ TEST = "https://qasecommerce.cielo.com.br/servicos/ecommwsec.do"
27
+
28
+ # Namespace dos XML de requisição e resposta
29
+ NAMESPACE = "http://ecommerce.cbmp.com.br"
30
+
31
+ # Versão do XML utilizado na integração
32
+ VERSION = "1.3.0"
33
+
34
+ attr_accessor :merchant, :endpoint
35
+ private :merchant, :endpoint
36
+
37
+ # Inicializa uma nova instância de WS15 informando as credenciais e o ambiente
38
+ #
39
+ # @param affiliation_id [String] Número de afiliação na Cielo
40
+ # @param affiliation_key [String] Chave de afiliação
41
+ # @param endpoint [String] Ambiente onde será executada a integração
42
+ def initialize(
43
+ affiliation_id,
44
+ affiliation_key,
45
+ endpoint = WS15::PRODUCTION)
46
+
47
+ @merchant = Merchant.new(affiliation_id, affiliation_key)
48
+ @endpoint = endpoint
49
+ end
50
+
51
+ # Cria uma instância de Holder, que representa o portador de um cartão,
52
+ # definindo os dados do cartão ou apenas um token previamente gerado
53
+ #
54
+ # @param token_or_number [String] token ou o número do cartão do cliente
55
+ # @param expiration_year [String] ano de expiração do cartão
56
+ # @param expiration_month [String] mês de expiração do cartão
57
+ # @param indicator [Number] indicador de visibilidade do código de segurança
58
+ # @param cvv [String] Código de segurança do cartão
59
+ #
60
+ # @return [Holder] instância configurada com os dados informados
61
+ def holder(
62
+ token_or_number,
63
+ expiration_year = nil,
64
+ expiration_month = nil,
65
+ indicator = nil,
66
+ cvv = Holder::CVV_NOT_INFORMED)
67
+
68
+ if expiration_year == nil
69
+ return Holder.new(token_or_number)
70
+ end
71
+
72
+ return Holder.new(
73
+ token_or_number,
74
+ expiration_year,
75
+ expiration_month,
76
+ indicator,
77
+ cvv
78
+ )
79
+ end
80
+
81
+ # Cria uma instância de Order, que representa um pedido, informando o número
82
+ # valor, moeda e data de criação.
83
+ #
84
+ # @param number [String] Número do pedido na plataforma da loja
85
+ # @param total [Number] Valor total do pedido em centavos
86
+ # @param currency [Number] Código ISO que representa a moeda; 986 para Real
87
+ # @param date_time [String] Data e hora do pedido na plataforma da loja
88
+ #
89
+ # @return [Order] instância de Order configurada com os dados informados
90
+ def order(
91
+ number,
92
+ total,
93
+ currency = 986,
94
+ date_time = nil)
95
+
96
+ return Order.new(number, total, currency, date_time)
97
+ end
98
+
99
+ # Cria uma instância de PaymentMethod, que representa a forma de pagamento,
100
+ # informando o banco emissor do cartão, produto Cielo e número de parcelas.
101
+ #
102
+ # @param issuer [String] Banco emissor do cartão
103
+ # @param product [String] Produto Cielo que será utilizado
104
+ # @param installments [Number] Número de parcelas; 1 para transação à vista
105
+ #
106
+ # @return [PaymentMethod] instância de PaymentMethod configurada com os dados informados
107
+ def payment_method(
108
+ issuer,
109
+ product = PaymentMethod::CREDITO_A_VISTA,
110
+ installments = 1)
111
+
112
+ return PaymentMethod.new(issuer, product, installments)
113
+ end
114
+
115
+ # Cria uma instância de Transaction, que representa uma transação, informando
116
+ # o portador do cartão, pedido, forma de pagamento, URL de retorno, método
117
+ # de autorização e forma de captura.
118
+ #
119
+ # @param holder [Holder] Portador do cartão
120
+ # @param order [Order] Pedido
121
+ # @param payment_method [PaymentMethod] Forma de pagamento
122
+ # @param return_url [String] URL de retorno
123
+ # @param authorize [Number] Método de autorização
124
+ # @param capture [Boolean] Se a transação deve ser capturada automaticamente
125
+ #
126
+ # @return [Transaction] instância de Transaction configurada com os dados informados
127
+ def transaction(
128
+ holder,
129
+ order,
130
+ payment_method,
131
+ return_url,
132
+ authorize,
133
+ capture: true)
134
+
135
+ return Transaction.new(@merchant, holder, order, payment_method, return_url, authorize, capture:capture)
136
+ end
137
+
138
+ # Envia uma requisicao-autorizacao-tid para a Cielo
139
+ #
140
+ # @param transaction [Transaction] A transação que será enviada na requisição
141
+ #
142
+ # @return [Transaction] A transação com o retorno da Cielo
143
+ def authorization_request(transaction)
144
+ authorization_message = WS15Message::AuthorizationMessage.new
145
+
146
+ response = send_request(authorization_message.serialize(transaction))
147
+
148
+ return transaction
149
+ end
150
+
151
+ # Envia uma requisicao-cancelamento para a Cielo
152
+ #
153
+ # @param transaction [Transaction] A transação que será enviada na requisição
154
+ # @param total [Number] O valor que será cancelado; se não informado, o cancelamento será total
155
+ #
156
+ # @return [Transaction] A transação com o retorno da Cielo
157
+ def cancellation_request(transaction, total = nil)
158
+ cancellation_message = WS15Message::CancellationMessage.new
159
+
160
+ response = send_request(cancellation_message.serialize(transaction, total))
161
+
162
+ return cancellation_message.unserialize(response, transaction)
163
+ end
164
+
165
+ # Envia uma requisicao-captura para a Cielo
166
+ #
167
+ # @param transaction [Transaction] A transação que será enviada na requisição
168
+ # @param total [Number] O valor que será capturado; se não informado, a captura será total
169
+ #
170
+ # @return [Transaction] A transação com o retorno da Cielo
171
+ def capture_request(transaction, total = nil)
172
+ capture_message = WS15Message::CaptureMessage.new
173
+
174
+ response = send_request(capture_message.serialize(transaction, total))
175
+
176
+ return capture_message.unserialize(response, transaction)
177
+ end
178
+
179
+ # Envia uma requisicao-token para a Cielo
180
+ #
181
+ # @param holder [Holder] Dados do portador do cartão
182
+ #
183
+ # @return [Token] O token gerado para os dados do cartão
184
+ def token_request(holder)
185
+ token_message = WS15Message::TokenMessage.new
186
+
187
+ response = send_request(token_message.serialize(@merchant, holder))
188
+
189
+ return token_message.unserialize(response)
190
+ end
191
+
192
+ # Envia uma requisicao-transacao para a Cielo
193
+ #
194
+ # @param transaction [Transaction] A transação que será enviada na requisição
195
+ #
196
+ # @return [Transaction] A transação com o retorno da Cielo
197
+ def transaction_request(transaction)
198
+ transaction_message = WS15Message::TransactionMessage.new
199
+
200
+ response = send_request(transaction_message.serialize(transaction))
201
+
202
+ return transaction_message.unserialize(response, transaction)
203
+ end
204
+
205
+ private
206
+ def send_request(message)
207
+ uri = URI(@endpoint)
208
+
209
+ response = Net::HTTP.post_form(uri, {"mensagem" => message})
210
+
211
+ return response.body
212
+ end
213
+ end
214
+ end
@@ -0,0 +1,16 @@
1
+ module Cielo
2
+ # Em casos de autenticação, representa os dados da autenticação.
3
+ #
4
+ # @attr [String] code Código da autenticação
5
+ # @attr [String] message Mensagem da autenticação
6
+ # @attr [String] date_time Data e hora da autenticação
7
+ # @attr [Number] total Valor autenticado
8
+ # @attr [Number] eci Código ECI para a autenticação
9
+ class Authentication
10
+ attr_accessor :code,
11
+ :message,
12
+ :date_time,
13
+ :total,
14
+ :eci
15
+ end
16
+ end
@@ -0,0 +1,20 @@
1
+ module Cielo
2
+ # Dados da autorização
3
+ #
4
+ # @attr [String] code Código da autorização
5
+ # @attr [String] message Mensagem da autorização
6
+ # @attr [String] date_time Data e hora da autorização
7
+ # @attr [Number] total Valor autorização
8
+ # @attr [Number] lr Código LR da autorização
9
+ # @attr [Number] arp Código ARP da autorização
10
+ # @attr [Number] nsu Código NSU da autorização
11
+ class Authorization
12
+ attr_accessor :code,
13
+ :message,
14
+ :date_time,
15
+ :total,
16
+ :lr,
17
+ :arp,
18
+ :nsu
19
+ end
20
+ end
@@ -0,0 +1,28 @@
1
+ require "nokogiri"
2
+ require "cielo/ws15/message"
3
+
4
+ module Cielo::WS15Message
5
+ class AuthorizationMessage
6
+ include Cielo::WS15Message
7
+
8
+ def serialize(transaction)
9
+ builder = Nokogiri::XML::Builder.new(:encoding => "ISO-8859-1") do |xml|
10
+ xml.send("requisicao-autorizacao-tid",
11
+ "xmlns" => Cielo::WS15::NAMESPACE,
12
+ "versao" => Cielo::WS15::VERSION,
13
+ "id" => transaction.order.number) {
14
+
15
+ xml.send("tid", transaction.tid)
16
+
17
+ Cielo::WS15Message.serialize_dados_ec(xml, transaction.merchant)
18
+ }
19
+ end
20
+
21
+ return builder.to_xml
22
+ end
23
+
24
+ def unserialize(message, transaction)
25
+ return Cielo::WS15Message.unserialize_transaction(message, transaction)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,14 @@
1
+ module Cielo
2
+ # Em casos de cancelamento, representa os dados do cancelamento
3
+ #
4
+ # @attr [String] code Código do cancelamento
5
+ # @attr [String] message Mensagem do cancelamento
6
+ # @attr [String] date_time Data e hora do cancelamento
7
+ # @attr [Number] total Valor cancelado
8
+ class Cancellation
9
+ attr_accessor :code,
10
+ :message,
11
+ :date_time,
12
+ :total
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ require "nokogiri"
2
+ require "cielo/ws15/message"
3
+
4
+ module Cielo::WS15Message
5
+ class CancellationMessage
6
+ include Cielo::WS15Message
7
+
8
+ def serialize(transaction, total = nil)
9
+ builder = Nokogiri::XML::Builder.new(:encoding => "ISO-8859-1") do |xml|
10
+ xml.send("requisicao-cancelamento",
11
+ "xmlns" => Cielo::WS15::NAMESPACE,
12
+ "versao" => Cielo::WS15::VERSION,
13
+ "id" => transaction.order.number) {
14
+
15
+ xml.send("tid", transaction.tid)
16
+
17
+ Cielo::WS15Message.serialize_dados_ec(xml, transaction.merchant)
18
+
19
+ if total != nil
20
+ xml.send("valor", total)
21
+ end
22
+ }
23
+ end
24
+
25
+ return builder.to_xml
26
+ end
27
+
28
+ def unserialize(message, transaction)
29
+ return Cielo::WS15Message.unserialize_transaction(message, transaction)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,14 @@
1
+ module Cielo
2
+ # Em casos de captura, representa os dados da captura.
3
+ #
4
+ # @attr [String] code Código da captura
5
+ # @attr [String] message Mensagem da captura
6
+ # @attr [String] date_time Data e hora da captura
7
+ # @attr [Number] total Valor capturado
8
+ class Capture
9
+ attr_accessor :code,
10
+ :message,
11
+ :date_time,
12
+ :total
13
+ end
14
+ end
@@ -0,0 +1,32 @@
1
+ require "nokogiri"
2
+ require "cielo/ws15/message"
3
+
4
+ module Cielo::WS15Message
5
+ class CaptureMessage
6
+ include Cielo::WS15Message
7
+
8
+ def serialize(transaction, total = nil)
9
+ builder = Nokogiri::XML::Builder.new(:encoding => "ISO-8859-1") do |xml|
10
+ xml.send("requisicao-captura",
11
+ "xmlns" => Cielo::WS15::NAMESPACE,
12
+ "versao" => Cielo::WS15::VERSION,
13
+ "id" => transaction.order.number) {
14
+
15
+ xml.send("tid", transaction.tid)
16
+
17
+ Cielo::WS15Message.serialize_dados_ec(xml, transaction.merchant)
18
+
19
+ if total != nil
20
+ xml.send("valor", total)
21
+ end
22
+ }
23
+ end
24
+
25
+ return builder.to_xml
26
+ end
27
+
28
+ def unserialize(message, transaction)
29
+ return Cielo::WS15Message.unserialize_transaction(message, transaction)
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,55 @@
1
+ module Cielo
2
+ # Dados do portador
3
+ #
4
+ # @attr [String] token Token único do cartão
5
+ # @attr [String] number Número do cartão
6
+ # @attr [String] expiration Data de expiração do cartão
7
+ # @attr [Number] indicator Indicador do código de segurança do cartão
8
+ # @attr [String] cvv Código de segurança do cartão
9
+ # @attr [String] name Nome do portador do cartão
10
+ class Holder
11
+ # Indica que o CVV não foi informado
12
+ CVV_NOT_INFORMED = 0
13
+
14
+ # Indica que o CVV foi informado
15
+ CVV_INFORMED = 1
16
+
17
+ # Indica que o CVV não estava legível
18
+ CVV_UNREADABLE = 2
19
+
20
+ # Indica que existe um CVV
21
+ CVV_NONEXISTENT = 9
22
+
23
+ attr_accessor :token,
24
+ :number,
25
+ :expiration,
26
+ :indicator,
27
+ :cvv,
28
+ :name
29
+
30
+ # Inicializa uma nova instância de Holder, que representa o portador de um
31
+ # cartão, definindo os dados do cartão ou apenas um token previamente gerado
32
+ #
33
+ # @param token_or_number [String] token ou o número do cartão do cliente
34
+ # @param expiration_year [String] ano de expiração do cartão
35
+ # @param expiration_month [String] mês de expiração do cartão
36
+ # @param indicator [Number] indicador de visibilidade do código de segurança
37
+ # @param cvv [String] Código de segurança do cartão
38
+ def initialize(
39
+ token_or_number,
40
+ expiration_year = nil,
41
+ expiration_month = nil,
42
+ indicator = nil,
43
+ cvv = Holder::CVV_NOT_INFORMED)
44
+
45
+ if (expiration_year == nil)
46
+ @token = token_or_number
47
+ else
48
+ @number = token_or_number
49
+ @expiration = "#{expiration_year}#{expiration_month}"
50
+ @indicator = indicator
51
+ @cvv = cvv
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,20 @@
1
+ module Cielo
2
+ # Dados do estabelecimento comercial
3
+ #
4
+ # @attr [String] affiliation_id Número de afiliação na Cielo
5
+ # @attr [String] affiliation_key Chave de afiliação
6
+ class Merchant
7
+ attr_accessor :affiliation_id,
8
+ :affiliation_key
9
+
10
+
11
+ # Inicializa uma nova instância de Merchat
12
+ #
13
+ # @param affiliation_id [String] Número de afiliação na Cielo
14
+ # @param affiliation_key [String] Chave de afiliação
15
+ def initialize(affiliation_id, affiliation_key)
16
+ @affiliation_id = affiliation_id
17
+ @affiliation_key = affiliation_key
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,110 @@
1
+ require "nokogiri"
2
+ require "cielo/ws15/authentication"
3
+ require "cielo/ws15/authorization"
4
+ require "cielo/ws15/capture"
5
+ require "cielo/ws15/cancellation"
6
+ require "cielo/ws15/token"
7
+
8
+ # Helper para serialização e deserialização dos XML de requisição e resposta
9
+ module Cielo::WS15Message
10
+ def self.serialize_dados_ec(xml, merchant)
11
+ xml.send("dados-ec") {
12
+ xml.send("numero", merchant.affiliation_id)
13
+ xml.send("chave", merchant.affiliation_key)
14
+ }
15
+ end
16
+
17
+ def self.unserialize_transaction(message, transaction)
18
+ document = document = load_document(message)
19
+
20
+ check_error(document)
21
+
22
+ transaction.tid = document.xpath("//transacao/tid").text
23
+ transaction.pan = document.xpath("//transacao/pan").text
24
+
25
+ transaction.order = Cielo::Order.new(
26
+ document.xpath("//transacao/dados-pedido/numero").text,
27
+ document.xpath("//transacao/dados-pedido/valor").text.to_i,
28
+ document.xpath("//transacao/dados-pedido/moeda").text.to_i,
29
+ document.xpath("//transacao/dados-pedido/data-hora").text
30
+ )
31
+
32
+ transaction.order.description = document.xpath("//transacao/dados-pedido/descricao").text
33
+ transaction.order.language = document.xpath("//transacao/dados-pedido/idioma").text
34
+ transaction.order.shipping = document.xpath("//transacao/dados-pedido/taxa-embarque").text.to_i
35
+
36
+ transaction.payment_method = Cielo::PaymentMethod.new(
37
+ document.xpath("//transacao/forma-pagamento/bandeira").text,
38
+ document.xpath("//transacao/forma-pagamento/produto").text,
39
+ document.xpath("//transacao/forma-pagamento/parcelas").text.to_i
40
+ )
41
+
42
+ transaction.authentication = Cielo::Authentication.new
43
+ transaction.authentication.code = document.xpath("//transacao/autenticacao/codigo").text
44
+ transaction.authentication.message = document.xpath("//transacao/autenticacao/mensagem").text
45
+ transaction.authentication.date_time = document.xpath("//transacao/autenticacao/data-hora").text
46
+ transaction.authentication.total = document.xpath("//transacao/autenticacao/valor").text
47
+ transaction.authentication.eci = document.xpath("//transacao/autenticacao/eci").text
48
+
49
+ transaction.authorization = Cielo::Authorization.new
50
+ transaction.authorization.code = document.xpath("//transacao/autorizacao/codigo").text
51
+ transaction.authorization.message = document.xpath("//transacao/autorizacao/mensagem").text
52
+ transaction.authorization.date_time = document.xpath("//transacao/autorizacao/data-hora").text
53
+ transaction.authorization.total = document.xpath("//transacao/autorizacao/valor").text
54
+ transaction.authorization.lr = document.xpath("//transacao/autorizacao/lr").text
55
+ transaction.authorization.arp = document.xpath("//transacao/autorizacao/arp").text
56
+ transaction.authorization.nsu = document.xpath("//transacao/autorizacao/nsu").text
57
+
58
+ transaction.capture = Cielo::Capture.new
59
+ transaction.capture.code = document.xpath("//transacao/captura/codigo").text
60
+ transaction.capture.message = document.xpath("//transacao/captura/mensagem").text
61
+ transaction.capture.date_time = document.xpath("//transacao/captura/data-hora").text
62
+ transaction.capture.total = document.xpath("//transacao/captura/valor").text
63
+
64
+ transaction.cancellation = Array.new
65
+
66
+ document.xpath("//transacao/cancelamentos/cancelamento").each do |cancelamento|
67
+ cancellation = Cielo::Cancellation.new
68
+
69
+ cancellation.code = cancelamento.xpath('.//codigo').text
70
+ cancellation.message = cancelamento.xpath('.//mensagem').text
71
+ cancellation.date_time = cancelamento.xpath('.//data-hora').text
72
+ cancellation.total = cancelamento.xpath('.//valor').text
73
+
74
+ transaction.cancellation << cancellation
75
+ end
76
+
77
+ transaction.token = unserialize_token(message, document)
78
+
79
+ return transaction
80
+ end
81
+
82
+ def self.unserialize_token(message, document = nil)
83
+ if document == nil
84
+ document = load_document(message)
85
+ end
86
+
87
+ token = Cielo::Token.new
88
+
89
+ token.code = document.xpath(".//token/dados-token/codigo-token").text
90
+ token.status = document.xpath(".//token/dados-token/status").text
91
+ token.number = document.xpath(".//token/dados-token/numero-cartao-truncado").text
92
+
93
+ return token
94
+ end
95
+
96
+ private
97
+ def self.check_error(document)
98
+ code = document.xpath(".//erro/codigo").text
99
+ message = document.xpath(".//erro/mensagem").text
100
+
101
+ raise "Erro[#{code}]: #{message}" unless code == ""
102
+ end
103
+
104
+ def self.load_document(message)
105
+ document = Nokogiri::XML(message)
106
+ document.remove_namespaces!
107
+
108
+ return document
109
+ end
110
+ end
@@ -0,0 +1,49 @@
1
+ module Cielo
2
+ class Order
3
+ # Dados do estabelecimento comercial
4
+ #
5
+ # @attr [String] number Número do pedido na plataforma da loja
6
+ # @attr [Number] total Valor do pedido em centavos
7
+ # @attr [Number] Código ISO da moeda; 986 para Real
8
+ # @attr [String] date_time Data e hora do pedido
9
+ # @attr [String] description Descrição do pedido
10
+ # @attr [String] language Idioma do pedido; PT para português
11
+ # @attr [Number] shipping Valor do frete em centavos
12
+ # @attr [String] soft_descriptor Nome de exibição na fatura do cartão
13
+ attr_accessor :number,
14
+ :total,
15
+ :currency,
16
+ :date_time,
17
+ :description,
18
+ :language,
19
+ :shipping,
20
+ :soft_descriptor
21
+
22
+ # Inicializa uma instância de Order informando o número do pedido, valor,
23
+ # moeda e data de criação.
24
+ #
25
+ # @param number [String] Número do pedido na plataforma da loja
26
+ # @param total [Number] Valor total do pedido em centavos
27
+ # @param currency [Number] Código ISO que representa a moeda; 986 para Real
28
+ # @param date_time [String] Data e hora do pedido na plataforma da loja
29
+ def initialize(
30
+ number = 0,
31
+ total = 0,
32
+ currency = 986,
33
+ date_time = nil)
34
+
35
+ if (date_time == nil)
36
+ now = Time.now
37
+
38
+ date_time = now.strftime("%Y-%m-%dT%H:%M:%S")
39
+ end
40
+
41
+ @number = number
42
+ @total = total
43
+ @currency = currency
44
+ @language = "PT"
45
+ @date_time = date_time
46
+ @shipping = 0
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,64 @@
1
+ module Cielo
2
+ # Forma de pagamento da transação
3
+ #
4
+ # @attr [String] issuer Banco emissor do cartão
5
+ # @attr [String] product Produto da Cielo utilizado
6
+ # @attr [Number] installments Número de parcelas
7
+ class PaymentMethod
8
+ # Cartão Visa
9
+ VISA = "visa"
10
+
11
+ # Cartão Mastercard
12
+ MASTERCARD = "mastercard"
13
+
14
+ # Cartão Diners
15
+ DINERS = "diners"
16
+
17
+ # Cartão Discover
18
+ DISCOVER = "discover"
19
+
20
+ # Cartão ELO
21
+ ELO = "elo"
22
+
23
+ # Cartão Amex
24
+ AMEX = "amex"
25
+
26
+ # Cartão JCB
27
+ JCB = "jcb"
28
+
29
+ # Cartão Aura
30
+ AURA = "aura"
31
+
32
+ # Pagamento com cartão de crédito à vista
33
+ CREDITO_A_VISTA = 1
34
+
35
+ # Pagamento com cartão de crédito parcelado pela loja
36
+ PARCELADO_LOJA = 2
37
+
38
+ # Pagamento com cartão de crédito parcelado pela administradora
39
+ PARCELADO_ADM = 3
40
+
41
+ # Pagamento com cartão de débito
42
+ DEBITO = "A"
43
+
44
+ attr_accessor :issuer,
45
+ :product,
46
+ :installments
47
+
48
+ # Inicializa uma instância de PaymentMethod informando o banco emissor do
49
+ # cartão, produto Cielo e número de parcelas.
50
+ #
51
+ # @param issuer [String] Banco emissor do cartão
52
+ # @param product [String] Produto Cielo que será utilizado
53
+ # @param installments [Number] Número de parcelas; 1 para transação à vista
54
+ def initialize(
55
+ issuer,
56
+ product = PaymentMethod::CREDITO_A_VISTA,
57
+ installments = 1)
58
+
59
+ @issuer = issuer
60
+ @product = product
61
+ @installments = installments
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,12 @@
1
+ module Cielo
2
+ # Dados do token do cartão
3
+ #
4
+ # @attr [String] code Código do token para ser utilizado em outras transações
5
+ # @attr [Number] status Status do token
6
+ # @attr [String] Número do cartão truncado
7
+ class Token
8
+ attr_accessor :code,
9
+ :status,
10
+ :number
11
+ end
12
+ end
@@ -0,0 +1,35 @@
1
+ require "nokogiri"
2
+ require "uuidtools"
3
+ require "cielo/ws15/message"
4
+
5
+ module Cielo::WS15Message
6
+ class TokenMessage
7
+ include Cielo::WS15Message
8
+
9
+ def serialize(merchant, holder)
10
+ builder = Nokogiri::XML::Builder.new(:encoding => "ISO-8859-1") do |xml|
11
+ xml.send("requisicao-token",
12
+ "xmlns" => Cielo::WS15::NAMESPACE,
13
+ "versao" => Cielo::WS15::VERSION,
14
+ "id" => UUIDTools::UUID.random_create) {
15
+
16
+ Cielo::WS15Message.serialize_dados_ec(xml, merchant)
17
+
18
+ xml.send("dados-portador") {
19
+ xml.send("numero", holder.number)
20
+ xml.send("validade", holder.expiration)
21
+ xml.send("indicador", holder.indicator)
22
+ xml.send("codigo-seguranca", holder.cvv)
23
+ xml.send("nome-portador", holder.name)
24
+ }
25
+ }
26
+ end
27
+
28
+ return builder.to_xml
29
+ end
30
+
31
+ def unserialize(message)
32
+ return Cielo::WS15Message.unserialize_token(message)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,90 @@
1
+ module Cielo
2
+ # Representação de uma transação
3
+ #
4
+ # @attr [String] tid ID da transação
5
+ # @attr [String] pan Código PAN da transação
6
+ # @attr [Number] status Código de status da transação
7
+ # @attr [String] authentication_url URL de redirecionamento à Cielo
8
+ # @attr [Authentication] authentication Dados da autenticação
9
+ # @attr [Authorizarion] authorizarion Dados da autorização
10
+ # @attr [Merchant] merchant Dados do estabelecimento comercial
11
+ # @attr [Holder] holder Dados do portador do cartão
12
+ # @attr [Order] order Dados do pedido na plataforma da loja
13
+ # @attr [PaymentMethod] payment_method Dados da forma de pagamento
14
+ # @attr [String] return_url URL de redirecionamento da Cielo para a loja
15
+ # @attr [Number] authorize Método de autorização
16
+ # @attr [Boolean] do_capture Indica se a captura deve ser automática ou não
17
+ # @attr [Capture] capture Dados da captura
18
+ # @attr [String] free_field Campo livre
19
+ # @attr [String] bin Seis primeiros dígitos do cartão
20
+ # @attr [Boolean] generate_token Se um token deve ser gerado para o cartão
21
+ # @attr [String] avs Bloco XML contendo informações necessárias para realizar a consulta ao serviço
22
+ # @attr [Token] token Dados do token
23
+ # @attr [Array<Cancellation>] cancellation Lista de cancelamentos ocorridos
24
+ class Transaction
25
+ # Apenas autentica a transação
26
+ ONLY_AUTHENTICATE = 0
27
+
28
+ # Autoriza a transação apenas se tiver sido autenticada
29
+ AUTHORIZE_IF_AUTHENTICATED = 1
30
+
31
+ # Autoriza a transação
32
+ AUTHORIZE = 2
33
+
34
+ # Autorização direta, sem autenticação
35
+ AUTHORIZE_WITHOUT_AUTHENTICATION = 3
36
+
37
+ # Autorização para recorrência
38
+ RECURRENCE = 4
39
+
40
+ attr_accessor :tid,
41
+ :pan,
42
+ :status,
43
+ :authentication_url,
44
+ :authentication,
45
+ :authorization,
46
+ :merchant,
47
+ :holder,
48
+ :order,
49
+ :payment_method,
50
+ :return_url,
51
+ :authorize,
52
+ :do_capture,
53
+ :capture,
54
+ :free_field,
55
+ :bin,
56
+ :generate_token,
57
+ :avs,
58
+ :token,
59
+ :cancellation
60
+
61
+ # Inicializa uma instância de Transaction informando os dados do estabelecimento,
62
+ # portador do cartão, pedido, forma de pagamento, URL de retorno, método
63
+ # de autorização e forma de captura.
64
+ #
65
+ # @param merchant [Merchant] Dados do estabelecimento comercial
66
+ # @param holder [Holder] Portador do cartão
67
+ # @param order [Order] Dados do pedido
68
+ # @param payment_method [PaymentMethod] Forma de pagamento
69
+ # @param return_url [String] URL de retorno
70
+ # @param authorize [Number] Método de autorização
71
+ # @param capture [Boolean] Se a transação deve ser capturada automaticamente
72
+ def initialize(
73
+ merchant,
74
+ holder,
75
+ order,
76
+ payment_method,
77
+ return_url,
78
+ authorize,
79
+ capture: true)
80
+
81
+ @merchant = merchant
82
+ @holder = holder
83
+ @order = order
84
+ @payment_method = payment_method
85
+ @return_url = return_url
86
+ @authorize = authorize
87
+ @do_capture = capture
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,68 @@
1
+ require "nokogiri"
2
+ require "cielo/ws15/message"
3
+
4
+ module Cielo::WS15Message
5
+ class TransactionMessage
6
+ include Cielo::WS15Message
7
+
8
+ def serialize(transaction)
9
+ builder = Nokogiri::XML::Builder.new(:encoding => "ISO-8859-1") do |xml|
10
+ xml.send("requisicao-transacao",
11
+ "xmlns" => Cielo::WS15::NAMESPACE,
12
+ "versao" => Cielo::WS15::VERSION,
13
+ "id" => transaction.order.number) {
14
+
15
+ Cielo::WS15Message.serialize_dados_ec(xml, transaction.merchant)
16
+
17
+ xml.send("dados-portador") {
18
+ if transaction.holder.token != nil
19
+ xml.send("token", transaction.holder.token)
20
+ else
21
+ xml.send("numero", transaction.holder.number)
22
+ xml.send("validade", transaction.holder.expiration)
23
+ xml.send("indicador", transaction.holder.indicator)
24
+ xml.send("codigo-seguranca", transaction.holder.cvv)
25
+ xml.send("nome-portador", transaction.holder.name)
26
+ end
27
+ }
28
+
29
+ xml.send("dados-pedido") {
30
+ xml.send("numero", transaction.order.number)
31
+ xml.send("valor", transaction.order.total)
32
+ xml.send("moeda", transaction.order.currency)
33
+ xml.send("data-hora", transaction.order.date_time)
34
+ xml.send("descricao", transaction.order.description)
35
+ xml.send("idioma", transaction.order.language)
36
+ xml.send("taxa-embarque", transaction.order.shipping)
37
+ xml.send("soft-descriptor", transaction.order.soft_descriptor)
38
+ }
39
+
40
+ xml.send("forma-pagamento") {
41
+ xml.send("bandeira", transaction.payment_method.issuer)
42
+ xml.send("produto", transaction.payment_method.product)
43
+ xml.send("parcelas", transaction.payment_method.installments)
44
+ }
45
+
46
+ xml.send("url-retorno", transaction.return_url)
47
+ xml.send("autorizar", transaction.authorize)
48
+ xml.send("capturar", transaction.do_capture)
49
+ xml.send("campo-livre", transaction.free_field)
50
+
51
+ if transaction.bin != nil
52
+ xml.send("bin", transaction.bin)
53
+ end
54
+
55
+ if transaction.generate_token != nil
56
+ xml.send("gerar-token", transaction.generate_token)
57
+ end
58
+ }
59
+ end
60
+
61
+ return builder.to_xml
62
+ end
63
+
64
+ def unserialize(message, transaction)
65
+ return Cielo::WS15Message.unserialize_transaction(message, transaction)
66
+ end
67
+ end
68
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cielo-ws15
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.3.0
5
+ platform: ruby
6
+ authors:
7
+ - Cielo
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-01-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: nokogiri
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.6'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.6'
41
+ - !ruby/object:Gem::Dependency
42
+ name: uuidtools
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '2.1'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yard
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.8'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.8'
69
+ description: Integração com o webservice 1.5 da Cielo
70
+ email:
71
+ - cieloecommerce@cielo.com.br
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - lib/cielo/ws15.rb
77
+ - lib/cielo/ws15/authentication.rb
78
+ - lib/cielo/ws15/authorization.rb
79
+ - lib/cielo/ws15/authorization_message.rb
80
+ - lib/cielo/ws15/cancellation.rb
81
+ - lib/cielo/ws15/cancellation_message.rb
82
+ - lib/cielo/ws15/capture.rb
83
+ - lib/cielo/ws15/capture_message.rb
84
+ - lib/cielo/ws15/holder.rb
85
+ - lib/cielo/ws15/merchant.rb
86
+ - lib/cielo/ws15/message.rb
87
+ - lib/cielo/ws15/order.rb
88
+ - lib/cielo/ws15/payment_method.rb
89
+ - lib/cielo/ws15/token.rb
90
+ - lib/cielo/ws15/token_message.rb
91
+ - lib/cielo/ws15/transaction.rb
92
+ - lib/cielo/ws15/transaction_message.rb
93
+ homepage: https://github.com/DeveloperCielo/Webservice-1.5-ruby
94
+ licenses:
95
+ - MIT
96
+ metadata: {}
97
+ post_install_message:
98
+ rdoc_options: []
99
+ require_paths:
100
+ - lib
101
+ required_ruby_version: !ruby/object:Gem::Requirement
102
+ requirements:
103
+ - - ">="
104
+ - !ruby/object:Gem::Version
105
+ version: 2.0.0
106
+ required_rubygems_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 2.2.5
114
+ signing_key:
115
+ specification_version: 4
116
+ summary: SDK Webservice 1.5
117
+ test_files: []
118
+ has_rdoc: yard