activemerchant 1.130.0 → 1.137.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +268 -0
- data/lib/active_merchant/billing/check.rb +2 -2
- data/lib/active_merchant/billing/compatibility.rb +4 -4
- data/lib/active_merchant/billing/credit_card.rb +13 -8
- data/lib/active_merchant/billing/credit_card_formatting.rb +4 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +64 -7
- data/lib/active_merchant/billing/gateway.rb +9 -0
- data/lib/active_merchant/billing/gateways/adyen.rb +240 -41
- data/lib/active_merchant/billing/gateways/airwallex.rb +26 -12
- data/lib/active_merchant/billing/gateways/alelo.rb +23 -5
- data/lib/active_merchant/billing/gateways/authorize_net.rb +44 -36
- data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +10 -6
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -3
- data/lib/active_merchant/billing/gateways/axcessms.rb +6 -2
- data/lib/active_merchant/billing/gateways/banwire.rb +4 -2
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +7 -3
- data/lib/active_merchant/billing/gateways/blue_pay.rb +13 -5
- data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
- data/lib/active_merchant/billing/gateways/borgun.rb +6 -4
- data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +65 -20
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +226 -73
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +1 -1
- data/lib/active_merchant/billing/gateways/card_connect.rb +5 -2
- data/lib/active_merchant/billing/gateways/card_stream.rb +4 -6
- data/lib/active_merchant/billing/gateways/cashnet.rb +1 -1
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_common.rb +36 -0
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_json.rb +316 -0
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_xml.rb +220 -0
- data/lib/active_merchant/billing/gateways/cecabank.rb +7 -240
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +252 -41
- data/lib/active_merchant/billing/gateways/commerce_hub.rb +69 -8
- data/lib/active_merchant/billing/gateways/credorax.rb +3 -5
- data/lib/active_merchant/billing/gateways/cyber_source.rb +192 -41
- data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +102 -58
- data/lib/active_merchant/billing/gateways/d_local.rb +26 -15
- data/lib/active_merchant/billing/gateways/data_cash.rb +21 -17
- data/lib/active_merchant/billing/gateways/datatrans.rb +279 -0
- data/lib/active_merchant/billing/gateways/decidir.rb +53 -18
- data/lib/active_merchant/billing/gateways/decidir_plus.rb +4 -1
- data/lib/active_merchant/billing/gateways/deepstack.rb +382 -0
- data/lib/active_merchant/billing/gateways/ebanx.rb +40 -36
- data/lib/active_merchant/billing/gateways/efsnet.rb +6 -2
- data/lib/active_merchant/billing/gateways/elavon.rb +99 -33
- data/lib/active_merchant/billing/gateways/element.rb +36 -7
- data/lib/active_merchant/billing/gateways/epay.rb +6 -2
- data/lib/active_merchant/billing/gateways/evo_ca.rb +6 -2
- data/lib/active_merchant/billing/gateways/eway.rb +4 -2
- data/lib/active_merchant/billing/gateways/eway_managed.rb +6 -2
- data/lib/active_merchant/billing/gateways/exact.rb +6 -2
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +31 -3
- data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -2
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_common.rb +15 -0
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_json.rb +190 -0
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_xml.rb +183 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +6 -172
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +6 -2
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +7 -3
- data/lib/active_merchant/billing/gateways/flex_charge.rb +347 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +4 -2
- data/lib/active_merchant/billing/gateways/global_collect.rb +45 -37
- data/lib/active_merchant/billing/gateways/hi_pay.rb +286 -0
- data/lib/active_merchant/billing/gateways/hps.rb +1 -1
- data/lib/active_merchant/billing/gateways/iats_payments.rb +7 -2
- data/lib/active_merchant/billing/gateways/inspire.rb +6 -4
- data/lib/active_merchant/billing/gateways/instapay.rb +7 -4
- data/lib/active_merchant/billing/gateways/ipg.rb +10 -6
- data/lib/active_merchant/billing/gateways/iridium.rb +15 -5
- data/lib/active_merchant/billing/gateways/itransact.rb +6 -2
- data/lib/active_merchant/billing/gateways/iveri.rb +3 -3
- data/lib/active_merchant/billing/gateways/ixopay.rb +2 -2
- data/lib/active_merchant/billing/gateways/jetpay.rb +4 -2
- data/lib/active_merchant/billing/gateways/jetpay_v2.rb +4 -2
- data/lib/active_merchant/billing/gateways/kushki.rb +73 -13
- data/lib/active_merchant/billing/gateways/linkpoint.rb +6 -2
- data/lib/active_merchant/billing/gateways/litle.rb +33 -50
- data/lib/active_merchant/billing/gateways/mastercard.rb +4 -4
- data/lib/active_merchant/billing/gateways/maxipago.rb +2 -2
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +8 -5
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +11 -4
- data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +11 -4
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +19 -3
- data/lib/active_merchant/billing/gateways/mercury.rb +6 -2
- data/lib/active_merchant/billing/gateways/metrics_global.rb +8 -6
- data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +1 -0
- data/lib/active_merchant/billing/gateways/migs.rb +6 -2
- data/lib/active_merchant/billing/gateways/mit.rb +25 -20
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +18 -10
- data/lib/active_merchant/billing/gateways/monei.rb +1 -1
- data/lib/active_merchant/billing/gateways/moneris.rb +9 -3
- data/lib/active_merchant/billing/gateways/money_movers.rb +6 -2
- data/lib/active_merchant/billing/gateways/nab_transact.rb +12 -4
- data/lib/active_merchant/billing/gateways/net_registry.rb +6 -2
- data/lib/active_merchant/billing/gateways/netbanx.rb +1 -3
- data/lib/active_merchant/billing/gateways/netbilling.rb +6 -2
- data/lib/active_merchant/billing/gateways/network_merchants.rb +6 -2
- data/lib/active_merchant/billing/gateways/nmi.rb +23 -6
- data/lib/active_merchant/billing/gateways/ogone.rb +6 -2
- data/lib/active_merchant/billing/gateways/openpay.rb +4 -2
- data/lib/active_merchant/billing/gateways/opp.rb +1 -2
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +6 -2
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +1 -3
- data/lib/active_merchant/billing/gateways/orbital.rb +83 -24
- data/lib/active_merchant/billing/gateways/pac_net_raven.rb +7 -4
- data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_hub.rb +4 -2
- data/lib/active_merchant/billing/gateways/pay_junction.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_secure.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_trace.rb +31 -18
- data/lib/active_merchant/billing/gateways/payeezy.rb +19 -8
- data/lib/active_merchant/billing/gateways/payex.rb +4 -2
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payflow.rb +1 -3
- data/lib/active_merchant/billing/gateways/payment_express.rb +8 -4
- data/lib/active_merchant/billing/gateways/paymentez.rb +23 -11
- data/lib/active_merchant/billing/gateways/paysafe.rb +12 -11
- data/lib/active_merchant/billing/gateways/payscout.rb +7 -4
- data/lib/active_merchant/billing/gateways/paystation.rb +7 -3
- data/lib/active_merchant/billing/gateways/payway.rb +6 -2
- data/lib/active_merchant/billing/gateways/payway_dot_com.rb +3 -3
- data/lib/active_merchant/billing/gateways/pin.rb +22 -4
- data/lib/active_merchant/billing/gateways/plexo.rb +49 -10
- data/lib/active_merchant/billing/gateways/plugnpay.rb +6 -2
- data/lib/active_merchant/billing/gateways/priority.rb +6 -5
- data/lib/active_merchant/billing/gateways/psigate.rb +6 -2
- data/lib/active_merchant/billing/gateways/psl_card.rb +6 -2
- data/lib/active_merchant/billing/gateways/qbms.rb +6 -2
- data/lib/active_merchant/billing/gateways/quantum.rb +6 -2
- data/lib/active_merchant/billing/gateways/quickbooks.rb +6 -5
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +7 -4
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +6 -2
- data/lib/active_merchant/billing/gateways/rapyd.rb +148 -46
- data/lib/active_merchant/billing/gateways/reach.rb +11 -4
- data/lib/active_merchant/billing/gateways/redsys.rb +3 -11
- data/lib/active_merchant/billing/gateways/redsys_rest.rb +507 -0
- data/lib/active_merchant/billing/gateways/s5.rb +3 -3
- data/lib/active_merchant/billing/gateways/safe_charge.rb +38 -17
- data/lib/active_merchant/billing/gateways/sage.rb +12 -4
- data/lib/active_merchant/billing/gateways/sage_pay.rb +79 -5
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +6 -2
- data/lib/active_merchant/billing/gateways/secure_net.rb +6 -2
- data/lib/active_merchant/billing/gateways/secure_pay.rb +8 -6
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +12 -4
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +6 -2
- data/lib/active_merchant/billing/gateways/securion_pay.rb +24 -10
- data/lib/active_merchant/billing/gateways/shift4.rb +17 -20
- data/lib/active_merchant/billing/gateways/shift4_v2.rb +117 -0
- data/lib/active_merchant/billing/gateways/simetrik.rb +17 -11
- data/lib/active_merchant/billing/gateways/skip_jack.rb +6 -2
- data/lib/active_merchant/billing/gateways/smart_ps.rb +7 -4
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +4 -2
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +2 -4
- data/lib/active_merchant/billing/gateways/stripe.rb +63 -19
- data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +280 -88
- data/lib/active_merchant/billing/gateways/sum_up.rb +223 -0
- data/lib/active_merchant/billing/gateways/swipe_checkout.rb +4 -2
- data/lib/active_merchant/billing/gateways/telr.rb +3 -4
- data/lib/active_merchant/billing/gateways/trans_first.rb +1 -2
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +8 -16
- data/lib/active_merchant/billing/gateways/transact_pro.rb +1 -1
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +6 -2
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +9 -8
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +6 -2
- data/lib/active_merchant/billing/gateways/vanco.rb +2 -4
- data/lib/active_merchant/billing/gateways/vantiv_express.rb +587 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +6 -2
- data/lib/active_merchant/billing/gateways/viaklix.rb +6 -2
- data/lib/active_merchant/billing/gateways/visanet_peru.rb +2 -2
- data/lib/active_merchant/billing/gateways/vpos.rb +4 -4
- data/lib/active_merchant/billing/gateways/wirecard.rb +7 -3
- data/lib/active_merchant/billing/gateways/wompi.rb +5 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +147 -93
- data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +13 -10
- data/lib/active_merchant/billing/gateways/xpay.rb +242 -0
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/billing/response.rb +2 -2
- data/lib/active_merchant/connection.rb +3 -17
- data/lib/active_merchant/country.rb +1 -0
- data/lib/active_merchant/errors.rb +10 -0
- data/lib/active_merchant/version.rb +1 -1
- data/lib/support/gateway_support.rb +2 -2
- data/lib/support/ssl_verify.rb +4 -4
- data/lib/support/ssl_version.rb +6 -6
- metadata +30 -9
@@ -161,11 +161,13 @@ module ActiveMerchant #:nodoc:
|
|
161
161
|
'Content-Type' => 'text/xml; charset=utf-8' }
|
162
162
|
response_string = ssl_post(test? ? self.test_url : self.live_url, soap, headers)
|
163
163
|
response = parse(response_string, soap_action)
|
164
|
-
return Response.new(
|
164
|
+
return Response.new(
|
165
|
+
response['errorcode'] == '000',
|
165
166
|
response['errormessage'],
|
166
167
|
response,
|
167
168
|
test: test?,
|
168
|
-
authorization: response['transaction_id']
|
169
|
+
authorization: response['transaction_id']
|
170
|
+
)
|
169
171
|
end
|
170
172
|
|
171
173
|
def build_soap(request)
|
@@ -271,11 +271,9 @@ module ActiveMerchant #:nodoc:
|
|
271
271
|
end
|
272
272
|
end
|
273
273
|
|
274
|
-
def build_xml_request(root)
|
274
|
+
def build_xml_request(root, &block)
|
275
275
|
builder = Nokogiri::XML::Builder.new
|
276
|
-
builder.__send__(root)
|
277
|
-
yield(doc)
|
278
|
-
end
|
276
|
+
builder.__send__(root, &block)
|
279
277
|
builder.to_xml
|
280
278
|
end
|
281
279
|
|
@@ -7,14 +7,16 @@ module ActiveMerchant #:nodoc:
|
|
7
7
|
class StripeGateway < Gateway
|
8
8
|
self.live_url = 'https://api.stripe.com/v1/'
|
9
9
|
|
10
|
+
# Docs on AVS codes: https://en.wikipedia.org/w/index.php?title=Address_verification_service&_ga=2.97570079.1027215965.1655989706-2008268124.1655989706#AVS_response_codes
|
11
|
+
# possible response values: https://stripe.com/docs/api/payment_methods/object#payment_method_object-card-checks
|
10
12
|
AVS_CODE_TRANSLATOR = {
|
11
|
-
'line1: pass, zip: pass' => 'Y',
|
12
13
|
'line1: pass, zip: fail' => 'A',
|
13
14
|
'line1: pass, zip: unchecked' => 'B',
|
14
|
-
'line1:
|
15
|
+
'line1: unchecked, zip: unchecked' => 'I',
|
15
16
|
'line1: fail, zip: fail' => 'N',
|
16
17
|
'line1: unchecked, zip: pass' => 'P',
|
17
|
-
'line1:
|
18
|
+
'line1: pass, zip: pass' => 'Y',
|
19
|
+
'line1: fail, zip: pass' => 'Z'
|
18
20
|
}
|
19
21
|
|
20
22
|
CVC_CODE_TRANSLATOR = {
|
@@ -292,7 +294,9 @@ module ActiveMerchant #:nodoc:
|
|
292
294
|
gsub(%r(((\[card\]|card)\[number\]=)\d+), '\1[FILTERED]').
|
293
295
|
gsub(%r(((\[card\]|card)\[swipe_data\]=)[^&]+(&?)), '\1[FILTERED]\3').
|
294
296
|
gsub(%r(((\[bank_account\]|bank_account)\[account_number\]=)\d+), '\1[FILTERED]').
|
295
|
-
gsub(%r(((\[payment_method_data\]|payment_method_data)\[card\]\[token\]=)[^&]+(&?)), '\1[FILTERED]\3')
|
297
|
+
gsub(%r(((\[payment_method_data\]|payment_method_data)\[card\]\[token\]=)[^&]+(&?)), '\1[FILTERED]\3').
|
298
|
+
gsub(%r(((\[payment_method_data\]|payment_method_data)\[card\]\[network_token\]\[number\]=)\d+), '\1[FILTERED]').
|
299
|
+
gsub(%r(((\[payment_method_options\]|payment_method_options)\[card\]\[network_token\]\[cryptogram\]=)[^&]+(&?)), '\1[FILTERED]')
|
296
300
|
end
|
297
301
|
|
298
302
|
def supports_network_tokenization?
|
@@ -577,7 +581,7 @@ module ActiveMerchant #:nodoc:
|
|
577
581
|
|
578
582
|
def add_source_owner(post, creditcard, options)
|
579
583
|
post[:owner] = {}
|
580
|
-
post[:owner][:name] = creditcard.name if creditcard.name
|
584
|
+
post[:owner][:name] = creditcard.name if creditcard.respond_to?(:name) && creditcard.name
|
581
585
|
post[:owner][:email] = options[:email] if options[:email]
|
582
586
|
|
583
587
|
if address = options[:billing_address] || options[:address]
|
@@ -613,8 +617,21 @@ module ActiveMerchant #:nodoc:
|
|
613
617
|
post[:radar_options] = radar_options unless radar_options.empty?
|
614
618
|
end
|
615
619
|
|
620
|
+
def add_header_fields(response)
|
621
|
+
return unless @response_headers.present?
|
622
|
+
|
623
|
+
headers = {}
|
624
|
+
headers['response_headers'] = {}
|
625
|
+
headers['response_headers']['idempotent_replayed'] = @response_headers['idempotent-replayed'] if @response_headers['idempotent-replayed']
|
626
|
+
headers['response_headers']['stripe_should_retry'] = @response_headers['stripe-should-retry'] if @response_headers['stripe-should-retry']
|
627
|
+
|
628
|
+
response.merge!(headers)
|
629
|
+
end
|
630
|
+
|
616
631
|
def parse(body)
|
617
|
-
JSON.parse(body)
|
632
|
+
response = JSON.parse(body)
|
633
|
+
add_header_fields(response)
|
634
|
+
response
|
618
635
|
end
|
619
636
|
|
620
637
|
def post_data(params)
|
@@ -695,34 +712,46 @@ module ActiveMerchant #:nodoc:
|
|
695
712
|
|
696
713
|
def commit(method, url, parameters = nil, options = {})
|
697
714
|
add_expand_parameters(parameters, options) if parameters
|
698
|
-
|
699
|
-
return Response.new(false, 'Invalid API Key provided') if test? && !key(options).start_with?('sk_test')
|
715
|
+
return Response.new(false, 'Invalid API Key provided') unless key_valid?(options)
|
700
716
|
|
701
717
|
response = api_request(method, url, parameters, options)
|
702
718
|
response['webhook_id'] = options[:webhook_id] if options[:webhook_id]
|
703
719
|
success = success_from(response, options)
|
704
720
|
|
705
|
-
|
706
|
-
avs_code = AVS_CODE_TRANSLATOR["line1: #{
|
707
|
-
cvc_code = CVC_CODE_TRANSLATOR[
|
708
|
-
Response.new(
|
721
|
+
card_checks = card_from_response(response)
|
722
|
+
avs_code = AVS_CODE_TRANSLATOR["line1: #{card_checks['address_line1_check']}, zip: #{card_checks['address_zip_check'] || card_checks['address_postal_code_check']}"]
|
723
|
+
cvc_code = CVC_CODE_TRANSLATOR[card_checks['cvc_check']]
|
724
|
+
Response.new(
|
725
|
+
success,
|
709
726
|
message_from(success, response),
|
710
727
|
response,
|
711
728
|
test: response_is_test?(response),
|
712
|
-
authorization: authorization_from(success, url, method, response),
|
729
|
+
authorization: authorization_from(success, url, method, response, options),
|
713
730
|
avs_result: { code: avs_code },
|
714
731
|
cvv_result: cvc_code,
|
715
732
|
emv_authorization: emv_authorization_from_response(response),
|
716
|
-
error_code: success ? nil : error_code_from(response)
|
733
|
+
error_code: success ? nil : error_code_from(response)
|
734
|
+
)
|
735
|
+
end
|
736
|
+
|
737
|
+
def key_valid?(options)
|
738
|
+
return true unless test?
|
739
|
+
|
740
|
+
%w(sk rk).each do |k|
|
741
|
+
return false if key(options).start_with?(k) && !key(options).start_with?("#{k}_test")
|
742
|
+
end
|
743
|
+
|
744
|
+
true
|
717
745
|
end
|
718
746
|
|
719
|
-
def authorization_from(success, url, method, response)
|
720
|
-
return response.
|
747
|
+
def authorization_from(success, url, method, response, options)
|
748
|
+
return response.dig('error', 'charge') || response.dig('error', 'setup_intent', 'id') || response['id'] unless success
|
721
749
|
|
722
750
|
if url == 'customers'
|
723
751
|
[response['id'], response.dig('sources', 'data').first&.dig('id')].join('|')
|
724
|
-
elsif method == :post && (url.match(/customers\/.*\/cards/) || url.match(/payment_methods\/.*\/attach/))
|
725
|
-
[response['
|
752
|
+
elsif method == :post && (url.match(/customers\/.*\/cards/) || url.match(/payment_methods\/.*\/attach/) || options[:action] == :store)
|
753
|
+
response_id = options[:action] == :store ? response['payment_method'] : response['id']
|
754
|
+
[response['customer'], response_id].join('|')
|
726
755
|
else
|
727
756
|
response['id']
|
728
757
|
end
|
@@ -736,6 +765,18 @@ module ActiveMerchant #:nodoc:
|
|
736
765
|
!response.key?('error') && response['status'] != 'failed'
|
737
766
|
end
|
738
767
|
|
768
|
+
# Override the regular handle response so we can access the headers
|
769
|
+
# set header fields and values so we can add them to the response body
|
770
|
+
def handle_response(response)
|
771
|
+
@response_headers = response.each_header.to_h if response.respond_to?(:header)
|
772
|
+
case response.code.to_i
|
773
|
+
when 200...300
|
774
|
+
response.body
|
775
|
+
else
|
776
|
+
raise ResponseError.new(response)
|
777
|
+
end
|
778
|
+
end
|
779
|
+
|
739
780
|
def response_error(raw_response)
|
740
781
|
parse(raw_response)
|
741
782
|
rescue JSON::ParserError
|
@@ -771,7 +812,10 @@ module ActiveMerchant #:nodoc:
|
|
771
812
|
end
|
772
813
|
|
773
814
|
def card_from_response(response)
|
774
|
-
|
815
|
+
# StripePI puts the AVS and CVC check significantly deeper into the response object
|
816
|
+
response['card'] || response['active_card'] || response['source'] ||
|
817
|
+
response.dig('charges', 'data', 0, 'payment_method_details', 'card', 'checks') ||
|
818
|
+
response.dig('latest_attempt', 'payment_method_details', 'card', 'checks') || {}
|
775
819
|
end
|
776
820
|
|
777
821
|
def emv_authorization_from_response(response)
|