camper/deploy/redsys_decode_response.sql

51 lines
1.8 KiB
PL/PgSQL

-- Deploy camper:redsys_decode_response to pg
-- requires: roles
-- requires: schema_camper
-- requires: extension_pgcrypto
-- requires: decode_base64url
-- requires: redsys_encrypt
-- requires: redsys_response
-- requires: company
-- requires: currency
-- requires: to_price
begin;
set search_path to camper, public;
create or replace function redsys_decode_response(company_id integer, encoded_data text, encoded_signature text, signature_version text) returns redsys_response as
$$
select row (
obj ->> 'Ds_MerchantCode'
, to_number((obj ->> 'Ds_Terminal'), '999')::integer
, to_number((obj ->> 'Ds_Response'), '9999')::integer
, to_timestamp((obj ->> 'Ds_Date') || ' ' || (obj ->> 'Ds_Hour'), 'DD/MM/YYYY HH24:MI')
, obj ->> 'Ds_SecurePayment' = '1'
, (obj ->> 'Ds_TransactionType')::integer
, to_price((obj ->> 'Ds_Amount')::integer, decimal_digits)
, currency_code
, obj ->> 'Ds_Order'
, coalesce(obj ->> 'Ds_AuthorisationCode', '')
, coalesce(obj ->> 'Ds_ErrorCode', '')
)::redsys_response
from (
select convert_to(encoded_data, 'UTF-8') as raw
, convert_from(decode_base64url(encoded_data), 'UTF-8')::jsonb as obj
, decode_base64url(encoded_signature) as signature
, signature_version
) as response
join currency on currency.redsys_code = (obj ->> 'Ds_Currency')::integer
where signature = hmac(raw, redsys_encrypt(company_id, convert_to(obj ->> 'Ds_Order', 'UTF-8')), 'sha256')
and signature_version = 'HMAC_SHA256_V1';
$$
language sql
stable
;
revoke execute on function redsys_decode_response(integer, text, text, text) from public;
grant execute on function redsys_decode_response(integer, text, text, text) to guest;
grant execute on function redsys_decode_response(integer, text, text, text) to employee;
grant execute on function redsys_decode_response(integer, text, text, text) to admin;
commit;