tbk-sdk 1.5.0.pre.ruby2.3

Sign up to get free protection for your applications and to get access to all the features.
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