class LucidShopify::VerifyCallback

Constants

Error

Public Instance Methods

call(params) click to toggle source

Verify that the callback request originated from Shopify.

@param params [Hash] the request params

@raise [Error] if signature is invalid

# File lib/lucid_shopify/verify_callback.rb, line 18
def call(params)
  params = params.to_h.transform_keys(&:to_s)
  digest = OpenSSL::Digest::SHA256.new
  digest = OpenSSL::HMAC.hexdigest(digest, LucidShopify.config.shared_secret, encoded_params(params))

  raise Error, 'invalid signature' unless digest == params['hmac']
end

Private Instance Methods

encode_key(chr) click to toggle source

@param chr [String]

@return [String]

# File lib/lucid_shopify/verify_callback.rb, line 48
        def encode_key(chr)
  {'%' => '%25', '&' => '%26', '=' => '%3D'}[chr] || chr
end
encode_val(chr) click to toggle source

@param chr [String]

@return [String]

# File lib/lucid_shopify/verify_callback.rb, line 57
        def encode_val(chr)
  {'%' => '%25', '&' => '%26'}[chr] || chr
end
encoded_params(params) click to toggle source

@param params [Hash]

@return [String]

# File lib/lucid_shopify/verify_callback.rb, line 31
        def encoded_params(params)
  params.reject do |k, _|
    k == 'hmac'
  end.map do |k, v|
    [].tap do |param|
      param << k.gsub(/./) { |c| encode_key(c) }
      param << '='
      param << v.gsub(/./) { |c| encode_val(c) }
    end.join
  end.join('&')
end