1
0
mirror of https://github.com/LaCasemate/fab-manager.git synced 2024-12-11 22:24:21 +01:00
fab-manager/lib/pay_zen/helper.rb

103 lines
3.5 KiB
Ruby
Raw Normal View History

# frozen_string_literal: true
# PayZen payement gateway
module PayZen; end
## Provides various methods around the PayZen payment gateway
class PayZen::Helper
class << self
2021-04-13 17:16:05 +02:00
## Is the PayZen gateway enabled?
def enabled?
2021-04-08 17:11:48 +02:00
return false unless Setting.get('online_payment_module')
return false unless Setting.get('payment_gateway') == 'payzen'
res = true
%w[payzen_username payzen_password payzen_endpoint payzen_public_key payzen_hmac payzen_currency].each do |pz_setting|
res = false unless Setting.get(pz_setting).present?
end
res
end
2021-04-12 12:16:12 +02:00
2021-04-13 17:16:05 +02:00
## generate an unique string reference for the content of a cart
2021-06-14 14:53:59 +02:00
def generate_ref(cart_items, customer)
2021-04-12 12:16:12 +02:00
require 'sha3'
2021-06-14 14:53:59 +02:00
content = { cart_items: cart_items, customer: customer }.to_json + DateTime.current.to_s
# It's safe to truncate a hash. See https://crypto.stackexchange.com/questions/74646/sha3-255-one-bit-less
SHA3::Digest.hexdigest(:sha224, content)[0...24]
2021-04-13 17:16:05 +02:00
end
## Generate a hash map compatible with PayZen 'V4/Customer/Customer'
def generate_customer(customer_id, operator_id, cart_items)
2021-04-13 17:16:05 +02:00
customer = User.find(customer_id)
operator = User.find(operator_id)
2021-04-13 17:16:05 +02:00
address = if customer.organization?
customer.invoicing_profile.organization.address&.address
else
customer.invoicing_profile.address&.address
end
{
reference: customer.id,
email: customer.invoicing_profile.email,
billingDetails: {
firstName: customer.invoicing_profile.first_name,
lastName: customer.invoicing_profile.last_name,
legalName: customer.organization? ? customer.invoicing_profile.organization.name : nil,
address: address
},
shippingDetails: {
category: customer.organization? ? 'COMPANY' : 'PRIVATE',
shippingMethod: 'ETICKET'
},
shoppingCart: generate_shopping_cart(cart_items, customer, operator)
2021-04-13 17:16:05 +02:00
}
2021-04-12 12:16:12 +02:00
end
## Generate a hash map compatible with PayZen 'V4/Customer/ShoppingCart'
def generate_shopping_cart(cart_items, customer, operator)
2021-06-04 18:26:20 +02:00
cart = if cart_items.is_a? ShoppingCart
cart_items
else
cs = CartService.new(operator)
cs.from_hash(cart_items)
end
{
cartItemInfo: cart.items.map do |item|
{
productAmount: item.price[:amount].to_i.to_s,
productLabel: item.name,
productQty: 1.to_s,
productType: customer.organization? ? 'SERVICE_FOR_BUSINESS' : 'SERVICE_FOR_INDIVIDUAL'
}
end
}
end
## Check the PayZen signature for integrity
def check_hash(algorithm, hash_key, hash_proof, data, key = nil)
supported_hash_algorithm = ['sha256_hmac']
# check if the hash algorithm is supported
2021-05-28 09:10:34 +02:00
raise ::PayzenError, "hash algorithm not supported: #{algorithm}. Update your SDK" unless supported_hash_algorithm.include? algorithm
# if key is not defined, we use kr-hash-key parameter to choose it
if key.nil?
if hash_key == 'sha256_hmac'
key = Setting.get('payzen_hmac')
elsif hash_key == 'password'
key = Setting.get('payzen_password')
else
2021-05-28 09:10:34 +02:00
raise ::PayzenError, 'invalid hash-key parameter'
end
end
hash = OpenSSL::HMAC.hexdigest('SHA256', key, data)
# return true if calculated hash and sent hash are the same
hash == hash_proof
end
end
end