cielo-ws15 1.3.0

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.
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