51 lines
1.8 KiB
MySQL
51 lines
1.8 KiB
MySQL
|
-- 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;
|