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 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)
Updated 9 months ago