3scale/porta

View on GitHub
app/lib/payment_gateways/authorize_net_cim_crypt.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true
 
module PaymentGateways
class AuthorizeNetCimCrypt < PaymentGatewayCrypt
 
def authorize_api_url
::ActiveMerchant::Billing::AuthorizeNetCimGateway.public_send(test? ? :test_url : :live_url)
end
 
def form_url
@form_url ||= "https://#{test? ? 'test' : 'secure'}.authorize.net/profile"
end
 
def create_profile
log_gateway_action("Creating Profile")
 
response = create_remote_profile
account.credit_card_auth_code = response.params['customer_profile_id']
account.save!
log_gateway_action("Creating Profile ok")
end
 
def action_form_url
action = account.credit_card_stored? ? "/editPayment" : "/addPayment"
form_url + action
end
 
def payment_profile
auth_response = provider.payment_gateway.cim_gateway
.get_customer_profile(:customer_profile_id => account.credit_card_auth_code)
return unless has_credit_card?(auth_response)
auth_response.params['profile']['payment_profiles']['customer_payment_profile_id']
end
 
PaymentGateways::AuthorizeNetCimCrypt#has_credit_card? doesn't depend on instance state (maybe move it to another class?)
def has_credit_card?(auth_response)
auth_response.success? &&
PaymentGateways::AuthorizeNetCimCrypt#has_credit_card? calls 'auth_response.params' 3 times
PaymentGateways::AuthorizeNetCimCrypt#has_credit_card? calls 'auth_response.params['profile']' 3 times
auth_response.params['profile'].key?('payment_profiles') &&
PaymentGateways::AuthorizeNetCimCrypt#has_credit_card? calls 'auth_response.params['profile']['payment_profiles']' 2 times
auth_response.params['profile']['payment_profiles'].key?('payment') &&
auth_response.params['profile']['payment_profiles']['payment'].key?('credit_card')
end
 
Method `get_token` has 42 lines of code (exceeds 25 allowed). Consider refactoring.
PaymentGateways::AuthorizeNetCimCrypt#get_token has approx 12 statements
def get_token(args)
PaymentGateways::AuthorizeNetCimCrypt#get_token has the variable name 'getHostedProfilePageRequest'
getHostedProfilePageRequest = <<~EOR
<?xml version="1.0" encoding="utf-8"?>
<getHostedProfilePageRequest xmlns="AnetApi/xml/v1/schema/AnetApiSchema.xsd">
<merchantAuthentication>
<name>#{args[:login]}</name>
<transactionKey>#{args[:trans_key]}</transactionKey>
</merchantAuthentication>
<customerProfileId>#{args[:profile_id]}</customerProfileId>
<hostedProfileSettings>
<setting>
<settingName>hostedProfileReturnUrl</settingName>
<settingValue>#{args[:ok_url]}</settingValue>
</setting>
<setting>
<settingName>hostedProfileReturnUrlText</settingName>
<settingValue>Continue to settings</settingValue>
</setting>
<setting>
<settingName>hostedProfilePageBorderVisible</settingName>
<settingValue>true</settingValue>
</setting>
</hostedProfileSettings>
</getHostedProfilePageRequest>
EOR
 
begin
PaymentGateways::AuthorizeNetCimCrypt#get_token calls 'user.id' 2 times
log_gateway_action("Getting token for user #{user.id}")
crypted_request = RestClient.post authorize_api_url, getHostedProfilePageRequest,
:content_type => "text/xml"
 
xml_reply = Nokogiri::XML::Document.parse(crypted_request)
if xml_reply.xpath("//api:resultCode",
'api' => 'AnetApi/xml/v1/schema/AnetApiSchema.xsd').text == 'Ok'
return xml_reply.xpath("//api:token", 'api' => 'AnetApi/xml/v1/schema/AnetApiSchema.xsd').text
else
notify_exception(IncorrectKeys.new(xml_reply))
code=xml_reply.xpath("//api:code", 'api' => 'AnetApi/xml/v1/schema/AnetApiSchema.xsd').text
raise IncorrectKeys, "code:#{code}."
end
log_gateway_action("user #{user.id} token aquired")
PaymentGateways::AuthorizeNetCimCrypt#get_token has the variable name 'e'
rescue SocketError => e
notify_exception(e)
raise PaymentGatewayDown, "Payment gateway offline. Try again in few minutes"
end
 
end
 
PaymentGateways::AuthorizeNetCimCrypt#update_user has approx 15 statements
def update_user(auth_response)
PaymentGateways::AuthorizeNetCimCrypt#update_user calls 'auth_response.params' 4 times
return :error unless auth_response.params['messages']['result_code'] == 'Ok'
 
log_gateway_action("updating user #{user}")
PaymentGateways::AuthorizeNetCimCrypt#update_user calls 'auth_response.params['profile']['payment_profiles']' 3 times
PaymentGateways::AuthorizeNetCimCrypt#update_user calls 'auth_response.params['profile']' 3 times
payment_profiles = auth_response.params['profile']['payment_profiles']
PaymentGateways::AuthorizeNetCimCrypt#update_user calls 'payment_profiles['bill_to']' 2 times
if payment_profiles && payment_profiles['bill_to']
bill_info = payment_profiles['bill_to']
account.billing_address_name = bill_info['company']
account.billing_address_address1 = bill_info['address']
account.billing_address_city = bill_info['city']
account.billing_address_country = bill_info['country']
account.billing_address_state = bill_info['state']
account.billing_address_zip = bill_info['zip']
account.billing_address_phone = bill_info['phone_number']
end
 
account.credit_card_partial_number =
auth_response.params['profile']['payment_profiles']['payment']['credit_card']['card_number'][-4..-1]
account.credit_card_authorize_net_payment_profile_token =
auth_response.params['profile']['payment_profiles']['customer_payment_profile_id']
account.credit_card_expires_on = nil #We can't store expiration date as Authorize.net doesn't retrieve it
account.save!
end
 
# FIXME: delete_user_profile has nothing to do in this class
# Reusing Account#delete_cc_details
def delete_user_profile
account.delete_cc_details
account.save!
end
 
private
 
def create_remote_profile
response = provider.payment_gateway.cim_gateway
.create_customer_profile(profile: { email: user.email, description: buyer_reference })
 
# this is a nice trick, where we raise IncorectKeys whatever the response was
raise IncorrectKeys, response unless response.params['messages']['result_code'] == 'Ok'
response
end
end
end