Class: Adyen::Utils::HmacValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/adyen/utils/hmac_validator.rb

Constant Summary collapse

HMAC_ALGORITHM =
'sha256'.freeze
DATA_SEPARATOR =
':'.freeze
NOTIFICATION_VALIDATION_KEYS =
%w[
  pspReference originalReference merchantAccountCode merchantReference
  amount.value amount.currency eventCode success
].freeze

Instance Method Summary collapse

Instance Method Details

#calculate_notification_hmac(notification_request_item, hmac_key) ⇒ Object



18
19
20
21
22
# File 'lib/adyen/utils/hmac_validator.rb', line 18

def calculate_notification_hmac(notification_request_item, hmac_key)
  data = data_to_sign(notification_request_item)

  Base64.strict_encode64(OpenSSL::HMAC.digest(HMAC_ALGORITHM, [hmac_key].pack('H*'), data))
end

#data_to_sign(notification_request_item) ⇒ Object



24
25
26
27
28
# File 'lib/adyen/utils/hmac_validator.rb', line 24

def data_to_sign(notification_request_item)
  NOTIFICATION_VALIDATION_KEYS.map { |key| fetch(notification_request_item, key).to_s }
                              .map { |value| value.gsub('\\', '\\\\').gsub(':', '\\:') }
                              .join(DATA_SEPARATOR)
end

#valid_notification_hmac?(notification_request_item, hmac_key) ⇒ Boolean

Returns:

  • (Boolean)


11
12
13
14
15
16
# File 'lib/adyen/utils/hmac_validator.rb', line 11

def valid_notification_hmac?(notification_request_item, hmac_key)
  expected_sign = calculate_notification_hmac(notification_request_item, hmac_key)
  merchant_sign = fetch(notification_request_item, 'additionalData.hmacSignature')

  expected_sign == merchant_sign
end