hps 1.0.1 → 1.0.2

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.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +8 -8
  3. data/LICENSE.txt +32 -32
  4. data/PRIVACY.txt +65 -65
  5. data/README.md +40 -40
  6. data/Rakefile +15 -15
  7. data/hps.gemspec +26 -26
  8. data/lib/hps/configuration.rb +16 -16
  9. data/lib/hps/entities/hps_account_verify.rb +8 -8
  10. data/lib/hps/entities/hps_address.rb +6 -6
  11. data/lib/hps/entities/hps_authorization.rb +12 -12
  12. data/lib/hps/entities/hps_batch.rb +6 -6
  13. data/lib/hps/entities/hps_cardholder.rb +10 -6
  14. data/lib/hps/entities/hps_charge.rb +8 -8
  15. data/lib/hps/entities/hps_charge_exceptions.rb +6 -6
  16. data/lib/hps/entities/hps_credit_card.rb +32 -32
  17. data/lib/hps/entities/hps_refund.rb +8 -8
  18. data/lib/hps/entities/hps_report_transaction_details.rb +10 -10
  19. data/lib/hps/entities/hps_report_transaction_summary.rb +6 -6
  20. data/lib/hps/entities/hps_reversal.rb +10 -10
  21. data/lib/hps/entities/hps_token_data.rb +10 -10
  22. data/lib/hps/entities/hps_transaction.rb +161 -161
  23. data/lib/hps/entities/hps_transaction_details.rb +6 -6
  24. data/lib/hps/entities/hps_transaction_header.rb +8 -8
  25. data/lib/hps/entities/hps_transaction_type.rb +16 -16
  26. data/lib/hps/entities/hps_void.rb +8 -8
  27. data/lib/hps/infrastructure/api_connection_exception.rb +11 -11
  28. data/lib/hps/infrastructure/authentication_exception.rb +11 -11
  29. data/lib/hps/infrastructure/card_exception.rb +15 -15
  30. data/lib/hps/infrastructure/exceptions.json +468 -468
  31. data/lib/hps/infrastructure/hps_exception.rb +25 -25
  32. data/lib/hps/infrastructure/hps_exception_mapper.rb +134 -134
  33. data/lib/hps/infrastructure/hps_sdk_codes.rb +48 -48
  34. data/lib/hps/infrastructure/invalid_request_exception.rb +15 -15
  35. data/lib/hps/services/hps_batch_service.rb +29 -29
  36. data/lib/hps/services/hps_charge_service.rb +634 -634
  37. data/lib/hps/services/hps_service.rb +128 -128
  38. data/lib/hps/version.rb +3 -3
  39. data/lib/hps.rb +45 -45
  40. data/tests/amex_tests.rb +230 -230
  41. data/tests/cert_tests.rb +80 -80
  42. data/tests/discover_tests.rb +324 -324
  43. data/tests/exception_mapper_tests.rb +244 -244
  44. data/tests/general_tests.rb +58 -58
  45. data/tests/hps_token_service.rb +56 -56
  46. data/tests/mastercard_tests.rb +325 -325
  47. data/tests/secret_key.rb +11 -11
  48. data/tests/test_data.rb +127 -127
  49. data/tests/test_helper.rb +108 -92
  50. data/tests/token_tests.rb +513 -513
  51. data/tests/visa_tests.rb +378 -378
  52. metadata +4 -6
  53. data/.DS_Store +0 -0
  54. data/.gitignore +0 -24
@@ -1,635 +1,635 @@
1
- module Hps
2
- class HpsChargeService < HpsService
3
-
4
- def get(transaction_id)
5
-
6
- if transaction_id.nil? or transaction_id == 0
7
- raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_transaction_id)
8
- end
9
-
10
- xml = Builder::XmlMarkup.new
11
- xml.hps :Transaction do
12
- xml.hps :ReportTxnDetail do
13
- xml.hps :TxnId, transaction_id
14
- end
15
- end
16
-
17
- response = doTransaction(xml.target!)
18
- detail = response["Transaction"]["ReportTxnDetail"]
19
-
20
- header = hydrate_transaction_header(response["Header"])
21
- result = HpsReportTransactionDetails.new(header)
22
- result.transaction_id = detail["GatewayTxnId"]
23
- result.original_transaction_id = detail["OriginalGatewayTxnId"]
24
- result.authorized_amount = detail["Data"]["AuthAmt"]
25
- result.authorization_code = detail["Data"]["AuthCode"]
26
- result.avs_result_code = detail["Data"]["AVSRsltCode"]
27
- result.avs_result_text = detail["Data"]["AVSRsltText"]
28
- result.card_type = detail["Data"]["CardType"]
29
- result.masked_card_number = detail["Data"]["MaskedCardNbr"]
30
- result.transaction_type = Hps.service_name_to_transaction_type(detail["ServiceName"])
31
- result.transaction_date = detail["RspUtcDT"]
32
- result.cpc_indicator = detail["Data"]["CPCInd"]
33
- result.cvv_result_code = detail["Data"]["CVVRsltCode"]
34
- result.cvv_result_text = detail["Data"]["CVVRsltText"]
35
- result.reference_number = detail["Data"]["RefNbr"]
36
- result.response_code = detail["Data"]["RspCode"]
37
- result.response_text = detail["Data"]["RspText"]
38
-
39
- tokenization_message = detail["Data"]["TokenizationMsg"]
40
-
41
- unless tokenization_message.nil?
42
- result.token_data = HpsTokenData.new(tokenization_message)
43
- end
44
-
45
- header_response_code = response["Header"]["GatewayRspCode"]
46
- data_response_code = detail["Data"]["RspCode"]
47
-
48
- if header_response_code != "0" or data_response_code != "00"
49
-
50
- exceptions = HpsChargeExceptions.new()
51
-
52
- if header_response_code != "0"
53
- message = response["Header"]["GatewayRspMsg"]
54
- exceptions.hps_exception = @exception_mapper.map_gateway_exception(result.transaction_id, header_response_code, message)
55
- end
56
-
57
- if data_response_code != "0"
58
- message = detail["Data"]["RspText"]
59
- exceptions.card_exception = @exception_mapper.map_issuer_exception(transaction_id, data_response_code, message)
60
- end
61
-
62
- result.exceptions = exceptions
63
-
64
- end
65
-
66
- result
67
-
68
- end
69
-
70
- def list(start_date, end_date, filter_by = nil)
71
-
72
- if start_date > DateTime.now
73
- raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_start_date)
74
- elsif end_date > DateTime.now
75
- raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_end_date)
76
- end
77
-
78
- xml = Builder::XmlMarkup.new
79
- xml.hps :Transaction do
80
- xml.hps :ReportActivity do
81
- xml.hps :RptStartUtcDT, start_date.utc.iso8601
82
- xml.hps :RptEndUtcDT, end_date.utc.iso8601
83
- end
84
- end
85
-
86
- response = doTransaction(xml.target!)
87
-
88
- # Gateway exception
89
- if response["Header"]["GatewayRspCode"] != "0"
90
- transaction_id = response["Header"]["GatewayTxnId"]
91
- response_code = response["Header"]["GatewayRspCode"]
92
- response_message = response["Header"]["GatewayRspMsg"]
93
- raise @exception_mapper.map_gateway_exception(transaction_id, response_code, response_message)
94
- end
95
-
96
- result = Array.new
97
-
98
- if response["Transaction"]["ReportActivity"]["Header"]["TxnCnt"] == "0"
99
- return result
100
- end
101
-
102
- response["Transaction"]["ReportActivity"]["Details"].each { |charge|
103
-
104
- next if !filter_by.nil? and charge.serviceName != Hps.transaction_type_to_service_name(filter_by)
105
-
106
- summary = HpsReportTransactionSummary.new()
107
- summary.transaction_id = charge["GatewayTxnId"]
108
- summary.original_transaction_id = charge["OriginalGatewayTxnId"]
109
- summary.masked_card_number = charge["MaskedCardNbr"]
110
- summary.response_code = charge["IssuerRspCode"]
111
- summary.response_text = charge["IssuerRspText"]
112
- summary.transaction_type = Hps.transaction_type_to_service_name(charge["ServiceName"]) if filter_by.nil? == false
113
-
114
- gw_response_code = charge["GatewayRspCode"]
115
- issuer_response_code = charge["IssuerRspCode"]
116
-
117
- if gw_response_code != "0" or issuer_response_code != "00"
118
-
119
- exceptions = HpsChargeExceptions.new()
120
-
121
- if gw_response_code != "0"
122
- message = charge["GatewayRspMsg"]
123
- exceptions.hps_exception = @exception_mapper.map_gateway_exception(charge["GatewayTxnId"], gw_response_code, message)
124
- end
125
-
126
- if issuer_response_code != "0"
127
- message = charge["IssuerRspText"]
128
- exceptions.card_exception = @exception_mapper.map_issuer_exception(charge["GatewayTxnId"], issuer_response_code, message)
129
- end
130
-
131
- summary.exceptions = exceptions
132
-
133
- end
134
-
135
- result << summary
136
- }
137
-
138
- result
139
- end
140
-
141
- def charge(amount, currency, card, card_holder = nil, request_multi_use_token = false, details = nil)
142
- check_amount(amount)
143
- check_currency(currency)
144
-
145
- xml = Builder::XmlMarkup.new
146
- xml.hps :Transaction do
147
- xml.hps :CreditSale do
148
- xml.hps :Block1 do
149
- xml.hps :AllowDup, "Y"
150
- xml.hps :Amt, amount
151
- xml << hydrate_cardholder_data(card_holder) if card_holder
152
- xml << hydrate_additional_txn_fields(details) if details
153
- xml.hps :CardData do
154
-
155
- # NOTE: Process as Manual Entry if they gave us a Credit Card
156
- if card.is_a? HpsCreditCard
157
- xml << hydrate_manual_entry(card)
158
- # Note: Otherwise, consider it a token
159
- else
160
- xml.hps :TokenData do
161
- xml.hps :TokenValue, card
162
- end
163
- end
164
-
165
- xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
166
-
167
- end
168
- end
169
- end
170
- end
171
-
172
- submit_charge(xml.target!, amount, currency)
173
- end
174
-
175
- def verify(card, card_holder = nil, request_multi_use_token = false)
176
-
177
- xml = Builder::XmlMarkup.new
178
- xml.hps :Transaction do
179
- xml.hps :CreditAccountVerify do
180
- xml.hps :Block1 do
181
- xml << hydrate_cardholder_data(card_holder) if card_holder
182
- xml.hps :CardData do
183
-
184
- # NOTE: Process as Manual Entry if they gave us a Credit Card
185
- if card.is_a? HpsCreditCard
186
- xml << hydrate_manual_entry(card)
187
- # Note: Otherwise, consider it a token
188
- else
189
- xml.hps :TokenData do
190
- xml.hps :TokenValue, card
191
- end
192
- end
193
-
194
- xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
195
-
196
- end
197
- end
198
- end
199
- end
200
-
201
- submit_verify(xml.target!)
202
- end
203
-
204
- def authorize(amount, currency, card, card_holder = nil, request_multi_use_token = false, details = nil)
205
-
206
- check_amount(amount)
207
- check_currency(currency)
208
-
209
- xml = Builder::XmlMarkup.new
210
- xml.hps :Transaction do
211
- xml.hps :CreditAuth do
212
- xml.hps :Block1 do
213
- xml.hps :AllowDup, "Y"
214
- xml.hps :Amt, amount
215
- xml << hydrate_cardholder_data(card_holder) if card_holder
216
- xml << hydrate_additional_txn_fields(details) if details
217
- xml.hps :CardData do
218
-
219
- # NOTE: Process as Manual Entry if they gave us a Credit Card
220
- if card.is_a? HpsCreditCard
221
- xml << hydrate_manual_entry(card)
222
- # Note: Otherwise, consider it a token
223
- else
224
- xml.hps :TokenData do
225
- xml.hps :TokenValue, card
226
- end
227
- end
228
-
229
- xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
230
-
231
- end
232
- end
233
- end
234
- end
235
-
236
- submit_authorize(xml.target!, amount, currency)
237
- end
238
-
239
- def capture(transaction_id, amount = nil)
240
-
241
- xml = Builder::XmlMarkup.new
242
- xml.hps :Transaction do
243
- xml.hps :CreditAddToBatch do
244
- xml.hps :GatewayTxnId, transaction_id
245
- xml.hps :Amt, amount if amount
246
- end
247
- end
248
-
249
- response = doTransaction(xml.target!)
250
- header = response["Header"]
251
-
252
- raise @exception_mapper.map_gateway_exception(transaction_id, header["GatewayRspCode"], header["GatewayRspMsg"]) unless header["GatewayRspCode"].eql? "0"
253
-
254
- get(transaction_id)
255
- end
256
-
257
- def reverse(card, amount, currency, details = nil)
258
- check_amount(amount)
259
- check_currency(currency)
260
-
261
- xml = Builder::XmlMarkup.new
262
- xml.hps :Transaction do
263
- xml.hps :CreditReversal do
264
- xml.hps :Block1 do
265
- xml.hps :Amt, amount
266
- xml << hydrate_additional_txn_fields(details) if details
267
- xml.hps :CardData do
268
-
269
- # NOTE: Process as Manual Entry if they gave us a Credit Card
270
- if card.is_a? HpsCreditCard
271
- xml << hydrate_manual_entry(card)
272
- # Note: Otherwise, consider it a token
273
- else
274
- xml.hps :TokenData do
275
- xml.hps :TokenValue, card
276
- end
277
- end
278
-
279
- end
280
- end
281
- end
282
- end
283
-
284
- submit_reverse(xml.target!)
285
- end
286
-
287
- def reverse_transaction(transaction_id, amount, currency, details = nil)
288
- check_amount(amount)
289
- check_currency(currency)
290
-
291
- xml = Builder::XmlMarkup.new
292
- xml.hps :Transaction do
293
- xml.hps :CreditReversal do
294
- xml.hps :Block1 do
295
- xml.hps :Amt, amount
296
- xml.hps :GatewayTxnId, transaction_id
297
- xml << hydrate_additional_txn_fields(details) if details
298
- end
299
- end
300
- end
301
-
302
- submit_reverse(xml.target!)
303
- end
304
-
305
- def refund(amount, currency, card, card_holder = nil, details = nil)
306
- check_amount(amount)
307
- check_currency(currency)
308
-
309
- xml = Builder::XmlMarkup.new
310
- xml.hps :Transaction do
311
- xml.hps :CreditReturn do
312
- xml.hps :Block1 do
313
- xml.hps :AllowDup, "Y"
314
- xml.hps :Amt, amount
315
- xml << hydrate_cardholder_data(card_holder) if card_holder
316
- xml << hydrate_additional_txn_fields(details) if details
317
- xml.hps :CardData do
318
-
319
- # NOTE: Process as Manual Entry if they gave us a Credit Card
320
- if card.is_a? HpsCreditCard
321
- xml << hydrate_manual_entry(card)
322
- # Note: Otherwise, consider it a token
323
- else
324
- xml.hps :TokenData do
325
- xml.hps :TokenValue, card
326
- end
327
- end
328
-
329
- end
330
- end
331
- end
332
- end
333
-
334
- submit_refund(xml.target!)
335
- end
336
-
337
- def refund_transaction(amount, currency, transaction_id, card_holder = nil, details = nil)
338
- check_amount(amount)
339
- check_currency(currency)
340
-
341
- xml = Builder::XmlMarkup.new
342
- xml.hps :Transaction do
343
- xml.hps :CreditReturn do
344
- xml.hps :Block1 do
345
- xml.hps :AllowDup, "Y"
346
- xml.hps :Amt, amount
347
- xml.hps :GatewayTxnId, transaction_id
348
- xml << hydrate_cardholder_data(card_holder) if card_holder
349
- xml << hydrate_additional_txn_fields(details) if details
350
- end
351
- end
352
- end
353
-
354
- submit_refund(xml.target!)
355
- end
356
-
357
- def void(transaction_id)
358
- xml = Builder::XmlMarkup.new
359
- xml.hps :Transaction do
360
- xml.hps :CreditVoid do
361
- xml.hps :GatewayTxnId, transaction_id
362
- end
363
- end
364
-
365
- submit_void(xml.target!)
366
- end
367
- private
368
-
369
- def check_amount(amount)
370
- raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_amount) if amount.nil? or amount <= 0
371
- end
372
-
373
- def check_currency(currency)
374
- raise @exception_mapper.map_sdk_exception(SdkCodes.missing_currency) if currency.empty?
375
- raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_currency) unless currency.downcase.eql? "usd"
376
- end
377
-
378
- def hydrate_cardholder_data(card_holder)
379
- xml = Builder::XmlMarkup.new
380
- xml.hps :CardHolderData do
381
- xml.hps :CardHolderFirstName, card_holder.first_name
382
- xml.hps :CardHolderLastName, card_holder.last_name
383
- xml.hps :CardHolderEmail, card_holder.email_address
384
- xml.hps :CardHolderPhone, card_holder.phone
385
- xml.hps :CardHolderAddr, card_holder.address.address
386
- xml.hps :CardHolderCity, card_holder.address.city
387
- xml.hps :CardHolderState, card_holder.address.state
388
- xml.hps :CardHolderZip, card_holder.address.zip
389
- end
390
- xml.target!
391
- end
392
-
393
- def hydrate_manual_entry(card)
394
- xml = Builder::XmlMarkup.new
395
- xml.hps :ManualEntry do
396
- xml.hps :CardNbr, card.number
397
- xml.hps :ExpMonth, card.exp_month
398
- xml.hps :ExpYear, card.exp_year
399
- xml.hps :CVV2, card.cvv
400
- xml.hps :CardPresent, "N"
401
- xml.hps :ReaderPresent, "N"
402
- end
403
- xml.target!
404
- end
405
-
406
- def hydrate_additional_txn_fields(details)
407
- xml = Builder::XmlMarkup.new
408
- xml.hps :AdditionalTxnFields do
409
- xml.hps :Description, details.memo if details.memo
410
- xml.hps :InvoiceNbr, details.invoice_number if details.invoice_number
411
- xml.hps :CustomerID, details.customer_id if details.customer_id
412
- end
413
- xml.target!
414
- end
415
-
416
- def submit_charge(transaction, amount, currency)
417
-
418
- response = doTransaction(transaction)
419
-
420
- header = response["Header"]
421
- process_charge_gateway_response(header["GatewayRspCode"], header["GatewayRspMsg"], header["GatewayTxnId"], amount, currency)
422
-
423
- creditSaleRsp = response["Transaction"]["CreditSale"]
424
- process_charge_issuer_response(creditSaleRsp["RspCode"], creditSaleRsp["RspText"], header["GatewayTxnId"], amount, currency)
425
-
426
- result = HpsCharge.new(hydrate_transaction_header(header))
427
- result.transaction_id = header["GatewayTxnId"]
428
- result.authorized_amount = creditSaleRsp["AuthAmt"]
429
- result.authorization_code = creditSaleRsp["AuthCode"]
430
- result.avs_result_code = creditSaleRsp["AVSRsltCode"]
431
- result.avs_result_text = creditSaleRsp["AVSRsltText"]
432
- result.card_type = creditSaleRsp["CardType"]
433
- result.cpc_indicator = creditSaleRsp["CPCInd"]
434
- result.cvv_result_code = creditSaleRsp["CVVRsltCode"]
435
- result.cvv_result_text = creditSaleRsp["CVVRsltText"]
436
- result.reference_number = creditSaleRsp["RefNbr"]
437
- result.response_code = creditSaleRsp["RspCode"]
438
- result.response_text = creditSaleRsp["RspText"]
439
-
440
- unless header["TokenData"].nil?
441
- result.token_data = HpsTokenData.new()
442
- result.token_data.response_code = header["TokenData"]["TokenRspCode"];
443
- result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
444
- result.token_data.token_value = header["TokenData"]["TokenValue"]
445
- end
446
-
447
- result
448
- end
449
-
450
- def submit_authorize(transaction, amount, currency)
451
-
452
- response = doTransaction(transaction)
453
- header = response["Header"]
454
- process_charge_gateway_response(header["GatewayRspCode"], header["GatewayRspMsg"], header["GatewayTxnId"], amount, currency)
455
-
456
- auth_response = response["Transaction"]["CreditAuth"]
457
- process_charge_issuer_response(auth_response["RspCode"], auth_response["RspText"], header["GatewayTxnId"], amount, currency)
458
-
459
- result = HpsAuthorization.new(hydrate_transaction_header(header))
460
- result.transaction_id = header["GatewayTxnId"]
461
- result.authorized_amount = auth_response["AuthAmt"]
462
- result.authorization_code = auth_response["AuthCode"]
463
- result.avs_result_code = auth_response["AVSRsltCode"]
464
- result.avs_result_text = auth_response["AVSRsltText"]
465
- result.card_type = auth_response["CardType"]
466
- result.cpc_indicator = auth_response["CPCInd"]
467
- result.cvv_result_code = auth_response["CVVRsltCode"]
468
- result.cvv_result_text = auth_response["CVVRsltText"]
469
- result.reference_number = auth_response["RefNbr"]
470
- result.response_code = auth_response["RspCode"]
471
- result.response_text = auth_response["RspText"]
472
-
473
- unless header["TokenData"].nil?
474
- result.token_data = HpsTokenData.new()
475
- result.token_data.response_code = header["TokenData"]["TokenRspCode"];
476
- result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
477
- result.token_data.token_value = header["TokenData"]["TokenValue"]
478
- end
479
-
480
- result
481
- end
482
-
483
- def submit_refund(transaction)
484
-
485
- response = doTransaction(transaction)
486
- header = response["Header"]
487
-
488
- unless header["GatewayRspCode"].eql? "0"
489
- raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
490
- end
491
-
492
- result = HpsRefund.new(hydrate_transaction_header(header))
493
- result.transaction_id = header["GatewayTxnId"]
494
- result.response_code = "00"
495
- result.response_text = ""
496
-
497
- result
498
- end
499
-
500
- def submit_reverse(transaction)
501
-
502
- response = doTransaction(transaction)
503
- header = response["Header"]
504
-
505
- if !header["GatewayRspCode"].eql? "0"
506
- raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
507
- end
508
-
509
- reversal = response["Transaction"]["CreditReversal"]
510
- result = HpsReversal.new(hydrate_transaction_header(header))
511
- result.transaction_id = header["GatewayTxnId"]
512
- result.avs_result_code = reversal["AVSRsltCode"]
513
- result.avs_result_text = reversal["AVSRsltText"]
514
- result.cpc_indicator = reversal["CPCInd"]
515
- result.cvv_result_code = reversal["CVVRsltCode"]
516
- result.cvv_result_text = reversal["CVVRsltText"]
517
- result.reference_number = reversal["RefNbr"]
518
- result.response_code = reversal["RspCode"]
519
- result.response_text = reversal["RspText"]
520
- result
521
- end
522
-
523
- def submit_verify(transaction)
524
- response = doTransaction(transaction)
525
- header = response["Header"]
526
-
527
- if !header["GatewayRspCode"].eql? "0"
528
- raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
529
- end
530
-
531
- account_verify = response["Transaction"]["CreditAccountVerify"]
532
- result = HpsAccountVerify.new(hydrate_transaction_header(header))
533
- result.transaction_id = header["GatewayTxnId"]
534
- result.avs_result_code = account_verify["AVSRsltCode"]
535
- result.avs_result_text = account_verify["AVSRsltText"]
536
- result.reference_number = account_verify["RefNbr"]
537
- result.response_code = account_verify["RspCode"]
538
- result.response_text = account_verify["RspText"]
539
- result.card_type = account_verify["CardType"]
540
- result.cpc_indicator = account_verify["CPCInd"]
541
- result.cvv_result_code = account_verify["CVVRsltCode"]
542
- result.cvv_result_text = account_verify["CVVRsltText"]
543
- result.authorization_code = account_verify["AuthCode"]
544
- result.authorized_amount = account_verify["AuthAmt"]
545
-
546
- if [ "85", "00" ].include? result.response_code == false
547
- raise @exception_mapper.map_issuer_exception(result.transaction_id, result.response_code, result.response_text)
548
- end
549
-
550
- unless header["TokenData"].nil?
551
- result.token_data = HpsTokenData.new()
552
- result.token_data.response_code = header["TokenData"]["TokenRspCode"];
553
- result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
554
- result.token_data.token_value = header["TokenData"]["TokenValue"]
555
- end
556
-
557
- result
558
- end
559
-
560
- def submit_void(transaction)
561
- response = doTransaction(transaction)
562
- header = response["Header"]
563
- unless header["GatewayRspCode"].eql? "0"
564
- raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
565
- end
566
-
567
- result = HpsVoid.new(hydrate_transaction_header(header))
568
- result.transaction_id = header["GatewayTxnId"]
569
- result.response_code = "00"
570
- result.response_text = ""
571
- result
572
- end
573
-
574
- def process_charge_gateway_response(response_code, response_text, transaction_id, amount, currency)
575
-
576
- if !response_code.eql? "0"
577
-
578
- if response_code.eql? "30"
579
-
580
- begin
581
-
582
- reverse_transaction(transaction_id, amount, currency)
583
-
584
- rescue => e
585
- exception = @exception_mapper.map_sdk_exception(SdkCodes.reversal_error_after_gateway_timeout, e)
586
- exception.response_code = response_code
587
- exception.response_text = response_text
588
- raise exception
589
- end
590
-
591
- end
592
-
593
- exception = @exception_mapper.map_gateway_exception(transaction_id, response_code, response_text)
594
- exception.response_code = response_code
595
- exception.response_text = response_text
596
- raise exception
597
-
598
- end
599
-
600
- end
601
-
602
- def process_charge_issuer_response(response_code, response_text, transaction_id, amount, currency)
603
-
604
- if response_code.eql? "91"
605
-
606
- begin
607
-
608
- reverse_transaction(transaction_id, amount, currency)
609
-
610
- rescue => e
611
- exception = @exception_mapper.map_sdk_exception(SdkCodes.reversal_error_after_issuer_timeout, e)
612
- exception.response_code = response_code
613
- exception.response_text = response_text
614
- raise exception
615
- end
616
-
617
- exception = @exception_mapper.map_sdk_exception(SdkCodes.processing_error)
618
- exception.response_code = response_code
619
- exception.response_text = response_text
620
- raise exception
621
-
622
- elsif !response_code.eql? "00"
623
-
624
- exception = @exception_mapper.map_issuer_exception(transaction_id, response_code, response_text)
625
- exception.response_code = response_code
626
- exception.response_text = response_text
627
- raise exception
628
-
629
- end
630
-
631
- end
632
-
633
- end
634
-
1
+ module Hps
2
+ class HpsChargeService < HpsService
3
+
4
+ def get(transaction_id)
5
+
6
+ if transaction_id.nil? or transaction_id == 0
7
+ raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_transaction_id)
8
+ end
9
+
10
+ xml = Builder::XmlMarkup.new
11
+ xml.hps :Transaction do
12
+ xml.hps :ReportTxnDetail do
13
+ xml.hps :TxnId, transaction_id
14
+ end
15
+ end
16
+
17
+ response = doTransaction(xml.target!)
18
+ detail = response["Transaction"]["ReportTxnDetail"]
19
+
20
+ header = hydrate_transaction_header(response["Header"])
21
+ result = HpsReportTransactionDetails.new(header)
22
+ result.transaction_id = detail["GatewayTxnId"]
23
+ result.original_transaction_id = detail["OriginalGatewayTxnId"]
24
+ result.authorized_amount = detail["Data"]["AuthAmt"]
25
+ result.authorization_code = detail["Data"]["AuthCode"]
26
+ result.avs_result_code = detail["Data"]["AVSRsltCode"]
27
+ result.avs_result_text = detail["Data"]["AVSRsltText"]
28
+ result.card_type = detail["Data"]["CardType"]
29
+ result.masked_card_number = detail["Data"]["MaskedCardNbr"]
30
+ result.transaction_type = Hps.service_name_to_transaction_type(detail["ServiceName"])
31
+ result.transaction_date = detail["RspUtcDT"]
32
+ result.cpc_indicator = detail["Data"]["CPCInd"]
33
+ result.cvv_result_code = detail["Data"]["CVVRsltCode"]
34
+ result.cvv_result_text = detail["Data"]["CVVRsltText"]
35
+ result.reference_number = detail["Data"]["RefNbr"]
36
+ result.response_code = detail["Data"]["RspCode"]
37
+ result.response_text = detail["Data"]["RspText"]
38
+
39
+ tokenization_message = detail["Data"]["TokenizationMsg"]
40
+
41
+ unless tokenization_message.nil?
42
+ result.token_data = HpsTokenData.new(tokenization_message)
43
+ end
44
+
45
+ header_response_code = response["Header"]["GatewayRspCode"]
46
+ data_response_code = detail["Data"]["RspCode"]
47
+
48
+ if header_response_code != "0" or data_response_code != "00"
49
+
50
+ exceptions = HpsChargeExceptions.new()
51
+
52
+ if header_response_code != "0"
53
+ message = response["Header"]["GatewayRspMsg"]
54
+ exceptions.hps_exception = @exception_mapper.map_gateway_exception(result.transaction_id, header_response_code, message)
55
+ end
56
+
57
+ if data_response_code != "0"
58
+ message = detail["Data"]["RspText"]
59
+ exceptions.card_exception = @exception_mapper.map_issuer_exception(transaction_id, data_response_code, message)
60
+ end
61
+
62
+ result.exceptions = exceptions
63
+
64
+ end
65
+
66
+ result
67
+
68
+ end
69
+
70
+ def list(start_date, end_date, filter_by = nil)
71
+
72
+ if start_date > DateTime.now
73
+ raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_start_date)
74
+ elsif end_date > DateTime.now
75
+ raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_end_date)
76
+ end
77
+
78
+ xml = Builder::XmlMarkup.new
79
+ xml.hps :Transaction do
80
+ xml.hps :ReportActivity do
81
+ xml.hps :RptStartUtcDT, start_date.utc.iso8601
82
+ xml.hps :RptEndUtcDT, end_date.utc.iso8601
83
+ end
84
+ end
85
+
86
+ response = doTransaction(xml.target!)
87
+
88
+ # Gateway exception
89
+ if response["Header"]["GatewayRspCode"] != "0"
90
+ transaction_id = response["Header"]["GatewayTxnId"]
91
+ response_code = response["Header"]["GatewayRspCode"]
92
+ response_message = response["Header"]["GatewayRspMsg"]
93
+ raise @exception_mapper.map_gateway_exception(transaction_id, response_code, response_message)
94
+ end
95
+
96
+ result = Array.new
97
+
98
+ if response["Transaction"]["ReportActivity"]["Header"]["TxnCnt"] == "0"
99
+ return result
100
+ end
101
+
102
+ response["Transaction"]["ReportActivity"]["Details"].each { |charge|
103
+
104
+ next if !filter_by.nil? and charge.serviceName != Hps.transaction_type_to_service_name(filter_by)
105
+
106
+ summary = HpsReportTransactionSummary.new()
107
+ summary.transaction_id = charge["GatewayTxnId"]
108
+ summary.original_transaction_id = charge["OriginalGatewayTxnId"]
109
+ summary.masked_card_number = charge["MaskedCardNbr"]
110
+ summary.response_code = charge["IssuerRspCode"]
111
+ summary.response_text = charge["IssuerRspText"]
112
+ summary.transaction_type = Hps.transaction_type_to_service_name(charge["ServiceName"]) if filter_by.nil? == false
113
+
114
+ gw_response_code = charge["GatewayRspCode"]
115
+ issuer_response_code = charge["IssuerRspCode"]
116
+
117
+ if gw_response_code != "0" or issuer_response_code != "00"
118
+
119
+ exceptions = HpsChargeExceptions.new()
120
+
121
+ if gw_response_code != "0"
122
+ message = charge["GatewayRspMsg"]
123
+ exceptions.hps_exception = @exception_mapper.map_gateway_exception(charge["GatewayTxnId"], gw_response_code, message)
124
+ end
125
+
126
+ if issuer_response_code != "0"
127
+ message = charge["IssuerRspText"]
128
+ exceptions.card_exception = @exception_mapper.map_issuer_exception(charge["GatewayTxnId"], issuer_response_code, message)
129
+ end
130
+
131
+ summary.exceptions = exceptions
132
+
133
+ end
134
+
135
+ result << summary
136
+ }
137
+
138
+ result
139
+ end
140
+
141
+ def charge(amount, currency, card, card_holder = nil, request_multi_use_token = false, details = nil)
142
+ check_amount(amount)
143
+ check_currency(currency)
144
+
145
+ xml = Builder::XmlMarkup.new
146
+ xml.hps :Transaction do
147
+ xml.hps :CreditSale do
148
+ xml.hps :Block1 do
149
+ xml.hps :AllowDup, "Y"
150
+ xml.hps :Amt, amount
151
+ xml << hydrate_cardholder_data(card_holder) if card_holder
152
+ xml << hydrate_additional_txn_fields(details) if details
153
+ xml.hps :CardData do
154
+
155
+ # NOTE: Process as Manual Entry if they gave us a Credit Card
156
+ if card.is_a? HpsCreditCard
157
+ xml << hydrate_manual_entry(card)
158
+ # Note: Otherwise, consider it a token
159
+ else
160
+ xml.hps :TokenData do
161
+ xml.hps :TokenValue, card
162
+ end
163
+ end
164
+
165
+ xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
166
+
167
+ end
168
+ end
169
+ end
170
+ end
171
+
172
+ submit_charge(xml.target!, amount, currency)
173
+ end
174
+
175
+ def verify(card, card_holder = nil, request_multi_use_token = false)
176
+
177
+ xml = Builder::XmlMarkup.new
178
+ xml.hps :Transaction do
179
+ xml.hps :CreditAccountVerify do
180
+ xml.hps :Block1 do
181
+ xml << hydrate_cardholder_data(card_holder) if card_holder
182
+ xml.hps :CardData do
183
+
184
+ # NOTE: Process as Manual Entry if they gave us a Credit Card
185
+ if card.is_a? HpsCreditCard
186
+ xml << hydrate_manual_entry(card)
187
+ # Note: Otherwise, consider it a token
188
+ else
189
+ xml.hps :TokenData do
190
+ xml.hps :TokenValue, card
191
+ end
192
+ end
193
+
194
+ xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
195
+
196
+ end
197
+ end
198
+ end
199
+ end
200
+
201
+ submit_verify(xml.target!)
202
+ end
203
+
204
+ def authorize(amount, currency, card, card_holder = nil, request_multi_use_token = false, details = nil)
205
+
206
+ check_amount(amount)
207
+ check_currency(currency)
208
+
209
+ xml = Builder::XmlMarkup.new
210
+ xml.hps :Transaction do
211
+ xml.hps :CreditAuth do
212
+ xml.hps :Block1 do
213
+ xml.hps :AllowDup, "Y"
214
+ xml.hps :Amt, amount
215
+ xml << hydrate_cardholder_data(card_holder) if card_holder
216
+ xml << hydrate_additional_txn_fields(details) if details
217
+ xml.hps :CardData do
218
+
219
+ # NOTE: Process as Manual Entry if they gave us a Credit Card
220
+ if card.is_a? HpsCreditCard
221
+ xml << hydrate_manual_entry(card)
222
+ # Note: Otherwise, consider it a token
223
+ else
224
+ xml.hps :TokenData do
225
+ xml.hps :TokenValue, card
226
+ end
227
+ end
228
+
229
+ xml.hps :TokenRequest, request_multi_use_token ? "Y" : "N"
230
+
231
+ end
232
+ end
233
+ end
234
+ end
235
+
236
+ submit_authorize(xml.target!, amount, currency)
237
+ end
238
+
239
+ def capture(transaction_id, amount = nil)
240
+
241
+ xml = Builder::XmlMarkup.new
242
+ xml.hps :Transaction do
243
+ xml.hps :CreditAddToBatch do
244
+ xml.hps :GatewayTxnId, transaction_id
245
+ xml.hps :Amt, amount if amount
246
+ end
247
+ end
248
+
249
+ response = doTransaction(xml.target!)
250
+ header = response["Header"]
251
+
252
+ raise @exception_mapper.map_gateway_exception(transaction_id, header["GatewayRspCode"], header["GatewayRspMsg"]) unless header["GatewayRspCode"].eql? "0"
253
+
254
+ get(transaction_id)
255
+ end
256
+
257
+ def reverse(card, amount, currency, details = nil)
258
+ check_amount(amount)
259
+ check_currency(currency)
260
+
261
+ xml = Builder::XmlMarkup.new
262
+ xml.hps :Transaction do
263
+ xml.hps :CreditReversal do
264
+ xml.hps :Block1 do
265
+ xml.hps :Amt, amount
266
+ xml << hydrate_additional_txn_fields(details) if details
267
+ xml.hps :CardData do
268
+
269
+ # NOTE: Process as Manual Entry if they gave us a Credit Card
270
+ if card.is_a? HpsCreditCard
271
+ xml << hydrate_manual_entry(card)
272
+ # Note: Otherwise, consider it a token
273
+ else
274
+ xml.hps :TokenData do
275
+ xml.hps :TokenValue, card
276
+ end
277
+ end
278
+
279
+ end
280
+ end
281
+ end
282
+ end
283
+
284
+ submit_reverse(xml.target!)
285
+ end
286
+
287
+ def reverse_transaction(transaction_id, amount, currency, details = nil)
288
+ check_amount(amount)
289
+ check_currency(currency)
290
+
291
+ xml = Builder::XmlMarkup.new
292
+ xml.hps :Transaction do
293
+ xml.hps :CreditReversal do
294
+ xml.hps :Block1 do
295
+ xml.hps :Amt, amount
296
+ xml.hps :GatewayTxnId, transaction_id
297
+ xml << hydrate_additional_txn_fields(details) if details
298
+ end
299
+ end
300
+ end
301
+
302
+ submit_reverse(xml.target!)
303
+ end
304
+
305
+ def refund(amount, currency, card, card_holder = nil, details = nil)
306
+ check_amount(amount)
307
+ check_currency(currency)
308
+
309
+ xml = Builder::XmlMarkup.new
310
+ xml.hps :Transaction do
311
+ xml.hps :CreditReturn do
312
+ xml.hps :Block1 do
313
+ xml.hps :AllowDup, "Y"
314
+ xml.hps :Amt, amount
315
+ xml << hydrate_cardholder_data(card_holder) if card_holder
316
+ xml << hydrate_additional_txn_fields(details) if details
317
+ xml.hps :CardData do
318
+
319
+ # NOTE: Process as Manual Entry if they gave us a Credit Card
320
+ if card.is_a? HpsCreditCard
321
+ xml << hydrate_manual_entry(card)
322
+ # Note: Otherwise, consider it a token
323
+ else
324
+ xml.hps :TokenData do
325
+ xml.hps :TokenValue, card
326
+ end
327
+ end
328
+
329
+ end
330
+ end
331
+ end
332
+ end
333
+
334
+ submit_refund(xml.target!)
335
+ end
336
+
337
+ def refund_transaction(amount, currency, transaction_id, card_holder = nil, details = nil)
338
+ check_amount(amount)
339
+ check_currency(currency)
340
+
341
+ xml = Builder::XmlMarkup.new
342
+ xml.hps :Transaction do
343
+ xml.hps :CreditReturn do
344
+ xml.hps :Block1 do
345
+ xml.hps :AllowDup, "Y"
346
+ xml.hps :Amt, amount
347
+ xml.hps :GatewayTxnId, transaction_id
348
+ xml << hydrate_cardholder_data(card_holder) if card_holder
349
+ xml << hydrate_additional_txn_fields(details) if details
350
+ end
351
+ end
352
+ end
353
+
354
+ submit_refund(xml.target!)
355
+ end
356
+
357
+ def void(transaction_id)
358
+ xml = Builder::XmlMarkup.new
359
+ xml.hps :Transaction do
360
+ xml.hps :CreditVoid do
361
+ xml.hps :GatewayTxnId, transaction_id
362
+ end
363
+ end
364
+
365
+ submit_void(xml.target!)
366
+ end
367
+ private
368
+
369
+ def check_amount(amount)
370
+ raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_amount) if amount.nil? or amount <= 0
371
+ end
372
+
373
+ def check_currency(currency)
374
+ raise @exception_mapper.map_sdk_exception(SdkCodes.missing_currency) if currency.empty?
375
+ raise @exception_mapper.map_sdk_exception(SdkCodes.invalid_currency) unless currency.downcase.eql? "usd"
376
+ end
377
+
378
+ def hydrate_cardholder_data(card_holder)
379
+ xml = Builder::XmlMarkup.new
380
+ xml.hps :CardHolderData do
381
+ xml.hps :CardHolderFirstName, card_holder.first_name
382
+ xml.hps :CardHolderLastName, card_holder.last_name
383
+ xml.hps :CardHolderEmail, card_holder.email_address
384
+ xml.hps :CardHolderPhone, card_holder.phone
385
+ xml.hps :CardHolderAddr, card_holder.address.address
386
+ xml.hps :CardHolderCity, card_holder.address.city
387
+ xml.hps :CardHolderState, card_holder.address.state
388
+ xml.hps :CardHolderZip, card_holder.address.zip
389
+ end
390
+ xml.target!
391
+ end
392
+
393
+ def hydrate_manual_entry(card)
394
+ xml = Builder::XmlMarkup.new
395
+ xml.hps :ManualEntry do
396
+ xml.hps :CardNbr, card.number
397
+ xml.hps :ExpMonth, card.exp_month
398
+ xml.hps :ExpYear, card.exp_year
399
+ xml.hps :CVV2, card.cvv
400
+ xml.hps :CardPresent, "N"
401
+ xml.hps :ReaderPresent, "N"
402
+ end
403
+ xml.target!
404
+ end
405
+
406
+ def hydrate_additional_txn_fields(details)
407
+ xml = Builder::XmlMarkup.new
408
+ xml.hps :AdditionalTxnFields do
409
+ xml.hps :Description, details.memo if details.memo
410
+ xml.hps :InvoiceNbr, details.invoice_number if details.invoice_number
411
+ xml.hps :CustomerID, details.customer_id if details.customer_id
412
+ end
413
+ xml.target!
414
+ end
415
+
416
+ def submit_charge(transaction, amount, currency)
417
+
418
+ response = doTransaction(transaction)
419
+
420
+ header = response["Header"]
421
+ process_charge_gateway_response(header["GatewayRspCode"], header["GatewayRspMsg"], header["GatewayTxnId"], amount, currency)
422
+
423
+ creditSaleRsp = response["Transaction"]["CreditSale"]
424
+ process_charge_issuer_response(creditSaleRsp["RspCode"], creditSaleRsp["RspText"], header["GatewayTxnId"], amount, currency)
425
+
426
+ result = HpsCharge.new(hydrate_transaction_header(header))
427
+ result.transaction_id = header["GatewayTxnId"]
428
+ result.authorized_amount = creditSaleRsp["AuthAmt"]
429
+ result.authorization_code = creditSaleRsp["AuthCode"]
430
+ result.avs_result_code = creditSaleRsp["AVSRsltCode"]
431
+ result.avs_result_text = creditSaleRsp["AVSRsltText"]
432
+ result.card_type = creditSaleRsp["CardType"]
433
+ result.cpc_indicator = creditSaleRsp["CPCInd"]
434
+ result.cvv_result_code = creditSaleRsp["CVVRsltCode"]
435
+ result.cvv_result_text = creditSaleRsp["CVVRsltText"]
436
+ result.reference_number = creditSaleRsp["RefNbr"]
437
+ result.response_code = creditSaleRsp["RspCode"]
438
+ result.response_text = creditSaleRsp["RspText"]
439
+
440
+ unless header["TokenData"].nil?
441
+ result.token_data = HpsTokenData.new()
442
+ result.token_data.response_code = header["TokenData"]["TokenRspCode"];
443
+ result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
444
+ result.token_data.token_value = header["TokenData"]["TokenValue"]
445
+ end
446
+
447
+ result
448
+ end
449
+
450
+ def submit_authorize(transaction, amount, currency)
451
+
452
+ response = doTransaction(transaction)
453
+ header = response["Header"]
454
+ process_charge_gateway_response(header["GatewayRspCode"], header["GatewayRspMsg"], header["GatewayTxnId"], amount, currency)
455
+
456
+ auth_response = response["Transaction"]["CreditAuth"]
457
+ process_charge_issuer_response(auth_response["RspCode"], auth_response["RspText"], header["GatewayTxnId"], amount, currency)
458
+
459
+ result = HpsAuthorization.new(hydrate_transaction_header(header))
460
+ result.transaction_id = header["GatewayTxnId"]
461
+ result.authorized_amount = auth_response["AuthAmt"]
462
+ result.authorization_code = auth_response["AuthCode"]
463
+ result.avs_result_code = auth_response["AVSRsltCode"]
464
+ result.avs_result_text = auth_response["AVSRsltText"]
465
+ result.card_type = auth_response["CardType"]
466
+ result.cpc_indicator = auth_response["CPCInd"]
467
+ result.cvv_result_code = auth_response["CVVRsltCode"]
468
+ result.cvv_result_text = auth_response["CVVRsltText"]
469
+ result.reference_number = auth_response["RefNbr"]
470
+ result.response_code = auth_response["RspCode"]
471
+ result.response_text = auth_response["RspText"]
472
+
473
+ unless header["TokenData"].nil?
474
+ result.token_data = HpsTokenData.new()
475
+ result.token_data.response_code = header["TokenData"]["TokenRspCode"];
476
+ result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
477
+ result.token_data.token_value = header["TokenData"]["TokenValue"]
478
+ end
479
+
480
+ result
481
+ end
482
+
483
+ def submit_refund(transaction)
484
+
485
+ response = doTransaction(transaction)
486
+ header = response["Header"]
487
+
488
+ unless header["GatewayRspCode"].eql? "0"
489
+ raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
490
+ end
491
+
492
+ result = HpsRefund.new(hydrate_transaction_header(header))
493
+ result.transaction_id = header["GatewayTxnId"]
494
+ result.response_code = "00"
495
+ result.response_text = ""
496
+
497
+ result
498
+ end
499
+
500
+ def submit_reverse(transaction)
501
+
502
+ response = doTransaction(transaction)
503
+ header = response["Header"]
504
+
505
+ if !header["GatewayRspCode"].eql? "0"
506
+ raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
507
+ end
508
+
509
+ reversal = response["Transaction"]["CreditReversal"]
510
+ result = HpsReversal.new(hydrate_transaction_header(header))
511
+ result.transaction_id = header["GatewayTxnId"]
512
+ result.avs_result_code = reversal["AVSRsltCode"]
513
+ result.avs_result_text = reversal["AVSRsltText"]
514
+ result.cpc_indicator = reversal["CPCInd"]
515
+ result.cvv_result_code = reversal["CVVRsltCode"]
516
+ result.cvv_result_text = reversal["CVVRsltText"]
517
+ result.reference_number = reversal["RefNbr"]
518
+ result.response_code = reversal["RspCode"]
519
+ result.response_text = reversal["RspText"]
520
+ result
521
+ end
522
+
523
+ def submit_verify(transaction)
524
+ response = doTransaction(transaction)
525
+ header = response["Header"]
526
+
527
+ if !header["GatewayRspCode"].eql? "0"
528
+ raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
529
+ end
530
+
531
+ account_verify = response["Transaction"]["CreditAccountVerify"]
532
+ result = HpsAccountVerify.new(hydrate_transaction_header(header))
533
+ result.transaction_id = header["GatewayTxnId"]
534
+ result.avs_result_code = account_verify["AVSRsltCode"]
535
+ result.avs_result_text = account_verify["AVSRsltText"]
536
+ result.reference_number = account_verify["RefNbr"]
537
+ result.response_code = account_verify["RspCode"]
538
+ result.response_text = account_verify["RspText"]
539
+ result.card_type = account_verify["CardType"]
540
+ result.cpc_indicator = account_verify["CPCInd"]
541
+ result.cvv_result_code = account_verify["CVVRsltCode"]
542
+ result.cvv_result_text = account_verify["CVVRsltText"]
543
+ result.authorization_code = account_verify["AuthCode"]
544
+ result.authorized_amount = account_verify["AuthAmt"]
545
+
546
+ if [ "85", "00" ].include? result.response_code == false
547
+ raise @exception_mapper.map_issuer_exception(result.transaction_id, result.response_code, result.response_text)
548
+ end
549
+
550
+ unless header["TokenData"].nil?
551
+ result.token_data = HpsTokenData.new()
552
+ result.token_data.response_code = header["TokenData"]["TokenRspCode"];
553
+ result.token_data.response_message = header["TokenData"]["TokenRspMsg"]
554
+ result.token_data.token_value = header["TokenData"]["TokenValue"]
555
+ end
556
+
557
+ result
558
+ end
559
+
560
+ def submit_void(transaction)
561
+ response = doTransaction(transaction)
562
+ header = response["Header"]
563
+ unless header["GatewayRspCode"].eql? "0"
564
+ raise @exception_mapper.map_gateway_exception(header["GatewayTxnId"], header["GatewayRspCode"], header["GatewayRspMsg"])
565
+ end
566
+
567
+ result = HpsVoid.new(hydrate_transaction_header(header))
568
+ result.transaction_id = header["GatewayTxnId"]
569
+ result.response_code = "00"
570
+ result.response_text = ""
571
+ result
572
+ end
573
+
574
+ def process_charge_gateway_response(response_code, response_text, transaction_id, amount, currency)
575
+
576
+ if !response_code.eql? "0"
577
+
578
+ if response_code.eql? "30"
579
+
580
+ begin
581
+
582
+ reverse_transaction(transaction_id, amount, currency)
583
+
584
+ rescue => e
585
+ exception = @exception_mapper.map_sdk_exception(SdkCodes.reversal_error_after_gateway_timeout, e)
586
+ exception.response_code = response_code
587
+ exception.response_text = response_text
588
+ raise exception
589
+ end
590
+
591
+ end
592
+
593
+ exception = @exception_mapper.map_gateway_exception(transaction_id, response_code, response_text)
594
+ exception.response_code = response_code
595
+ exception.response_text = response_text
596
+ raise exception
597
+
598
+ end
599
+
600
+ end
601
+
602
+ def process_charge_issuer_response(response_code, response_text, transaction_id, amount, currency)
603
+
604
+ if response_code.eql? "91"
605
+
606
+ begin
607
+
608
+ reverse_transaction(transaction_id, amount, currency)
609
+
610
+ rescue => e
611
+ exception = @exception_mapper.map_sdk_exception(SdkCodes.reversal_error_after_issuer_timeout, e)
612
+ exception.response_code = response_code
613
+ exception.response_text = response_text
614
+ raise exception
615
+ end
616
+
617
+ exception = @exception_mapper.map_sdk_exception(SdkCodes.processing_error)
618
+ exception.response_code = response_code
619
+ exception.response_text = response_text
620
+ raise exception
621
+
622
+ elsif !response_code.eql? "00"
623
+
624
+ exception = @exception_mapper.map_issuer_exception(transaction_id, response_code, response_text)
625
+ exception.response_code = response_code
626
+ exception.response_text = response_text
627
+ raise exception
628
+
629
+ end
630
+
631
+ end
632
+
633
+ end
634
+
635
635
  end