module Adyen
module REST
# This module implements the Payment.authorise, and Payment.authorise3d
# API calls, and includes a custom response class to make handling the response easier.
module AuthorisePayment
class Request < Adyen::REST::Request
def set_amount(currency, value)
self['amount'] = { currency: currency, value: value }
end
def set_encrypted_card_data(source)
encrypted_json = if source.respond_to?(:params)
source.params['adyen-encrypted-data']
elsif source.is_a?(Hash) && source.key?('adyen-encrypted-data')
source['adyen-encrypted-data']
else
source
end
self['additional_data.card.encrypted.json'] = encrypted_json
end
def set_browser_info(request)
self['shopper_ip'] = request.ip
self['browser_info.accept_header'] = request['Accept'] || "text/html;q=0.9,*/*",
self['browser_info.user_agent'] = request.user_agent
end
def set_3d_secure_parameters(request)
set_browser_info(request)
self['pa_response'] = request.params['PaRes']
self['md'] = request.params['MD']
end
end
# The Response class implements some extensions for the authorise payment call.
# @see Adyen::REST::Response
class Response < Adyen::REST::Response
# Checks whether the authorisation was successful.
# @return [Boolean] true iff the authorisation was successful, and the
# authorised amount can be captured.
def authorised?
result_code == AUTHORISED
end
alias_method :authorized?, :authorised?
# Check whether the payment was refused.
# @return [Boolean] true iff the authorisation was not successful.
def refused?
result_code == REFUSED
end
# Checks whether the result of the authorization call was RedirectShopper,
# which means that the customer has to be redirected away from your site to
# complete the 3Dsecure transaction.
# @return [Boolean] true iff the shopper has to be redirected,
# false in any other case.
def redirect_shopper?
result_code == REDIRECT_SHOPPER
end
# Returns the result code from the transaction.
# @return [String] The result code.
# @see #authorised?
# @see #refused?
# @see #redirect_shopper?
def result_code
self[:result_code]
end
private
AUTHORISED = 'Authorised'.freeze
REFUSED = 'Refused'.freeze
REDIRECT_SHOPPER = 'RedirectShopper'.freeze
private_constant :AUTHORISED, :REFUSED, :REDIRECT_SHOPPER
end
# Generates Payment.authorise request for Adyen's webservice.
# @param (see #authorise_payment)
# @return [Adyen::REST::Request] The request to send
# @see #authorise_payment
def authorise_payment_request(attributes = {})
Adyen::REST::AuthorisePayment::Request.new('Payment.authorise', attributes,
response_class: Adyen::REST::AuthorisePayment::Response)
end
# Sends an authorise payment request to Adyen's webservice.
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::Response] The response from Adyen.
# The response responds to .authorised? to check whether the
# authorization was successful.
# @see Adyen::REST::AuthorisePayment::Response#authorised?
def authorise_payment(attributes)
request = authorise_payment_request(attributes)
execute_request(request)
end
# Generates a Payment.authorise3d request to Adyen's webservice.
#
# The response differs based on the credit card uses in the transaction.
# For some credit cards, an additional offsite step may be required to complete
# the transaction. Check .redirect_shopper? to see if this is the case.
# Other cards are not 3DSecure-enabled, and may immediately authorise the
# transaction. Check .authorised? to see if this is the case.
#
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::Response] The response from Adyen.
# @see Adyen::REST::AuthorisePayment::Response#redirect_shopper?
# @see Adyen::REST::AuthorisePayment::Response#authorised?
def authorise_payment_3dsecure_request(attributes = {})
Adyen::REST::AuthorisePayment::Request.new('Payment.authorise3d', attributes,
response_class: Adyen::REST::AuthorisePayment::Response)
end
# Sends a 3Dsecure-enabled authorise payment request to Adyen's webservice.
#
# The response differs based on the credit card uses in the transaction.
# For some credit cards, an additional offsite step may be required to complete
# the transaction. Check .redirect_shopper? to see if this is the case.
# Other cards are not 3DSecure-enabled, and may immediately authorise the
# transaction. Check .authorised? to see if this is the case.
#
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::Response] The response from Adyen.
# @see Adyen::REST::AuthorisePayment::Response#redirect_shopper?
# @see Adyen::REST::AuthorisePayment::Response#authorised?
def authorise_payment_3dsecure(attributes)
request = authorise_payment_3dsecure_request(attributes)
execute_request(request)
end
# Generates Payment.authorise request with recurring for Adyen's webservice.
# @param (see #authorise_recurring_payment)
# @return [Adyen::REST::Request] The request to send
# @see #authorise_recurring_payment
def authorise_recurring_payment_request(attributes={})
Adyen::REST::AuthoriseRecurringPayment::Request.new('Payment.authorise', attributes,
response_class: Adyen::REST::AuthorisePayment::Response)
end
# Sends an authorise recurring payment request to Adyen's webservice.
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::Response] The response from Adyen.
# The response responds to .authorised? to check whether the
# authorization was successful.
# @see Adyen::REST::AuthorisePayment::Response#authorised?
def authorise_recurring_payment(attributes)
request = authorise_recurring_payment_request(attributes)
execute_request(request)
end
# Generates Payment.authorise request with recurring for Adyen's webservice.
# This method can be called if a previous contract was established with #authorise_recurring_payment
# @param (see #authorise_recurring_payment)
# @return [Adyen::REST::Request] The request to send
# @see #authorise_recurring_payment
def reauthorise_recurring_payment_request(attributes={})
Adyen::REST::ReauthoriseRecurringPayment::Request.new('Payment.authorise', attributes,
response_class: Adyen::REST::AuthorisePayment::Response)
end
# Sends an authorise recurring payment request to Adyen's webservice.
# This method can be called if a previous contract was established with #authorise_recurring_payment
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::Response] The response from Adyen.
# The response responds to .authorised? to check whether the
# authorization was successful.
# @see Adyen::REST::AuthorisePayment::Response#authorised?
def reauthorise_recurring_payment(attributes)
request = reauthorise_recurring_payment_request(attributes)
execute_request(request)
end
# The Response class implements some extensions for the list recurring details call.
# @see Adyen::REST::Response
class ListRecurringDetailsResponse < Adyen::REST::Response
# Returns a list of recurring details
# @return [Array] A not empty array if there is at least a recurring detail
def details
mapped_attributes = {
:recurring_detail_reference => "recurringDetailReference",
:creation_date => "creationDate",
:variant => "variant",
:card_holder_name => "card.holderName",
:card_expiry_month => "card.expiryMonth",
:card_expiry_year => "card.expiryYear",
:card_number => "card.number"
}
map_response_list("details", mapped_attributes)
end
# Returns a list of recurring details references
# @return [Array] A not empty array if there is at least a recurring detail reference
def references
details.map { |detail| detail[:recurring_detail_reference] }
end
end
# Generates Recurring.listRecurringDetails request for Adyen's webservice.
# @param (see #list_recurring_details)
# @return [Adyen::REST::ListRecurringDetailsPayment::Request] The request to send
# @see #list_recurring_details
def list_recurring_details_request(attributes = {})
Adyen::REST::ListRecurringDetailsPayment::Request.new('Recurring.listRecurringDetails', attributes,
response_class: Adyen::REST::AuthorisePayment::ListRecurringDetailsResponse)
end
# Sends an list recurring details request to Adyen's webservice.
# @param attributes [Hash] The attributes to include in the request.
# @return [Adyen::REST::AuthorisePayment::ListRecurringDetailsResponse] The response from Adyen.
# The response responds to .details and .references with recurring data.
# @see Adyen::REST::AuthorisePayment::ListRecurringDetailsResponse#references
# @see Adyen::REST::AuthorisePayment::ListRecurringDetailsResponse#details
def list_recurring_details(attributes)
request = list_recurring_details_request(attributes)
execute_request(request)
end
alias_method :authorize_payment_request, :authorise_payment_request
alias_method :authorize_payment, :authorise_payment
alias_method :authorize_payment_3dsecure_request, :authorise_payment_3dsecure_request
alias_method :authorize_payment_3dsecure, :authorise_payment_3dsecure
alias_method :reauthorize_recurring_payment_request, :reauthorise_recurring_payment_request
alias_method :reauthorize_recurring_payment, :reauthorise_recurring_payment
end
end
end