Validación del Callback

Como Validar el response de Pago Fácil

Explicación del Flujo

Al terminar la transacción enviamos el response que se ejecuta en dos ocasiones; como callback por detrás del flujo de pago hacia la url designada con este fin, además de volver a la url complete también designada.

Si bien no es necesario que verifiques la información en los dos momentos, lo recomendamos.

Al terminar el proceso de firmado del en envío de la transacción, el desarrollador debe crear un nuevo proceso de firmado para validar la autenticidad de los datos que recibe por medio de metodo POST en el archivo x_url_callback.

El proceso de generación de la firma para validar la autenticidad de los datos recibidos en x_url_callback, es un evento separado del proceso de firmado para la creación de transacciones,

Para validar los datos recibidos en el POST callback recibido, debes generar tu propia firma con los parámetros recibidos (excepto la firma) y comparar la firma generada, con la recibida en el Callback.

Proceso para Generar Firma del Callback Recibido

  • Se debe de obtener un arreglo con todas las variables que comiencen con x_ desde el body del POST
  • Este arreglo se debe de ordenar de manera alfabética.
  • Una vez obtenido el arreglo, se crea un string con todas las variables y sus valores concatenados.
  • El string resultante se firma con el algoritmo SHA256 mencionado anteriormente.

Sólo debes tomar las variables que recibes en el archivo x_url_callback, menos la firma ( la cual se debe comparar en el siguiente paso).

Parametro Con los que se debe hacer la firma

Descripción

x_account_id

Corresponde al Token Service relacionado al servicio con el que deseas generar el cobro.

x_amount

Monto de la transacción. Admite decimales si la divisa utilizada los utiliza.

x_currency

Código de 3 caracteres para países.

x_gateway_reference

Corresponde al ID de la transacción en la plataforma.

x_message

Por el momento es una variable "legacy", se usa en algunos eCommerce como por ejemplo Shopify, de lo contrario su valor será "X".

x_reference

Tu número de orden. Este número debe ser único por servicio para no tener problema de duplicidad de pagos.

x_result

Estado de la orden. Pueden ser completed, failed, o pending.

x_test

Identifica si la orden fue realizada en el ambiente de pruebas. (true/false).

x_timestamp

Tiempo en que la orden fue completada en UTC. iso-8601 in UTC (2018-03-24T12:15:41Z).

Envío de La Transacción y Firmado del Callback

Ejemplo de codigo simplificado en lenguaje Python que muestra la Generación de una Transacción y la Validación del Callback. (to copy& paste)

import requests
import hashlib
import hmac
import json
import time
import webbrowser
import tokens
import pprint


encoding = 'utf-8'
x_account_id = tokens.tokenServiceDev #Put your Token Service
x_amount = str(b'5000000', encoding)
x_currency = str(b'CLP', encoding)
x_reference = str(time.time())
x_customer_email = str(b'[email protected]', encoding)
x_url_complete = str(b'https://www.pagofacil.cl', encoding)
x_url_cancel = str(b'https://www.pagofacil.cl', encoding)
x_url_callback = str(b'https://callback.domain.com', encoding)
x_shop_country = str(b'CL', encoding)
x_session_id = str(b'1', encoding)



object='x_account_id'+x_account_id+
'x_amount'+x_amount+
'x_currency'+x_currency+
'x_customer_email'+x_customer_email+
'x_reference'+x_reference+
'x_session_id'+x_session_id+
'x_shop_country'+x_shop_country+
'x_url_callback'+x_url_callback+
'x_url_cancel'+x_url_cancel+
'x_url_complete'+x_url_complete
payload = object.encode('utf-8')
key = tokens.tokenSecretDev #Put your Token Secret


# Generate the hash.
signature = hmac.new(key,payload,hashlib.sha256).hexdigest()
x_signature =  signature
url = tokens.dev # Put the Enviroment Endpoint (dev or Prod)
payload = {
  'x_account_id' : x_account_id ,
  'x_amount' : int(x_amount), 
  'x_currency' : x_currency, 
  'x_reference' : x_reference , 
  'x_customer_email' : x_customer_email, 
  'x_url_complete' : x_url_complete, 
  'x_url_cancel' : x_url_cancel, 
  'x_url_callback' : x_url_callback ,
  'x_shop_country' : x_shop_country, 
  'x_session_id' : x_session_id, 
  'x_signature' : x_signature 
}

jpayload = json.dumps(payload)
headers = {
    'accept': "application/json",
    'content-type': "application/json"
    }

response = requests.request("POST", url, data=jpayload, headers=headers)
"""
0 gateway
1 webpay
2 khipu max 5mm
3 multicaja error (404 en dev)
4 pago 46
5 mach
"""
paylink0 = response.json()['data']['payUrl'][0]['url']
paylink = response.json()['data']['payUrl']

webbrowser.open(paylink0)
pprint.pprint(paylink)
import hashlib
import hmac
encoding = 'utf-8'

token_secret = 'token secret'
x_account_id=str(b'token service', encoding) #Put your Token Service
x_amount=str(b'1002.00', encoding)
x_currency=str(b'CLP', encoding)
x_gateway_reference=str(b'7986257', encoding)
x_reference=str(b'1608319870.4214208', encoding)
x_result=str(b'completed', encoding)
x_test=str(b'false', encoding)
x_timestamp=str(b'2020-12-18T19:31:41.234Z', encoding)
x_message=str(b'X', encoding)

signature_recibida = x_signature

create_signature = 'x_account_id'+x_account_id+
'x_amount'+x_amount+
'x_currency'+x_currency+
'x_gateway_reference'+x_gateway_reference+
'x_message'+x_message+
'x_reference'+x_reference+
'x_result'+x_result+
'x_test'+x_test+
'x_timestamp'+x_timestamp

message = create_signature.encode('utf-8')
secret = bytes(token_secret, 'utf-8')
key = secret #Put your Token Secret

# Generate the hash.
signature = hmac.new(key,message,hashlib.sha256).hexdigest()
print('signature generada',signature)
print('signature recibida',signature_recibida)

Author

  • Cristian Tala Sánchez
  • Luis Marcelo Poblete Sandoval (Collaborator)