libwebpayplus 2.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,137 @@
1
+ require 'signer'
2
+ require 'savon'
3
+ require_relative "verifier"
4
+
5
+
6
+ class WebpayNullify
7
+
8
+ def initialize(configuration)
9
+
10
+ @wsdl_path = ''
11
+ @ambient = configuration.environment
12
+
13
+ case @ambient
14
+ when 'INTEGRACION'
15
+ @wsdl_path='https://webpay3gint.transbank.cl/WSWebpayTransaction/cxf/WSCommerceIntegrationService?wsdl'
16
+ when 'CERTIFICACION'
17
+ @wsdl_path='https://webpay3gint.transbank.cl/WSWebpayTransaction/cxf/WSCommerceIntegrationService?wsdl'
18
+ when 'PRODUCCION'
19
+ @wsdl_path='https://webpay3g.transbank.cl/WSWebpayTransaction/cxf/WSCommerceIntegrationService?wsdl'
20
+ else
21
+ #Por defecto esta el ambiente de INTEGRACION
22
+ @wsdl_path='https://webpay3gint.transbank.cl/WSWebpayTransaction/cxf/WSCommerceIntegrationService?wsdl'
23
+ end
24
+
25
+ @commerce_code = configuration.commerce_code
26
+ @private_key = OpenSSL::PKey::RSA.new(configuration.private_key)
27
+ @public_cert = OpenSSL::X509::Certificate.new(configuration.public_cert)
28
+ @webpay_cert = OpenSSL::X509::Certificate.new(configuration.webpay_cert)
29
+ @client = Savon.client(wsdl: @wsdl_path)
30
+
31
+ end
32
+
33
+
34
+ #######################################################
35
+ def nullify(authorizationCode, authorizedAmount, buyOrder, nullifyAmount, commercecode)
36
+
37
+
38
+ nullifyInput ={
39
+ "nullificationInput" => {
40
+ "authorizationCode" => authorizationCode,
41
+ "authorizedAmount" => authorizedAmount,
42
+ "buyOrder" => buyOrder,
43
+ "commerceId" => commercecode,
44
+ "nullifyAmount" => nullifyAmount
45
+ }
46
+ }
47
+
48
+ req = @client.build_request(:nullify, message: nullifyInput)
49
+
50
+ #Firmar documento
51
+ document = sign_xml(req)
52
+ puts document
53
+
54
+ begin
55
+ response = @client.call(:nullify) do
56
+ xml document.to_xml(:save_with => 0)
57
+ end
58
+ rescue Exception ,RuntimeError => e
59
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
60
+ response_array ={
61
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
62
+ }
63
+
64
+ return response_array
65
+ end
66
+
67
+ #Verificacion de certificado respuesta
68
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
69
+
70
+ if !Verifier.verify(response, tbk_cert)
71
+ puts "El Certificado de respuesta es Invalido."
72
+ response_array ={
73
+ "error_desc" => 'El Certificado de respuesta es Invalido'
74
+ }
75
+ return response_array
76
+ else
77
+ puts "El Certificado de respuesta es Valido."
78
+ end
79
+
80
+
81
+ response_document = Nokogiri::HTML(response.to_s)
82
+
83
+ authorizationCode = response_document.xpath("//authorizationcode").text
84
+ authorizationDate = response_document.xpath("//authorizationdate").text
85
+ balance = response_document.xpath("//balance").text
86
+ nullifiedAmount = response_document.xpath("//nullifiedamount").text
87
+ token = response_document.xpath("//token").text
88
+
89
+ response_array ={
90
+ "authorizationCode" => authorizationCode.to_s,
91
+ "authorizationDate" => authorizationDate.to_s,
92
+ "balance" => balance.to_s,
93
+ "nullifiedAmount" => nullifiedAmount.to_s,
94
+ "token" => token.to_s,
95
+ "error_desc" => 'TRX_OK'
96
+ }
97
+
98
+ puts 'respuesta: '
99
+ puts response_document
100
+
101
+ return response_array
102
+ end
103
+
104
+
105
+ #######################################################
106
+ def sign_xml (input_xml)
107
+
108
+ document = Nokogiri::XML(input_xml.body)
109
+ envelope = document.at_xpath("//env:Envelope")
110
+ envelope.prepend_child("<env:Header><wsse:Security xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' wsse:mustUnderstand='1'/></env:Header>")
111
+ xml = document.to_s
112
+
113
+ signer = Signer.new(xml)
114
+
115
+ signer.cert = OpenSSL::X509::Certificate.new(@public_cert)
116
+ signer.private_key = OpenSSL::PKey::RSA.new(@private_key)
117
+
118
+ signer.document.xpath("//soapenv:Body", { "soapenv" => "http://schemas.xmlsoap.org/soap/envelope/" }).each do |node|
119
+ signer.digest!(node)
120
+ end
121
+
122
+ signer.sign!(:issuer_serial => true)
123
+ signed_xml = signer.to_xml
124
+
125
+ document = Nokogiri::XML(signed_xml)
126
+ x509data = document.at_xpath("//*[local-name()='X509Data']")
127
+ new_data = x509data.clone()
128
+ new_data.set_attribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
129
+
130
+ n = Nokogiri::XML::Node.new('wsse:SecurityTokenReference', document)
131
+ n.add_child(new_data)
132
+ x509data.add_next_sibling(n)
133
+
134
+ return document
135
+ end
136
+
137
+ end
@@ -0,0 +1,440 @@
1
+ require 'signer'
2
+ require 'savon'
3
+ require_relative 'verifier'
4
+ require_relative 'utils'
5
+
6
+
7
+ class WebpayOneClick
8
+
9
+ def initialize(configuration)
10
+
11
+
12
+ @wsdl_path = ''
13
+ @ambient = configuration.environment
14
+
15
+ case @ambient
16
+ when 'INTEGRACION'
17
+ @wsdl_path='https://webpay3gint.transbank.cl/webpayserver/wswebpay/OneClickPaymentService?wsdl'
18
+ when 'CERTIFICACION'
19
+ @wsdl_path='https://webpay3gint.transbank.cl/webpayserver/wswebpay/OneClickPaymentService?wsdl'
20
+ when 'PRODUCCION'
21
+ @wsdl_path='https://webpay3g.transbank.cl/webpayserver/wswebpay/OneClickPaymentService?wsdl'
22
+ else
23
+ #Por defecto esta el ambiente de INTEGRACION
24
+ @wsdl_path='https://webpay3gint.transbank.cl/webpayserver/wswebpay/OneClickPaymentService?wsdl'
25
+ end
26
+
27
+ @commerce_code = configuration.commerce_code
28
+ @private_key = OpenSSL::PKey::RSA.new(configuration.private_key)
29
+ @public_cert = OpenSSL::X509::Certificate.new(configuration.public_cert)
30
+ @webpay_cert = OpenSSL::X509::Certificate.new(configuration.webpay_cert)
31
+ @client = Savon.client(wsdl: @wsdl_path)
32
+
33
+ end
34
+
35
+
36
+ #######################################################
37
+ def initInscription(username, email, urlReturn)
38
+
39
+ initInput ={
40
+ "arg0" => {
41
+ "username" => username,
42
+ "email" => email,
43
+ "responseURL" => urlReturn
44
+ }
45
+ }
46
+
47
+
48
+ req = @client.build_request(:init_inscription, message: initInput)
49
+
50
+ #Firmar documento
51
+ document = sign_xml(req)
52
+ puts document
53
+
54
+ begin
55
+ response = @client.call(:init_inscription) do
56
+ xml document.to_xml(:save_with => 0)
57
+ end
58
+ rescue Exception, RuntimeError => e
59
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
60
+ response_array ={
61
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
62
+ }
63
+ return response_array
64
+ end
65
+
66
+ #Verificacion de certificado respuesta
67
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
68
+
69
+ if !Verifier.verify(response, tbk_cert)
70
+ puts "El Certificado de respuesta es Invalido."
71
+ response_array ={
72
+ "error_desc" => 'El Certificado de respuesta es Invalido'
73
+ }
74
+ return response_array
75
+ else
76
+ puts "El Certificado de respuesta es Valido."
77
+ end
78
+
79
+
80
+ token=''
81
+ response_document = Nokogiri::HTML(response.to_s)
82
+ response_document.xpath("//token").each do |token_value|
83
+ token = token_value.text
84
+ end
85
+ url=''
86
+ response_document.xpath("//urlwebpay").each do |url_value|
87
+ url = url_value.text
88
+ end
89
+
90
+ puts 'token: '+token
91
+ puts 'url: '+url
92
+
93
+ response_array ={
94
+ "token" => token.to_s,
95
+ "url" => url.to_s,
96
+ "error_desc" => 'TRX_OK'
97
+ }
98
+
99
+ return response_array
100
+ end
101
+
102
+
103
+
104
+ ##############################################
105
+ def finishInscription(token)
106
+
107
+ finishInput ={
108
+ "arg0" => {
109
+ "token" => token
110
+ }
111
+ }
112
+
113
+ #Preparacion firma
114
+ req = @client.build_request(:finish_inscription, message: finishInput)
115
+ #firmar la peticion
116
+ document = sign_xml(req)
117
+
118
+ begin
119
+ puts "Iniciando finishInscription..."
120
+ response = @client.call(:finish_inscription) do
121
+ xml document.to_xml(:save_with => 0)
122
+ end
123
+
124
+ rescue Exception, RuntimeError => e
125
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
126
+ response_array ={
127
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
128
+ }
129
+ return response_array
130
+ end
131
+
132
+ #Se revisa que respuesta no sea nula.
133
+ if response
134
+ puts 'Respuesta finishInscription: '+ response.to_s
135
+ else
136
+ puts 'Webservice Webpay responde con null'
137
+ response_array ={
138
+ "error_desc" => 'Webservice Webpay responde con null'
139
+ }
140
+ return response_array
141
+ end
142
+
143
+ puts response
144
+
145
+ #Verificacion de certificado respuesta
146
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
147
+
148
+ if !Verifier.verify(response, tbk_cert)
149
+ puts "El Certificado de respuesta es Invalido."
150
+ response_array ={
151
+ "error_desc" => 'El Certificado de respuesta es Invalido'
152
+ }
153
+ return response_array
154
+ else
155
+ puts "El Certificado de respuesta es Valido."
156
+ end
157
+
158
+ response_document = Nokogiri::HTML(response.to_s)
159
+ puts response_document.to_s
160
+
161
+ responseCode = response_document.xpath("//responsecode").text
162
+ authCode = response_document.xpath("//authcode").text
163
+ tbkUser = response_document.xpath("//tbkuser").text
164
+ last4CardDigits = response_document.xpath("//last4carddigits").text
165
+ creditCardType = response_document.xpath("//creditcardtype").text
166
+
167
+
168
+ response_array ={
169
+ "responseCode" => responseCode.to_s,
170
+ "authCode" => authCode.to_s,
171
+ "tbkUser" => tbkUser.to_s,
172
+ "last4CardDigits" => last4CardDigits.to_s,
173
+ "creditCardType" => creditCardType.to_s,
174
+ "error_desc" => 'TRX_OK'
175
+ }
176
+
177
+ return response_array
178
+ end
179
+
180
+
181
+
182
+ ##############################################
183
+ def authorize(buyOrder, tbkUser, username, amount)
184
+
185
+ authorizeInput ={
186
+ "arg0" => {
187
+ "buyOrder" => buyOrder,
188
+ "tbkUser" => tbkUser,
189
+ "username" => username,
190
+ "amount" => amount
191
+ }
192
+ }
193
+
194
+ #Preparacion firma
195
+ req = @client.build_request(:authorize, message: authorizeInput)
196
+ #firmar la peticion
197
+ document = sign_xml(req)
198
+
199
+ #Se realiza el getResult
200
+ begin
201
+ puts "Iniciando authorize..."
202
+ response = @client.call(:authorize) do
203
+ xml document.to_xml(:save_with => 0)
204
+ end
205
+
206
+ rescue Exception, RuntimeError => e
207
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
208
+ response_array ={
209
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
210
+ }
211
+ return response_array
212
+ end
213
+
214
+ #Se revisa que respuesta no sea nula.
215
+ if response
216
+ puts 'Respuesta authorize: '+ response.to_s
217
+ else
218
+ puts 'Webservice Webpay responde con null'
219
+ response_array ={
220
+ "error_desc" => 'Webservice Webpay responde con null'
221
+ }
222
+ return response_array
223
+ end
224
+
225
+ puts response
226
+
227
+ #Verificacion de certificado respuesta
228
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
229
+
230
+ if !Verifier.verify(response, tbk_cert)
231
+ puts "El Certificado de respuesta es Invalido."
232
+ response_array ={
233
+ "error_desc" => 'El Certificado de respuesta es Invalido'
234
+ }
235
+ return response_array
236
+ else
237
+ puts "El Certificado de respuesta es Valido."
238
+ end
239
+
240
+
241
+ response_document = Nokogiri::HTML(response.to_s)
242
+ puts response_document.to_s
243
+
244
+ responseCode = response_document.xpath("//responsecode").text
245
+ authCode = response_document.xpath("//authorizationcode").text
246
+ transactionId = response_document.xpath("//transactionid").text
247
+ last4CardDigits = response_document.xpath("//last4carddigits").text
248
+ creditCardType = response_document.xpath("//creditcardtype").text
249
+
250
+
251
+ response_array ={
252
+ "responseCode" => responseCode.to_s,
253
+ "authCode" => authCode.to_s,
254
+ "transactionId" => transactionId.to_s,
255
+ "last4CardDigits" => last4CardDigits.to_s,
256
+ "creditCardType" => creditCardType.to_s,
257
+ "error_desc" => 'TRX_OK'
258
+ }
259
+
260
+ return response_array
261
+ end
262
+
263
+
264
+
265
+ ##############################################
266
+ def reverse(buyOrder)
267
+
268
+ reverseInput ={
269
+ "arg0" => {
270
+ "buyorder" => buyOrder
271
+ }
272
+ }
273
+
274
+ #Preparacion firma
275
+ req = @client.build_request(:reverse, message: reverseInput)
276
+
277
+ #firmar la peticion
278
+ document = sign_xml(req)
279
+
280
+ #Se realiza el getResult
281
+ begin
282
+ puts "Iniciando reverse..."
283
+ response = @client.call(:reverse) do
284
+ xml document.to_xml(:save_with => 0)
285
+ end
286
+
287
+ rescue Exception, RuntimeError => e
288
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
289
+ response_array ={
290
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
291
+ }
292
+ return response_array
293
+ end
294
+
295
+ #Se revisa que respuesta no sea nula.
296
+ if response
297
+ puts 'Respuesta reverse: '+ response.to_s
298
+ else
299
+ puts 'Webservice Webpay responde con null'
300
+ response_array ={
301
+ "error_desc" => 'Webservice Webpay responde con null'
302
+ }
303
+ return response_array
304
+ end
305
+
306
+ puts response
307
+
308
+ #Verificacion de certificado respuesta
309
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
310
+
311
+ if !Verifier.verify(response, tbk_cert)
312
+ puts "El Certificado de respuesta es Invalido."
313
+ response_array ={
314
+ "error_desc" => 'El Certificado de respuesta es Invalido'
315
+ }
316
+ return response_array
317
+ else
318
+ puts "El Certificado de respuesta es Valido."
319
+ end
320
+
321
+
322
+ response_document = Nokogiri::HTML(response.to_s)
323
+ puts response_document.to_s
324
+
325
+ response = response_document.xpath("//return").text
326
+
327
+ response_array ={
328
+ "response" => response.to_s,
329
+ "error_desc" => 'TRX_OK'
330
+ }
331
+
332
+ return response_array
333
+ end
334
+
335
+
336
+ ##############################################
337
+ def removeUser(tbkUser, username)
338
+
339
+ removeInput ={
340
+ "arg0" => {
341
+ "tbkUser" => tbkUser,
342
+ "username" => username
343
+ }
344
+ }
345
+
346
+ #Preparacion firma
347
+ req = @client.build_request(:remove_user, message: removeInput)
348
+ #firmar la peticion
349
+ document = sign_xml(req)
350
+ #document = Util.signXml(req)
351
+
352
+ #Se realiza el getResult
353
+ begin
354
+ puts "Iniciando removeUser..."
355
+ response = @client.call(:remove_user) do
356
+ xml document.to_xml(:save_with => 0)
357
+ end
358
+
359
+ rescue Exception, RuntimeError => e
360
+ puts "Ocurrio un error en la llamada a Webpay: "+e.message
361
+ response_array ={
362
+ "error_desc" => "Ocurrio un error en la llamada a Webpay: "+e.message
363
+ }
364
+ return response_array
365
+ end
366
+
367
+ #Se revisa que respuesta no sea nula.
368
+ if response
369
+ puts 'Respuesta remove: '+ response.to_s
370
+ else
371
+ puts 'Webservice Webpay responde con null'
372
+ response_array ={
373
+ "error_desc" => 'Webservice Webpay responde con null'
374
+ }
375
+ return response_array
376
+ end
377
+
378
+ puts response
379
+
380
+ #Verificacion de certificado respuesta
381
+ tbk_cert = OpenSSL::X509::Certificate.new(@webpay_cert)
382
+
383
+ if !Verifier.verify(response, tbk_cert)
384
+ puts "El Certificado de respuesta es Invalido."
385
+ response_array ={
386
+ "error_desc" => 'El Certificado de respuesta es Invalido'
387
+ }
388
+ return response_array
389
+ else
390
+ puts "El Certificado de respuesta es Valido."
391
+ end
392
+
393
+
394
+ response_document = Nokogiri::HTML(response.to_s)
395
+ puts response_document.to_s
396
+
397
+ response = response_document.xpath("//return").text
398
+
399
+ response_array ={
400
+ "response" => response.to_s,
401
+ "error_desc" => 'TRX_OK'
402
+ }
403
+
404
+ return response_array
405
+ end
406
+
407
+
408
+ #######################################################
409
+ def sign_xml (input_xml)
410
+
411
+ document = Nokogiri::XML(input_xml.body)
412
+ envelope = document.at_xpath("//env:Envelope")
413
+ envelope.prepend_child("<env:Header><wsse:Security xmlns:wsse='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd' wsse:mustUnderstand='1'/></env:Header>")
414
+ xml = document.to_s
415
+
416
+ signer = Signer.new(xml)
417
+
418
+ signer.cert = OpenSSL::X509::Certificate.new(@public_cert)
419
+ signer.private_key = OpenSSL::PKey::RSA.new(@private_key)
420
+
421
+ signer.document.xpath("//soapenv:Body", { "soapenv" => "http://schemas.xmlsoap.org/soap/envelope/" }).each do |node|
422
+ signer.digest!(node)
423
+ end
424
+
425
+ signer.sign!(:issuer_serial => true)
426
+ signed_xml = signer.to_xml
427
+
428
+ document = Nokogiri::XML(signed_xml)
429
+ x509data = document.at_xpath("//*[local-name()='X509Data']")
430
+ new_data = x509data.clone()
431
+ new_data.set_attribute("xmlns:ds", "http://www.w3.org/2000/09/xmldsig#")
432
+
433
+ n = Nokogiri::XML::Node.new('wsse:SecurityTokenReference', document)
434
+ n.add_child(new_data)
435
+ x509data.add_next_sibling(n)
436
+
437
+ return document
438
+ end
439
+
440
+ end