tbk-sdk 1.5.0.pre.ruby2.3

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 (158) hide show
  1. checksums.yaml +7 -0
  2. data/.built +0 -0
  3. data/.bundled +0 -0
  4. data/.github/ISSUE_TEMPLATE/reporte-de-error.md +40 -0
  5. data/.gitignore +16 -0
  6. data/.rakeTasks +7 -0
  7. data/.travis.yml +10 -0
  8. data/CHANGELOG.md +63 -0
  9. data/Dockerfile +5 -0
  10. data/Gemfile +6 -0
  11. data/LICENSE.md +11 -0
  12. data/Makefile +24 -0
  13. data/README.md +87 -0
  14. data/Rakefile +10 -0
  15. data/bin/console +14 -0
  16. data/bin/setup +8 -0
  17. data/docker-compose.yml +20 -0
  18. data/lib/transbank/sdk/oneclick/base.rb +64 -0
  19. data/lib/transbank/sdk/oneclick/errors/oneclick_error.rb +16 -0
  20. data/lib/transbank/sdk/oneclick/inscription/errors/mall_inscription_delete_error.rb +16 -0
  21. data/lib/transbank/sdk/oneclick/inscription/errors/mall_inscription_finish_error.rb +16 -0
  22. data/lib/transbank/sdk/oneclick/inscription/errors/mall_inscription_start_error.rb +16 -0
  23. data/lib/transbank/sdk/oneclick/inscription/errors/oneclick_mall_inscription_errors.rb +3 -0
  24. data/lib/transbank/sdk/oneclick/inscription/inscription.rb +3 -0
  25. data/lib/transbank/sdk/oneclick/inscription/responses/mall_inscription_delete_response.rb +18 -0
  26. data/lib/transbank/sdk/oneclick/inscription/responses/mall_inscription_finish_response.rb +15 -0
  27. data/lib/transbank/sdk/oneclick/inscription/responses/mall_inscription_start_response.rb +14 -0
  28. data/lib/transbank/sdk/oneclick/inscription/responses/oneclick_mall_inscription_responses.rb +3 -0
  29. data/lib/transbank/sdk/oneclick/mall/errors/mall_transaction_authorize_error.rb +16 -0
  30. data/lib/transbank/sdk/oneclick/mall/errors/mall_transaction_refund_error.rb +16 -0
  31. data/lib/transbank/sdk/oneclick/mall/errors/mall_transaction_status_error.rb +16 -0
  32. data/lib/transbank/sdk/oneclick/mall/errors/oneclick_mall_errors.rb +4 -0
  33. data/lib/transbank/sdk/oneclick/mall/mall_inscription.rb +73 -0
  34. data/lib/transbank/sdk/oneclick/mall/mall_transaction.rb +97 -0
  35. data/lib/transbank/sdk/oneclick/mall/oneclick_mall.rb +4 -0
  36. data/lib/transbank/sdk/oneclick/mall/responses/mall_transaction_authorize_response.rb +16 -0
  37. data/lib/transbank/sdk/oneclick/mall/responses/mall_transaction_refund_response.rb +16 -0
  38. data/lib/transbank/sdk/oneclick/mall/responses/mall_transaction_status_response.rb +15 -0
  39. data/lib/transbank/sdk/oneclick/mall/responses/oneclick_mall_responses.rb +4 -0
  40. data/lib/transbank/sdk/oneclick/mall_deferred/errors/mall_deferred_transaction_capture_error.rb +16 -0
  41. data/lib/transbank/sdk/oneclick/mall_deferred/mall_deferred_inscription.rb +20 -0
  42. data/lib/transbank/sdk/oneclick/mall_deferred/mall_deferred_transaction.rb +42 -0
  43. data/lib/transbank/sdk/oneclick/mall_deferred/responses/mall_deferred_transaction_capture_response.rb +16 -0
  44. data/lib/transbank/sdk/oneclick/oneclick.rb +12 -0
  45. data/lib/transbank/sdk/onepay/base.rb +125 -0
  46. data/lib/transbank/sdk/onepay/errors/errors.rb +17 -0
  47. data/lib/transbank/sdk/onepay/errors/integration_type_error.rb +8 -0
  48. data/lib/transbank/sdk/onepay/errors/invalid_options_error.rb +8 -0
  49. data/lib/transbank/sdk/onepay/errors/item_error.rb +8 -0
  50. data/lib/transbank/sdk/onepay/errors/refund_create_error.rb +8 -0
  51. data/lib/transbank/sdk/onepay/errors/response_error.rb +8 -0
  52. data/lib/transbank/sdk/onepay/errors/shopping_cart_error.rb +8 -0
  53. data/lib/transbank/sdk/onepay/errors/signature_error.rb +8 -0
  54. data/lib/transbank/sdk/onepay/errors/transaction_commit_error.rb +8 -0
  55. data/lib/transbank/sdk/onepay/errors/transaction_create_error.rb +8 -0
  56. data/lib/transbank/sdk/onepay/errors/transbank_error.rb +9 -0
  57. data/lib/transbank/sdk/onepay/models/channels.rb +15 -0
  58. data/lib/transbank/sdk/onepay/models/item.rb +103 -0
  59. data/lib/transbank/sdk/onepay/models/models.rb +10 -0
  60. data/lib/transbank/sdk/onepay/models/refund.rb +50 -0
  61. data/lib/transbank/sdk/onepay/models/shopping_cart.rb +65 -0
  62. data/lib/transbank/sdk/onepay/models/transaction.rb +143 -0
  63. data/lib/transbank/sdk/onepay/requests/refund_create_request.rb +45 -0
  64. data/lib/transbank/sdk/onepay/requests/request.rb +18 -0
  65. data/lib/transbank/sdk/onepay/requests/requests.rb +9 -0
  66. data/lib/transbank/sdk/onepay/requests/transaction_commit_request.rb +48 -0
  67. data/lib/transbank/sdk/onepay/requests/transaction_create_request.rb +85 -0
  68. data/lib/transbank/sdk/onepay/responses/refund_create_response.rb +24 -0
  69. data/lib/transbank/sdk/onepay/responses/response.rb +18 -0
  70. data/lib/transbank/sdk/onepay/responses/responses.rb +9 -0
  71. data/lib/transbank/sdk/onepay/responses/transaction_commit_response.rb +39 -0
  72. data/lib/transbank/sdk/onepay/responses/transaction_create_response.rb +32 -0
  73. data/lib/transbank/sdk/patpass/errors/integration_type_error.rb +8 -0
  74. data/lib/transbank/sdk/patpass/errors/patpass_error.rb +15 -0
  75. data/lib/transbank/sdk/patpass/patpass_by_webpay/base.rb +47 -0
  76. data/lib/transbank/sdk/patpass/patpass_by_webpay/errors/patpass_by_webpay_errors.rb +12 -0
  77. data/lib/transbank/sdk/patpass/patpass_by_webpay/errors/transaction_commit_error.rb +15 -0
  78. data/lib/transbank/sdk/patpass/patpass_by_webpay/errors/transaction_create_error.rb +15 -0
  79. data/lib/transbank/sdk/patpass/patpass_by_webpay/errors/transaction_status_error.rb +15 -0
  80. data/lib/transbank/sdk/patpass/patpass_by_webpay/options.rb +9 -0
  81. data/lib/transbank/sdk/patpass/patpass_by_webpay/patpass_by_webpay.rb +16 -0
  82. data/lib/transbank/sdk/patpass/patpass_by_webpay/responses/patpass_by_webpay_responses.rb +3 -0
  83. data/lib/transbank/sdk/patpass/patpass_by_webpay/responses/transaction_commit_response.rb +20 -0
  84. data/lib/transbank/sdk/patpass/patpass_by_webpay/responses/transaction_create_response.rb +15 -0
  85. data/lib/transbank/sdk/patpass/patpass_by_webpay/responses/transaction_status_response.rb +21 -0
  86. data/lib/transbank/sdk/patpass/patpass_by_webpay/transaction.rb +93 -0
  87. data/lib/transbank/sdk/patpass/patpass_comercio/base.rb +47 -0
  88. data/lib/transbank/sdk/patpass/patpass_comercio/errors/inscription_start_error.rb +15 -0
  89. data/lib/transbank/sdk/patpass/patpass_comercio/errors/inscription_status_error.rb +15 -0
  90. data/lib/transbank/sdk/patpass/patpass_comercio/errors/patpass_comercio_errors.rb +2 -0
  91. data/lib/transbank/sdk/patpass/patpass_comercio/inscription.rb +79 -0
  92. data/lib/transbank/sdk/patpass/patpass_comercio/options.rb +9 -0
  93. data/lib/transbank/sdk/patpass/patpass_comercio/patpass_comercio.rb +5 -0
  94. data/lib/transbank/sdk/patpass/patpass_comercio/responses/inscription_start_response.rb +13 -0
  95. data/lib/transbank/sdk/patpass/patpass_comercio/responses/inscription_status_response.rb +13 -0
  96. data/lib/transbank/sdk/patpass/patpass_comercio/responses/patpass_comercio_responses.rb +2 -0
  97. data/lib/transbank/sdk/transaccion_completa/base.rb +51 -0
  98. data/lib/transbank/sdk/transaccion_completa/errors/transaccion_completa_error.rb +16 -0
  99. data/lib/transbank/sdk/transaccion_completa/errors/transaccion_completa_errors.rb +7 -0
  100. data/lib/transbank/sdk/transaccion_completa/errors/transaction_capture_error.rb +14 -0
  101. data/lib/transbank/sdk/transaccion_completa/errors/transaction_commit_error.rb +14 -0
  102. data/lib/transbank/sdk/transaccion_completa/errors/transaction_create_error.rb +14 -0
  103. data/lib/transbank/sdk/transaccion_completa/errors/transaction_installments_error.rb +14 -0
  104. data/lib/transbank/sdk/transaccion_completa/errors/transaction_refund_error.rb +14 -0
  105. data/lib/transbank/sdk/transaccion_completa/errors/transaction_status_error.rb +14 -0
  106. data/lib/transbank/sdk/transaccion_completa/mall/mall_transaction.rb +197 -0
  107. data/lib/transbank/sdk/transaccion_completa/mall/responses/mall_transaction_capture_response.rb +12 -0
  108. data/lib/transbank/sdk/transaccion_completa/mall/responses/mall_transaction_commit_response.rb +15 -0
  109. data/lib/transbank/sdk/transaccion_completa/mall/responses/mall_transaction_installments_response.rb +11 -0
  110. data/lib/transbank/sdk/transaccion_completa/mall/responses/mall_transaction_responses.rb +4 -0
  111. data/lib/transbank/sdk/transaccion_completa/mall/responses/mall_transaction_status_response.rb +14 -0
  112. data/lib/transbank/sdk/transaccion_completa/options.rb +7 -0
  113. data/lib/transbank/sdk/transaccion_completa/responses/transaccion_completa_responses.rb +6 -0
  114. data/lib/transbank/sdk/transaccion_completa/responses/transaction_capture_response.rb +12 -0
  115. data/lib/transbank/sdk/transaccion_completa/responses/transaction_commit_response.rb +16 -0
  116. data/lib/transbank/sdk/transaccion_completa/responses/transaction_create_response.rb +10 -0
  117. data/lib/transbank/sdk/transaccion_completa/responses/transaction_installments_response.rb +13 -0
  118. data/lib/transbank/sdk/transaccion_completa/responses/transaction_refund_response.rb +14 -0
  119. data/lib/transbank/sdk/transaccion_completa/responses/transaction_status_response.rb +16 -0
  120. data/lib/transbank/sdk/transaccion_completa/transaccion_completa.rb +7 -0
  121. data/lib/transbank/sdk/transaccion_completa/transaction.rb +144 -0
  122. data/lib/transbank/sdk/transbank_error.rb +6 -0
  123. data/lib/transbank/sdk/utils/json_utils.rb +75 -0
  124. data/lib/transbank/sdk/utils/net_helper.rb +82 -0
  125. data/lib/transbank/sdk/utils/request_builder.rb +96 -0
  126. data/lib/transbank/sdk/utils/signature_utils.rb +49 -0
  127. data/lib/transbank/sdk/utils/utils.rb +9 -0
  128. data/lib/transbank/sdk/version.rb +5 -0
  129. data/lib/transbank/sdk/webpay/errors/integration_type_error.rb +8 -0
  130. data/lib/transbank/sdk/webpay/errors/webpay_error.rb +14 -0
  131. data/lib/transbank/sdk/webpay/webpay_plus/base.rb +74 -0
  132. data/lib/transbank/sdk/webpay/webpay_plus/deferred/deferred_transaction.rb +108 -0
  133. data/lib/transbank/sdk/webpay/webpay_plus/deferred/errors/transaction_capture_error.rb +16 -0
  134. data/lib/transbank/sdk/webpay/webpay_plus/deferred/errors/webpay_plus_deferred_errors.rb +1 -0
  135. data/lib/transbank/sdk/webpay/webpay_plus/deferred/responses/transaction_capture_response.rb +22 -0
  136. data/lib/transbank/sdk/webpay/webpay_plus/deferred/responses/webpay_plus_deferred_responses.rb +1 -0
  137. data/lib/transbank/sdk/webpay/webpay_plus/errors/transaction_commit_error.rb +17 -0
  138. data/lib/transbank/sdk/webpay/webpay_plus/errors/transaction_create_error.rb +16 -0
  139. data/lib/transbank/sdk/webpay/webpay_plus/errors/transaction_refund_error.rb +16 -0
  140. data/lib/transbank/sdk/webpay/webpay_plus/errors/transaction_status_error.rb +16 -0
  141. data/lib/transbank/sdk/webpay/webpay_plus/errors/webpay_plus_errors.rb +13 -0
  142. data/lib/transbank/sdk/webpay/webpay_plus/mall/mall_transaction.rb +88 -0
  143. data/lib/transbank/sdk/webpay/webpay_plus/mall/responses/mall_transaction_commit_response.rb +23 -0
  144. data/lib/transbank/sdk/webpay/webpay_plus/mall/responses/mall_transaction_status_response.rb +21 -0
  145. data/lib/transbank/sdk/webpay/webpay_plus/mall/responses/webpay_plus_mall_responses.rb +2 -0
  146. data/lib/transbank/sdk/webpay/webpay_plus/mall_deferred/mall_deferred_transaction.rb +109 -0
  147. data/lib/transbank/sdk/webpay/webpay_plus/options.rb +9 -0
  148. data/lib/transbank/sdk/webpay/webpay_plus/responses/transaction_commit_response.rb +20 -0
  149. data/lib/transbank/sdk/webpay/webpay_plus/responses/transaction_create_response.rb +15 -0
  150. data/lib/transbank/sdk/webpay/webpay_plus/responses/transaction_refund_response.rb +19 -0
  151. data/lib/transbank/sdk/webpay/webpay_plus/responses/transaction_status_response.rb +21 -0
  152. data/lib/transbank/sdk/webpay/webpay_plus/responses/webpay_plus_responses.rb +4 -0
  153. data/lib/transbank/sdk/webpay/webpay_plus/transaction.rb +89 -0
  154. data/lib/transbank/sdk/webpay/webpay_plus/webpay_plus.rb +24 -0
  155. data/lib/transbank/sdk.rb +27 -0
  156. data/sdk_test.sh +2 -0
  157. data/transbank-sdk.gemspec +35 -0
  158. metadata +340 -0
@@ -0,0 +1,103 @@
1
+ module Transbank
2
+ module Onepay
3
+ class Item
4
+ include Transbank::Utils::JSONUtils
5
+ # An Item to be purchased by the user, and to be added to a [ShoppingCart]
6
+
7
+ # @return [String] An item's description
8
+ attr_reader :description
9
+
10
+ # @return quantity [Integer] How many of units of [Item]
11
+ attr_reader :quantity
12
+
13
+ # @return amount [Integer] The value of each unit of [Item]
14
+ attr_reader :amount
15
+
16
+ # @return additional_data [String] A string with whatever additional data the
17
+ # Merchant might want to add
18
+ attr_reader :additional_data
19
+
20
+ # @return expire [Integer] Expiry for the Item
21
+ attr_reader :expire
22
+ # @param [Hash] opts options Hash
23
+ # @param description [String] The item's description
24
+ # @param quantity [Integer] How many of units of [Item]
25
+ # @param amount [Integer] The value of each unit of [Item]
26
+ # @param additional_data [String] A string with whatever additional data the
27
+ # Merchant might want to add
28
+ # @param expire [Integer] Expiry for the Item
29
+ # @raise [ItemError] when opts is not a [Hash]
30
+ def initialize(opts = {})
31
+ raise Errors::ItemError, 'Item must be a Hash' unless opts.is_a? Hash
32
+ opts = transform_hash_keys opts
33
+ self.description = opts.fetch(:description)
34
+ self.quantity = opts.fetch(:quantity)
35
+ self.amount = opts.fetch(:amount)
36
+ self.additional_data = opts.fetch(:additional_data, nil)
37
+ self.expire = opts.fetch(:expire, nil)
38
+ end
39
+
40
+ # @param description [String] An item's description
41
+ # @raise [ItemError] when description is null
42
+ def description=(description)
43
+ raise Errors::ItemError, "Description cannot be null" if description.nil?
44
+ @description = description
45
+ end
46
+
47
+ # @param quantity [Integer] How many of units of [Item]
48
+ # @raise [ItemError] when given quantity is nil or less than zero.
49
+ def quantity=(quantity)
50
+ raise Errors::ItemError, "Quantity cannot be null" if quantity.nil?
51
+ if quantity < 0
52
+ raise Errors::ItemError, "Quantity cannot be less than zero"
53
+ end
54
+ @quantity = quantity
55
+ end
56
+
57
+ # @param amount [Integer] The value of each unit of [Item]
58
+ # @raise [ItemError] when amount cannot be null.
59
+ # @raise [ArgumentError] when amount is not an Integer.
60
+ def amount=(amount)
61
+ raise Errors::ItemError, "Amount cannot be null" if amount.nil?
62
+ if amount != Integer(amount)
63
+ raise ArgumentError, "Amount is not an Integer"
64
+ end
65
+ @amount = amount
66
+ end
67
+
68
+ # @param additional_data [String] A string with whatever additional data the
69
+ # Merchant might want to add
70
+ def additional_data=(additional_data)
71
+ additional_data = '' if additional_data.nil?
72
+ @additional_data = additional_data
73
+ end
74
+
75
+ # @param expire [Integer] Expiry for the Item
76
+ def expire=(expire)
77
+ expire = expire || 0
78
+ @expire = expire
79
+ end
80
+
81
+ # Return the total amount to pay for the Item, that is, amount * quantity
82
+ # @return [Numeric] the total amount to pay for the [Item]
83
+ def total
84
+ self.quantity * self.amount
85
+ end
86
+
87
+ # Override == to allow comparison between [Item]s
88
+ # @return [boolean] true if equal, false otherwise
89
+ def ==(another_item)
90
+ self.description == another_item.description &&
91
+ self.quantity == another_item.quantity &&
92
+ self.amount == another_item.amount &&
93
+ self.additional_data == another_item.additional_data &&
94
+ self.expire == another_item.expire
95
+ end
96
+
97
+ # Alias for #==
98
+ def eql?(another_item)
99
+ self.==(another_item)
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,10 @@
1
+ require 'transbank/sdk/onepay/models/item'
2
+ require 'transbank/sdk/onepay/models/channels'
3
+ require 'transbank/sdk/onepay/models/refund'
4
+ require 'transbank/sdk/onepay/models/shopping_cart'
5
+ require 'transbank/sdk/onepay/models/transaction'
6
+
7
+ module Transbank
8
+ module Onepay
9
+ end
10
+ end
@@ -0,0 +1,50 @@
1
+ module Transbank
2
+ module Onepay
3
+ class Refund
4
+ extend Transbank::Utils::NetHelper, Utils::RequestBuilder
5
+ # Manages Refunds
6
+ REFUND_TRANSACTION = 'nullifytransaction'.freeze
7
+ TRANSACTION_BASE_PATH = '/ewallet-plugin-api-services/services/transactionservice/'.freeze
8
+
9
+ class << self
10
+ # Create a request for a Refund
11
+ # @param amount [Integer] Amount to be refunded. Must be the full amount of the
12
+ # [Transaction] to be refunded
13
+ # @param occ [String] Merchant purchase order
14
+ # @param external_unique_number [String] Unique identifier (per Merchant) of the [Transaction] that
15
+ # will be refunded
16
+ # @param authorization_code [String] Authorization code. This is given when the [Transaction]
17
+ # is successfully committed (with the #commit method of [Transaction])
18
+ # @param options[Hash, nil] an optional Hash with configuration overrides
19
+ # @raise [RefundCreateError] if the response is nil or has no response code
20
+ # @raise [RefundCreateError] if response from the service is not equal to 'OK'
21
+ def create(amount:, occ:, external_unique_number:, authorization_code:, options: nil)
22
+ refund_request = refund_transaction(refund_amount: amount,
23
+ occ: occ,
24
+ external_unique_number: external_unique_number,
25
+ authorization_code: authorization_code,
26
+ options: options)
27
+ response = http_post(uri_string: refund_path, body: refund_request.to_h)
28
+ if response.nil? || !JSON.parse(response.body)['responseCode']
29
+ raise Errors::RefundCreateError, 'Could not obtain a response from the service.'
30
+ end
31
+
32
+ refund_create_response = RefundCreateResponse.new(JSON.parse(response.body))
33
+
34
+ unless refund_create_response.response_ok?
35
+ raise Errors::RefundCreateError, refund_create_response.full_description
36
+ end
37
+
38
+ refund_create_response
39
+ end
40
+
41
+ # Return the string url to POST to
42
+ # @return [String] the url to POST to
43
+ def refund_path
44
+ Base.current_integration_type_url + TRANSACTION_BASE_PATH + REFUND_TRANSACTION
45
+ end
46
+ end
47
+
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,65 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Represents a Shopping Cart, which contains [Item]s that the user wants to buy
4
+ class ShoppingCart
5
+ include Transbank::Utils::JSONUtils
6
+
7
+ # @return [Array<Item>] An [Array<Item>] with the [ShoppingCart] contents
8
+ attr_reader :items
9
+
10
+ # @param items [Array, nil] an array of Hashes that can be converted to [Item]
11
+ # if nil, an empty shopping cart is created
12
+ def initialize(items = [])
13
+ # An [Array<Item>] with the [ShoppingCart] contents
14
+ @items = []
15
+ return if items.nil? || items.empty?
16
+
17
+ items.each do |it|
18
+ it = transform_hash_keys it
19
+ item = Item.new it
20
+ self << item
21
+ end
22
+ end
23
+
24
+ # @param item [Item] an instance of [Item]
25
+ # @return [boolean] return true if item is successfully added
26
+ def add(item)
27
+ new_total = total + item.total
28
+ if new_total < 0
29
+ raise Errors::ShoppingCartError, "Total amount cannot be less than zero."
30
+ end
31
+ @items << item
32
+ end
33
+
34
+ # Alias for #add
35
+ def << item
36
+ add item
37
+ end
38
+
39
+ # Remove an [Item] from self
40
+ # @raise [ShoppingCartError] if item is not found
41
+ def remove(item)
42
+ if @items.delete(item).nil?
43
+ raise Errors::ShoppingCartError, "Item not found"
44
+ end
45
+ end
46
+
47
+ # Clear the cart, setting @items to []
48
+ def remove_all
49
+ @items = []
50
+ end
51
+
52
+ # @return [Integer] The amount in CLP of the [Item]s included in the [ShoppingCart]
53
+ def total
54
+ # Array#sum is Ruby 2.4+
55
+ @items.reduce(0) { |total, item| total + item.total }
56
+ end
57
+
58
+ # Sum the quantity of items in the cart
59
+ def items_quantity
60
+ # Array#sum is Ruby 2.4+
61
+ @items.reduce(0) { |total, item| total + item.quantity }
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,143 @@
1
+ module Transbank
2
+ module Onepay
3
+ ## Class Transaction
4
+ # This class creates or commits a Transaction (that is, a purchase)
5
+ class Transaction
6
+ extend Transbank::Utils::NetHelper, Utils::RequestBuilder
7
+
8
+ SEND_TRANSACTION = 'sendtransaction'.freeze
9
+ COMMIT_TRANSACTION = 'gettransactionnumber'.freeze
10
+ TRANSACTION_BASE_PATH = '/ewallet-plugin-api-services/services/transactionservice/'.freeze
11
+
12
+ class << self
13
+ # Create a [Transaction], initiating the purchase process.
14
+ # @param shopping_cart [ShoppingCart] contains the [Item]s to be purchased
15
+ # @param channel [String] The channel that the transaction is going to be done through. Valid values are contained on the [Transbank::Onepay::Channel] class
16
+ # @param external_unique_number [String] a unique value (per Merchant, not global) that is used to identify a Transaction
17
+ # @param options[Hash, nil] an optional Hash with configuration overrides
18
+ # @return [TransactionCreateResponse] the response to your request.
19
+ # Includes data that you will need to #commit your [Transaction]
20
+ # @raise [ShoppingCartError] if shopping cart is nil or empty
21
+ # @raise [TransactionCreateError] if channel is not valid
22
+ # @raise [TransactionCreateError] if no response is gotten, or responseCode of the response is not 'OK'
23
+ def create(shopping_cart:, channel: nil, external_unique_number: nil,
24
+ options: nil)
25
+ if is_options_hash?(channel)
26
+ options = channel
27
+ channel = nil
28
+ end
29
+
30
+ if is_options_hash?(external_unique_number)
31
+ options = external_unique_number
32
+ external_unique_number = nil
33
+ end
34
+
35
+ validate_channel!(channel)
36
+ validate_shopping_cart!(shopping_cart)
37
+
38
+ options = complete_options(options)
39
+ create_request = create_transaction(shopping_cart: shopping_cart,
40
+ channel: channel,
41
+ external_unique_number: external_unique_number,
42
+ options: options)
43
+ response = http_post(uri_string: transaction_create_path, body: create_request.to_h)
44
+ validate_create_response!(response)
45
+ transaction_create_response = TransactionCreateResponse.new JSON.parse(response.body)
46
+ signature_is_valid = transaction_create_response.valid_signature?(options.fetch(:shared_secret))
47
+ unless signature_is_valid
48
+ raise Errors::SignatureError, "The response's signature is not valid."
49
+ end
50
+ transaction_create_response
51
+ end
52
+
53
+ # Commit a [Transaction]. It is MANDATORY for this to be done, and you have
54
+ # 30 seconds to do so, otherwise the [Transaction] is automatically REVERSED
55
+ # @param occ [String] Merchant purchase order
56
+ # @param external_unique_number [String] a unique value (per Merchant, not global) that is used to identify a Transaction
57
+ # @param options[Hash, nil] an optional Hash with configuration overrides
58
+ # @return [TransactionCommitResponse] The response to your commit request.
59
+ # @raise [TransactionCommitError] if response is nil or responseCode of the response is not 'OK'
60
+ def commit(occ:, external_unique_number:, options: nil)
61
+ options = complete_options(options)
62
+ commit_request = commit_transaction(occ: occ,
63
+ external_unique_number: external_unique_number,
64
+ options: options)
65
+ response = http_post(uri_string: transaction_commit_path, body: commit_request.to_h)
66
+ validate_commit_response!(response)
67
+ transaction_commit_response = TransactionCommitResponse.new(JSON.parse(response.body))
68
+ signature_is_valid = transaction_commit_response.valid_signature?(options.fetch(:shared_secret))
69
+ unless signature_is_valid
70
+ raise Errors::SignatureError, "The response's signature is not valid."
71
+ end
72
+ transaction_commit_response
73
+ end
74
+
75
+ private
76
+
77
+ def is_options_hash?(hash)
78
+ return false unless hash.respond_to? :keys
79
+ # Intersection of the two arrays
80
+ ([:api_key, :shared_secret] & hash.keys).any?
81
+ end
82
+
83
+ def validate_channel!(channel)
84
+ if channel_is_app?(channel) && Base::app_scheme.nil?
85
+ raise Errors::TransactionCreateError, 'You need to set an app_scheme if you want to use the APP channel'
86
+ end
87
+
88
+ if channel_is_mobile?(channel) && Base::callback_url.nil?
89
+ raise Errors::TransactionCreateError, 'You need to set a valid callback if you want to use the MOBILE channel'
90
+ end
91
+ end
92
+
93
+ def validate_shopping_cart!(shopping_cart)
94
+ if shopping_cart.items.nil? || shopping_cart.items.empty?
95
+ raise Errors::ShoppingCartError, 'Shopping cart is null or empty.'
96
+ end
97
+ end
98
+
99
+ def validate_commit_response!(response)
100
+ unless response
101
+ raise Errors::TransactionCommitError, 'Could not obtain a response from the service.'
102
+ end
103
+
104
+ unless JSON.parse(response.body).fetch('responseCode') == 'OK'
105
+ body = JSON.parse(response.body)
106
+ msg = "#{body.fetch('responseCode')} : #{body.fetch('description')}"
107
+ raise Errors::TransactionCommitError, msg
108
+ end
109
+ response
110
+ end
111
+
112
+ def validate_create_response!(response)
113
+ unless response
114
+ raise Errors::TransactionCreateError, 'Could not obtain a response from the service.'
115
+ end
116
+
117
+ unless JSON.parse(response.body).fetch('responseCode') == 'OK'
118
+ body = JSON.parse(response.body)
119
+ msg = "#{body.fetch('responseCode')} : #{body['description']}"
120
+ raise Errors::TransactionCreateError, msg
121
+ end
122
+ response
123
+ end
124
+
125
+ def channel_is_app?(channel)
126
+ channel && channel == Transbank::Onepay::Channel::APP
127
+ end
128
+
129
+ def channel_is_mobile?(channel)
130
+ channel && channel == Transbank::Onepay::Channel::MOBILE
131
+ end
132
+
133
+ def transaction_create_path
134
+ Base.current_integration_type_url + TRANSACTION_BASE_PATH + SEND_TRANSACTION
135
+ end
136
+
137
+ def transaction_commit_path
138
+ Base.current_integration_type_url + TRANSACTION_BASE_PATH + COMMIT_TRANSACTION
139
+ end
140
+ end
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,45 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Creates a Refund request
4
+ class RefundCreateRequest
5
+ include Request
6
+ attr_accessor :nullify_amount, :occ, :external_unique_number,
7
+ :authorization_code, :issued_at, :signature
8
+
9
+ # These are the params used to build this class's @signature
10
+ SIGNATURE_PARAMS = [:occ,
11
+ :external_unique_number,
12
+ :authorization_code,
13
+ :issued_at,
14
+ :nullify_amount].freeze
15
+
16
+ # @param nullify_amount [Integer, nil] The total amount of the [Transaction] to Refund.
17
+ # No partial refunds are possible
18
+ # @param external_unique_number [String] a unique value (per Merchant, not global) that is used to identify a Transaction
19
+ # @param occ [String] Merchant purchase order
20
+ # @param authorization_code [String] a string returned when [Transaction]#commit completes correctly
21
+ # @param issued_at [Integer, nil] a timestamp
22
+ # @param signature [String, nil] a hashed string to verify the data
23
+ def initialize(nullify_amount: nil,
24
+ occ: nil,
25
+ external_unique_number: nil,
26
+ authorization_code: nil,
27
+ issued_at: nil,
28
+ signature: nil)
29
+ @nullify_amount = nullify_amount
30
+ @occ = occ
31
+ @external_unique_number = external_unique_number
32
+ @authorization_code = authorization_code
33
+ @issued_at = issued_at
34
+ @signature = signature
35
+ end
36
+
37
+ # Create and set the signature for this instance of RefundCreateRequest
38
+ # @return [RefundCreateRequest] returns self
39
+ def sign(secret)
40
+ @signature = signature_for(to_data, secret)
41
+ self
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,18 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Base module with methods & attributes common to Requests
4
+ module Request
5
+ include Transbank::Utils::JSONUtils, Utils::SignatureUtils
6
+ attr_accessor :api_key
7
+ attr_accessor :app_key
8
+
9
+ # Set the request's @api_key overriding the one in
10
+ # the [Base] class
11
+ def set_keys_from_options(options)
12
+ transform_hash_keys(options)
13
+ new_api_key = options.fetch(:api_key, nil)
14
+ self.api_key = new_api_key unless new_api_key.nil?
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require 'transbank/sdk/onepay/requests/request'
2
+ require 'transbank/sdk/onepay/requests/transaction_create_request'
3
+ require 'transbank/sdk/onepay/requests/transaction_commit_request'
4
+ require 'transbank/sdk/onepay/requests/refund_create_request'
5
+
6
+ module Transbank
7
+ module Onepay
8
+ end
9
+ end
@@ -0,0 +1,48 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Creates a request to Transbank attempting to commit a [Transaction]
4
+ class TransactionCommitRequest
5
+ include Request
6
+ attr_reader :occ, :external_unique_number, :issued_at, :signature
7
+
8
+ SIGNATURE_PARAMS = [:occ,
9
+ :external_unique_number,
10
+ :issued_at].freeze
11
+ # @param occ [String] Merchant purchase order
12
+ # @param external_unique_number [String] a unique value (per Merchant, not global) that is used to identify a Transaction
13
+ # @param issued_at [Integer] timestamp for when the transaction commit request was created
14
+ def initialize(occ, external_unique_number, issued_at)
15
+ self.occ = occ
16
+ self.external_unique_number = external_unique_number
17
+ self.issued_at = issued_at
18
+ @signature = nil
19
+ end
20
+
21
+ # @param occ [String] Merchant purchase order
22
+ def occ=(occ)
23
+ raise Errors::TransactionCommitError, 'occ cannot be null.' if occ.nil?
24
+ @occ = occ
25
+ end
26
+
27
+ # @param external_unique_number [String] a unique value (per Merchant, not global) that is used to identify a Transaction
28
+ def external_unique_number=(external_unique_number)
29
+ raise Errors::TransactionCommitError, 'external_unique_number cannot be null.' if external_unique_number.nil?
30
+ @external_unique_number = external_unique_number
31
+ end
32
+
33
+ # @param issued_at [Integer] timestamp for when the transaction commit request was created
34
+ def issued_at=(issued_at)
35
+ raise Errors::TransactionCommitError, 'issued_at cannot be null.' if issued_at.nil?
36
+ @issued_at = issued_at
37
+ end
38
+
39
+ # Create a signature string and assign it to @signature
40
+ # @return [TransactionCommitRequest] self
41
+ def sign(secret)
42
+ @signature = signature_for(to_data, secret)
43
+ self
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,85 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Create a payload to create [Transaction] on Transbank
4
+ class TransactionCreateRequest
5
+ include Request
6
+
7
+ attr_accessor :external_unique_number, :total, :items_quantity, :issued_at,
8
+ :items, :callback_url, :channel, :app_scheme, :signature,
9
+ :commerce_logo_url, :width_height
10
+ attr_reader :generate_ott_qr_code
11
+
12
+ SIGNATURE_PARAMS = [:external_unique_number,
13
+ :total,
14
+ :items_quantity,
15
+ :issued_at,
16
+ :callback_url].freeze
17
+ # @param opts [Hash] options hash with params needed to initialize this
18
+ # @param external_unique_number [String] Unique identifier (per Merchant) of the [Transaction] that
19
+ # @param total [Numeric] the total amount to pay for the items
20
+ # @param items_quantity [Numeric] the quantity of items on the shopping cart
21
+ # @param items [Array<Item] the items on the shopping cart
22
+ # @param issued_at [Numeric] timestamp at the moment the transaction is created
23
+ # @param callback_url [String] used when the channel is mobile, to be able to finish the [Transaction]
24
+ # @param channel [String] The channel the operation is made on. Valid values
25
+ # are on the [Channel] class
26
+ # @param app_scheme [String] identificator for the Merchant's app
27
+ # @param signature [String, nil] a hashstring created for verification purposes
28
+ # @param commerce_logo_url [String] The URL pointing to the Merchant's logo
29
+ # @param width_height [Numeric] qr width and height used by the frontend JS SDK.
30
+ def initialize(opts = {})
31
+ self.external_unique_number = opts.fetch(:external_unique_number)
32
+ self.total = opts.fetch(:total)
33
+ self.items_quantity = opts.fetch(:items_quantity)
34
+ self.items = opts.fetch(:items)
35
+ self.issued_at = opts.fetch(:issued_at)
36
+ self.callback_url = opts.fetch(:callback_url)
37
+ channel = opts.fetch(:channel, Channel::WEB)
38
+ self.channel = channel
39
+ self.app_scheme = opts.fetch(:app_scheme, '')
40
+ self.signature = nil
41
+ self.commerce_logo_url = opts.fetch(:commerce_logo_url)
42
+ self.width_height = opts.fetch(:width_height)
43
+ # This is never anything but true, but it is required by the server
44
+ @generate_ott_qr_code = true
45
+ end
46
+
47
+ def external_unique_number=(external_unique_number)
48
+ raise Errors::TransactionCreateError, 'External Unique Number cannot be null.' if external_unique_number.nil?
49
+ @external_unique_number = external_unique_number
50
+ end
51
+
52
+ def total=(total)
53
+ raise Errors::TransactionCreateError, 'Total cannot be null.' if total.nil?
54
+ raise Errors::TransactionCreateError, 'Total cannot be less than zero.' if total < 0
55
+ @total = total
56
+ end
57
+
58
+ def items_quantity=(items_quantity)
59
+ raise Errors::TransactionCreateError, 'Items quantity cannot be null.' if items_quantity.nil?
60
+ raise Errors::TransactionCreateError, 'Items quantity cannot be less than zero.' if items_quantity < 0
61
+ @items_quantity = items_quantity
62
+ end
63
+
64
+ def items=(items)
65
+ raise Errors::TransactionCreateError, 'Items must not be empty.' if items.empty?
66
+ @items = items
67
+ end
68
+
69
+ def callback_url=(callback_url)
70
+ raise Errors::TransactionCreateError, 'Callback url cannot be null.' if callback_url.nil?
71
+ @callback_url = callback_url
72
+ end
73
+
74
+ def channel=(channel)
75
+ raise Errors::TransactionCreateError, 'Channel cannot be null.' if channel.nil?
76
+ @channel = channel
77
+ end
78
+
79
+ def sign(secret)
80
+ @signature = signature_for(to_data, secret)
81
+ self
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,24 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Serializes the response to a RefundCreateRequest
4
+ class RefundCreateResponse
5
+ include Response
6
+ attr_accessor :occ, :external_unique_number, :reverse_code, :issued_at,
7
+ :signature
8
+ # @raise []RefundCreateError] if the responseCode from the service is not 'OK'
9
+ def initialize(json)
10
+ unless json.fetch('responseCode').downcase == 'ok'
11
+ raise Errors::RefundCreateError, "#{json.fetch('responseCode')} : #{json.fetch('description')}"
12
+ end
13
+ result = json.fetch('result')
14
+ @response_code = json.fetch('responseCode')
15
+ @description = json.fetch('description')
16
+ @occ = result.fetch('occ')
17
+ @external_unique_number = result.fetch('externalUniqueNumber')
18
+ @reverse_code = result.fetch('reverseCode')
19
+ @issued_at = result.fetch('issuedAt')
20
+ @signature = result.fetch('signature')
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,18 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Shared methods and attributes between all types of Responses
4
+ module Response
5
+ include Utils::SignatureUtils, Transbank::Utils::JSONUtils
6
+ attr_accessor :response_code
7
+ attr_accessor :description
8
+
9
+ def response_ok?
10
+ response_code.downcase == 'ok'
11
+ end
12
+
13
+ def full_description
14
+ "#{ response_code } : #{ description }"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ require 'transbank/sdk/onepay/responses/response'
2
+ require 'transbank/sdk/onepay/responses/refund_create_response'
3
+ require 'transbank/sdk/onepay/responses/transaction_commit_response'
4
+ require 'transbank/sdk/onepay/responses/transaction_create_response'
5
+
6
+ module Transbank
7
+ module Onepay
8
+ end
9
+ end
@@ -0,0 +1,39 @@
1
+ module Transbank
2
+ module Onepay
3
+ # Serializes the response to a TransactionCommitRequest
4
+ class TransactionCommitResponse
5
+ include Response
6
+
7
+ attr_accessor :occ, :authorization_code, :signature, :transaction_desc,
8
+ :buy_order, :issued_at, :amount, :installments_amount,
9
+ :installments_number
10
+
11
+ SIGNATURE_PARAMS = [:occ,
12
+ :authorization_code,
13
+ :issued_at,
14
+ :amount,
15
+ :installments_amount,
16
+ :installments_number,
17
+ :buy_order].freeze
18
+ # @raise [KeyError] upon missing a response parameter
19
+ def initialize(json)
20
+ result = json.fetch('result')
21
+ @response_code = json.fetch('responseCode')
22
+ @description = json.fetch('description')
23
+ @occ = result.fetch('occ')
24
+ @authorization_code = result.fetch('authorizationCode')
25
+ @signature = result.fetch('signature')
26
+ @transaction_desc = result.fetch('transactionDesc')
27
+ @buy_order = result.fetch('buyOrder')
28
+ @issued_at = result.fetch('issuedAt')
29
+ @amount = result.fetch('amount')
30
+ @installments_amount = result.fetch('installmentsAmount')
31
+ @installments_number = result.fetch('installmentsNumber')
32
+ end
33
+
34
+ def sign(secret)
35
+ @signature = signature_for(to_data, secret)
36
+ end
37
+ end
38
+ end
39
+ end