Add Ept class and form helpers
parent
fa4dccc336
commit
46330f57b0
|
@ -6,3 +6,4 @@
|
||||||
/pkg/
|
/pkg/
|
||||||
/spec/reports/
|
/spec/reports/
|
||||||
/tmp/
|
/tmp/
|
||||||
|
/Gemfile.lock
|
||||||
|
|
|
@ -1,8 +1,44 @@
|
||||||
# frozen_string_literal: true
|
# frozen_string_literal: true
|
||||||
|
|
||||||
require_relative "monetico_paiement/version"
|
require "monetico_paiement/version"
|
||||||
|
require "monetico_paiement/parameters"
|
||||||
|
require "monetico_paiement/ept"
|
||||||
|
require "monetico_paiement/railtie" if defined?(Rails)
|
||||||
|
|
||||||
module MoneticoPaiement
|
module MoneticoPaiement
|
||||||
class Error < StandardError; end
|
class Error < StandardError; end
|
||||||
# Your code goes here...
|
|
||||||
|
API_VERSION = "3.0"
|
||||||
|
DATE_FORMAT = "%d/%m/%Y:%H:%M:%S"
|
||||||
|
|
||||||
|
END_POINTS = {
|
||||||
|
production: 'https://p.monetico-services.com/paiement.cgi',
|
||||||
|
test: 'https://p.monetico-services.com/test/paiement.cgi'
|
||||||
|
}
|
||||||
|
DEFAULT_ENV = :test
|
||||||
|
|
||||||
|
def self.configure(&block)
|
||||||
|
yield default_config
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.default_config
|
||||||
|
@@default_config ||= MoneticoPaiement::Config.new
|
||||||
|
end
|
||||||
|
|
||||||
|
class Config
|
||||||
|
attr_accessor :hmac_key, :ept_number, :company_code, :env
|
||||||
|
attr_writer :target_url
|
||||||
|
|
||||||
|
def initialize(hmac_key: nil, ept_number: nil, company_code: nil, env: MoneticoPaiement::DEFAULT_ENV, target_url: nil)
|
||||||
|
self.hmac_key = hmac_key
|
||||||
|
self.ept_number = ept_number
|
||||||
|
self.company_code = company_code
|
||||||
|
self.env = env
|
||||||
|
self.target_url = target_url
|
||||||
|
end
|
||||||
|
|
||||||
|
def target_url
|
||||||
|
@target_url || END_POINTS[env]
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
require 'base64'
|
||||||
|
require 'openssl'
|
||||||
|
require 'json'
|
||||||
|
|
||||||
|
module MoneticoPaiement
|
||||||
|
class Ept
|
||||||
|
attr_reader :config
|
||||||
|
|
||||||
|
def initialize(config = nil)
|
||||||
|
@config = config ? config : MoneticoPaiement.default_config
|
||||||
|
end
|
||||||
|
|
||||||
|
def attributes(reference, price, context:, email:, url_error:, url_success:, text: '', currency: 'EUR', locale: 'FR')
|
||||||
|
{
|
||||||
|
TPE: config.ept_number,
|
||||||
|
contexte_commande: Base64.strict_encode64(context.to_json),
|
||||||
|
date: Time.now.strftime(MoneticoPaiement::DATE_FORMAT),
|
||||||
|
lgue: locale,
|
||||||
|
mail: email,
|
||||||
|
montant: ("%.2f" % price) + currency,
|
||||||
|
reference: reference,
|
||||||
|
societe: config.company_code,
|
||||||
|
'texte-libre': text,
|
||||||
|
url_retour_err: url_error,
|
||||||
|
url_retour_ok: url_success,
|
||||||
|
version: MoneticoPaiement::API_VERSION
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
def mac_string(params)
|
||||||
|
compute_hmac_sha1 generate_data(params)
|
||||||
|
end
|
||||||
|
|
||||||
|
def valid_hmac?(params)
|
||||||
|
return false unless params.key?('MAC')
|
||||||
|
|
||||||
|
mac_string(params) == params['MAC'].downcase
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def generate_data(params)
|
||||||
|
params.reject { |k| k == 'MAC' }
|
||||||
|
.sort
|
||||||
|
.map { |pair| pair.join('=') }
|
||||||
|
.join('*')
|
||||||
|
end
|
||||||
|
|
||||||
|
def compute_hmac_sha1(data)
|
||||||
|
OpenSSL::HMAC.hexdigest(OpenSSL::Digest::SHA1.new, usable_key, data).downcase
|
||||||
|
end
|
||||||
|
|
||||||
|
def usable_key
|
||||||
|
hex_string_key = config.hmac_key[0..37]
|
||||||
|
hex_final = config.hmac_key[38..40] + "00";
|
||||||
|
|
||||||
|
cca0 = hex_final[0].ord
|
||||||
|
|
||||||
|
if cca0 > 70 && cca0 < 97
|
||||||
|
hex_string_key += (cca0 - 23).chr + hex_final[1..2]
|
||||||
|
elsif hex_final[1..2] == "M"
|
||||||
|
hex_string_key += hex_final[0..1] + "0"
|
||||||
|
else
|
||||||
|
hex_string_key += hex_final[0..2]
|
||||||
|
end
|
||||||
|
|
||||||
|
[hex_string_key].pack("H*")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,25 @@
|
||||||
|
module MoneticoPaiement
|
||||||
|
module FormHelper
|
||||||
|
def monetico_paiement_form_tag(reference, price, form_options: {}, context:, email:, url_error:, url_success:, currency: 'EUR', locale: 'FR', ept: MoneticoPaiement::Ept.new, &block)
|
||||||
|
form_tag ept.config.target_url, method: :post, authenticity_token: false, remote: false, enforce_utf8: false, **form_options do
|
||||||
|
monetico_paiement_fields(reference, price,
|
||||||
|
context: context, email: email, url_error: url_error,
|
||||||
|
url_success: url_success, currency: currency, locale: locale, ept: ept) + capture(&block)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def monetico_paiement_fields(reference, price, context:, email:, url_error:, url_success:, currency: 'EUR', locale: 'FR', ept: MoneticoPaiement::Ept.new)
|
||||||
|
attributes = ept.attributes(reference, price,
|
||||||
|
context: context, email: email, url_error: url_error,
|
||||||
|
url_success: url_success, currency: currency, locale: locale)
|
||||||
|
|
||||||
|
html = hidden_field_tag('MAC', ept.mac_string(attributes))
|
||||||
|
|
||||||
|
attributes.each do |name, value|
|
||||||
|
html << hidden_field_tag(name, value)
|
||||||
|
end
|
||||||
|
|
||||||
|
html
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,36 @@
|
||||||
|
module MoneticoPaiement
|
||||||
|
ALLOWED_PARAMS = %i{
|
||||||
|
code-retour
|
||||||
|
MAC
|
||||||
|
TPE
|
||||||
|
montant
|
||||||
|
montantestime
|
||||||
|
reference
|
||||||
|
texte-libre
|
||||||
|
date
|
||||||
|
cvx
|
||||||
|
vld
|
||||||
|
brand
|
||||||
|
numauto
|
||||||
|
authentification
|
||||||
|
usage
|
||||||
|
typecompte
|
||||||
|
ecard
|
||||||
|
motifrefus
|
||||||
|
motifrefusautorisation
|
||||||
|
originecb
|
||||||
|
bincb
|
||||||
|
hpancb
|
||||||
|
ipclient
|
||||||
|
originetr
|
||||||
|
montantech
|
||||||
|
numero_dossier
|
||||||
|
typefacture
|
||||||
|
filtragecause
|
||||||
|
filtragevaleur
|
||||||
|
filtrage_etat
|
||||||
|
cbenregistree
|
||||||
|
cbmasquee
|
||||||
|
modepaiement
|
||||||
|
}
|
||||||
|
end
|
|
@ -0,0 +1,9 @@
|
||||||
|
require 'monetico_paiement/form_helper'
|
||||||
|
|
||||||
|
module MoneticoPaiement
|
||||||
|
class Railtie < Rails::Railtie
|
||||||
|
initializer "monetico_paiement.form_helpers" do
|
||||||
|
ActionView::Base.send :include, FormHelper
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -26,9 +26,11 @@ Gem::Specification.new do |spec|
|
||||||
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
||||||
spec.require_paths = ["lib"]
|
spec.require_paths = ["lib"]
|
||||||
|
|
||||||
# Uncomment to register a new dependency of your gem
|
spec.add_dependency "openssl", "~> 2.2"
|
||||||
# spec.add_dependency "example-gem", "~> 1.0"
|
spec.add_dependency "json"
|
||||||
|
|
||||||
# For more information and examples about making a new gem, checkout our
|
spec.add_development_dependency "bundler", "~> 2.2"
|
||||||
# guide at: https://bundler.io/guides/creating_gem.html
|
spec.add_development_dependency "rake", "~> 13.0"
|
||||||
|
spec.add_development_dependency "irb"
|
||||||
|
spec.add_development_dependency "minitest"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue