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 +7 -0
- data/lib/cielo/ws15.rb +214 -0
- data/lib/cielo/ws15/authentication.rb +16 -0
- data/lib/cielo/ws15/authorization.rb +20 -0
- data/lib/cielo/ws15/authorization_message.rb +28 -0
- data/lib/cielo/ws15/cancellation.rb +14 -0
- data/lib/cielo/ws15/cancellation_message.rb +32 -0
- data/lib/cielo/ws15/capture.rb +14 -0
- data/lib/cielo/ws15/capture_message.rb +32 -0
- data/lib/cielo/ws15/holder.rb +55 -0
- data/lib/cielo/ws15/merchant.rb +20 -0
- data/lib/cielo/ws15/message.rb +110 -0
- data/lib/cielo/ws15/order.rb +49 -0
- data/lib/cielo/ws15/payment_method.rb +64 -0
- data/lib/cielo/ws15/token.rb +12 -0
- data/lib/cielo/ws15/token_message.rb +35 -0
- data/lib/cielo/ws15/transaction.rb +90 -0
- data/lib/cielo/ws15/transaction_message.rb +68 -0
- metadata +118 -0
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
|