Payou

Desarrolladores

Seis endpoints, una firma, sin SDK.

Solicitudes HTTP firmadas contra endpoints simples. Usa la página de pago alojada o pide los datos de pago en JSON y construye tu propio checkout: en ambos casos el resultado te llega como un único webhook firmado.

GET/api/new/api.php
# Solicita los datos de pago - la firma se construye con tu contraseña de comercio
# hash = md5(id : summ : password : sistems : order_id)
HASH=$(printf '%s' "5:100.00:$PAYOU_PASSWORD:card_RUB:4444" | md5sum | cut -d' ' -f1)

curl -G https://payou.pro/api/new/api.php \
  --data-urlencode id=5 \
  --data-urlencode sistems=card_RUB \
  --data-urlencode summ=100.00 \
  --data-urlencode order_id=4444 \
  --data-urlencode user_code=1 \
  --data-urlencode user_email=[email protected] \
  --data-urlencode hash="$HASH"
Solicitud
AUTENTICACIÓN
WEBHOOKS
PASO 01

Consigue tus credenciales de comercio

Regístrate, añade tu sitio y envíalo a moderación. Una vez aprobado, tu ID de comercio y tu contraseña secreta están en el panel.

PASO 02

Firma y envía

Construye el hash con tu ID de comercio, el importe, tu secreto, el método y el ID de pedido, y llama al endpoint. El importe es una cadena decimal con punto.

PASO 03

Recibe el webhook

Payou envía el resultado a tu URL con una firma. Verifícala, responde MERCHANT_ORDER_ID|success y acredita el pedido una sola vez.

AUTENTICACIÓN

ID de comercio y contraseña secreta

Las solicitudes se firman; no se autentican con un token de portador. El hash es md5 sobre tu ID de comercio, el importe, tu contraseña secreta, el método y tu ID de pedido, así que el secreto nunca viaja. Los pagos salientes usan una clave de API aparte, firmada con HMAC-SHA256.

IMPORTES

Cadena decimal con punto

El importe se envía como una cadena decimal con punto como separador: 100.00, nunca 100,00. Esa misma cadena entra en la firma, así que una diferencia de formato rompe el hash en lugar del pago.

ORDER ID

Tu referencia es la clave

order_id es tu propio identificador. Es lo que consulta el endpoint de estado, lo que te devuelve el webhook y aquello contra lo que concilias, así que tiene que ser único de tu lado.

WEBHOOKS

POST de formulario firmado

Payou envía por POST a tu URL los campos AMOUNT, status, intid, MERCHANT_ORDER_ID y SIGN como application/x-www-form-urlencoded. Verifica SIGN y responde MERCHANT_ORDER_ID|success: cualquier otro cuerpo se considera no entregado.

ESTADO

Consulta el estado o espera el webhook

Dos consultas: una por el id de transacción de Payou y otra por tu order_id. Ambas responden con id, order_id, status, paysys y summ, así que un proceso de conciliación no necesita nada más.

PRODUCCIÓN

La integración se hace en producción

No existe un host de pruebas aparte. Integras contra los endpoints del entorno de producción con una cuenta de comercio que se habilita tras la moderación.

Endpoints

Toda la superficie que necesitas para una primera integración. Las llamadas de pago se firman con tu contraseña de comercio; los pagos salientes usan una clave de API aparte y HMAC-SHA256.

Método Endpoint Función
GET /sci/v1/ Página de pago alojada: envía aquí al pagador
GET /api/new/api.php Datos de pago en JSON, para tu propio checkout
GET /api/status Estado del pago por id de transacción de Payou
GET /api/status2 Estado del pago por tu order_id
POST /api/new/confirm_payment.php El pagador confirma o cancela un pago
POST /api/payout_create.php Crea un pago saliente a una tarjeta o cuenta

API

Una solicitud firmada. Los datos de pago vuelven en JSON.

El país y el método son parámetros de la misma llamada, no integraciones separadas. La ruta que hay detrás la elige la capa.

GET/api/new/api.php

Solicitud

# Solicita los datos de pago - la firma se construye con tu contraseña de comercio
# hash = md5(id : summ : password : sistems : order_id)
curl -G https://payou.pro/api/new/api.php \
  --data-urlencode id=5 \
  --data-urlencode sistems=card_RUB \
  --data-urlencode summ=100.00 \
  --data-urlencode order_id=4444 \
  --data-urlencode user_code=1 \
  --data-urlencode hash="$HASH"

Respuesta

# HTTP 200 · application/json
{
  "id":           "3874512",
  "card":         "0000 0000 0000 0000",
  "wallet_owner": "CARDHOLDER NAME",
  "sbp_bank":     "BANK NAME",
  "amount":       "100.00"
}

Respuesta de demostración. No se mueven fondos reales.

Credenciales, referencia, primera solicitud.

La documentación es abierta: no hace falta una llamada comercial para empezar a leer ni para desarrollar contra los endpoints.