API
createPayment
Es la mutación principal del flujo de pago. Es útil para crear pagos en Hero.
Example
mutation {
createPayment(
payment: {
amount: 5000
redirectUri: "https://shop.hero.fr?shop-payment-id=abc567"
type: Pay1X
issuer: {
address: {
line1: "10 Something Street"
line2: "2nd door on the left"
city: "Paris"
zipCode: "75001"
}
deliveryAddress: {
line1: "2 High Street"
line2: "Apartment 2"
city: "Paris"
zipCode: "75010"
}
name: "Super Corp"
contactEmail: "laura@example.com"
contactPhone: "+330600000000"
customerReference: "<Your customer identifier>"
}
}
) {
id
}
}
Arguments
La mutación createPayment
toma un argumento del tipo NewPayment
Argumento | Tipo | Descripción | Obligatorio |
---|---|---|---|
amount | Int | El monto total del pago. Debe estar en céntimos de euros. ej: 5000 para un pago de 50€. | sí |
redirectUri | String | La URI donde Hero notificará a tu sistema. También es la URI donde Hero redirigirá a tu cliente cuando el pago esté completado. Esta URI no debe estar protegida por ningún sistema de autenticación. Se recomienda incluir el ID único del pedido en ella. | sí |
comebackUri | String | La URI que permite al cliente volver a tu selección de método de pago. Si no la proporcionas, el cliente será redirigido a la última página visitada cuando haga clic en el botón "Revenir au site marchand" (en la parte inferior de la página de pago de Hero). | no |
type | Enum | El tipo de pago elegido. Por favor, devuelve el valor recibido por avalaiblePaymentTypes. | sí |
issuer | Object | Información sobre tu cliente. | sí |
issuer.address | Object | Dirección de facturación del cliente | sí |
issuer.address.line1 | String | Dirección de facturación del cliente - Primera línea | sí |
issuer.address.line2 | String | Dirección de facturación del cliente - Segunda línea | no |
issuer.address.city | String | Dirección de facturación del cliente - Ciudad | sí |
issuer.address.zipCode | String | Dirección de facturación del cliente - Código postal | sí |
issuer.deliveryAddress | Object | Dirección de entrega del cliente | no |
issuer.deliveryAddress.line1 | String | Dirección de entrega del cliente - Primera línea | sí |
issuer.deliveryAddress.line2 | String | Dirección de entrega del cliente - Segunda línea | no |
issuer.deliveryAddress.city | String | Dirección de entrega del cliente - Ciudad | sí |
issuer.deliveryAddress.zipCode | String | Dirección de entrega del cliente - Código postal | sí |
issuer.name | String | Nombre de la empresa del cliente | sí |
issuer.contactEmail | String | Correo electrónico del cliente | sí |
issuer.contactPhone | String | Número de teléfono del cliente | sí |
issuer.customerReference | String | El identificador único que utilizas para este cliente. | no |
Response
Cuando se crea el pago, la API devuelve el id del pago. Deberías guardar este ID en algún lugar para poder redirigir al cliente a la página de pago de Hero en esta URL: https://pay.heropay.eu/checkout/XXXXX
donde XXX es el payment_id
(en producción). En entorno de staging, la URL sería https://staging.pay.heropay.eu/checkout/XXX
Errors
createPayment
puede fallar por varias razones. Aquí está la lista de los errores más comunes y sus explicaciones.
errorCode | Error Type | Descripción |
---|---|---|
NOT_LOGGED | Error | Falta la Api-Key o es inválida. |
MERCHANT_PRODUCT_DISABLED | Error | La cuenta que estás utilizando no está autorizada para recibir pagos. Contacta con tu administrador Hero. |
INVALID_PAYMENT_TYPE | Error | El tipo de pago es inválido. Revisa tu solicitud y asegúrate de que tu cuenta Hero esté correctamente configurada por nuestro equipo. |
Amount XX is smaller than paymentMin YY | Error | El monto es inferior a tu monto mínimo de pago autorizado. Si crees que este no debería ser el caso, contacta con tu administrador Hero. |
Amount XX is bigger than paymentMax YY | Error | El monto es superior a tu monto máximo de pago autorizado. Si crees que este no debería ser el caso, contacta con tu administrador Hero. |
getPaymentsInfos
Puedes llamar a este endpoint cuando necesites conocer la información más reciente de uno o varios pagos, como si el pago ha sido finalizado o el monto reembolsado del pago.
Example
query {
getPaymentsInfos(paymentIds: ["payment_id_1", "payment_id_2"]) {
... on GetPaymentsInfosResult {
result {
paymentId
isSuccess
error
reviewStatus
reason
initialPaymentAmount
pendingRefundAmount
refundedAmount
}
}
... on ValidationErrors {
validationErrors {
path
validationError
}
}
}
}
Arguments
Este endpoint toma un argumento. El/los ID(s) del/de los pago(s) sobre los que quieres obtener información.
Argumento | Tipo | Descripción | Obligatorio |
---|---|---|---|
paymentIds | Array of String | El/los payment_id (s) del pago. | sí |
Response
La respuesta será un array de objetos para cada payment_id
pasado. Solo los payment_id
existentes serán devueltos con la siguiente información. Si ninguno de los payment_id
existe, el resultado será un array vacío.
Por favor, consulta el flujo de pago para más información sobre cada estado y su significado.
Campo | Tipo | Descripción | Nullable |
---|---|---|---|
paymentId | string | El id del pago | no |
isSuccess | boolean | Indica si el pago ha sido finalizado o no. | no |
error | string | El pago no ha sido finalizado. No valides el pedido. | sí |
reviewStatus | integer | El estado de revisión de riesgo. No se utiliza para nuestra solución de Procesamiento. | no |
reason | integer | La razón del estado de revisión de riesgo. No se utiliza para nuestra solución de Procesamiento. | sí |
initialPaymentAmount | integer | El monto inicial del pago. | no |
pendingRefundAmount | integer | La suma de los montos de reembolso actualmente en proceso. | no |
refundedAmount | integer | La suma de todos los montos de reembolso exitosos para este pago. | no |
Ejemplo de una respuesta:
- Éxito:
{
"result": [
{
"paymentId": "payment_id_1",
"isSuccess": true,
"error": undefined,
"reviewStatus": "ACCEPTED",
"reason": "",
"initialPaymentAmount": 8000,
"pendingRefundAmount": 0,
"refundedAmount": 0
},
{
"paymentId": "payment_id_2",
"isSuccess": false,
"error": "PAYMENT_NOT_INITIATED",
"reviewStatus": "NONE",
"reason": "None",
"initialPaymentAmount": 5000,
"pendingRefundAmount": 0,
"refundedAmount": 0
}
]
}
- Error:
{
"result": []
}
Cuando hay un error, ¡el pedido no debe ser validado! Se debe informar al cliente que su pedido ha fallado y que el pago no ha sido finalizado.
setOrderId
Esta solicitud te da la posibilidad de definir el ID del pedido para un pago iniciado.
Example
mutation {
setOrderId(paymentId: "payé123", orderId: "order123")
}
Arguments
Argumento | Tipo | Descripción | Obligatorio |
---|---|---|---|
paymentId | String | El payment_id del pago. | sí |
orderId | String | El orderId que quieres vincular al Pago. Es una cadena que representa el pedido en tu sistema. | sí |
Response
La respuesta es siempre true
.
refundPaymentCheckout
Cuando necesites revertir una transacción, puedes usar este endpoint y nosotros manejaremos el proceso de reembolso por ti. Esto te permite reembolsar transacciones específicas de pago.
Example
mutation {
refundPaymentCheckout(
input: {
paymentCheckoutId: "paycheckout-6cd6e21d-c35e-4ee3-8b86-965fb3b44c99"
amount: 30000
}
) {
... on RefundPaymentCheckoutOutput {
success
}
... on GqlHeroError {
errorCode
message
}
... on ValidationErrors {
validationErrors {
path
validationError
}
}
}
}
Arguments
Este endpoint toma un objeto de entrada con las siguientes propiedades:
Propiedad | Tipo | Descripción | Obligatorio |
---|---|---|---|
paymentCheckoutId | String | El ID del pago a reembolsar | sí |
amount | Integer | El monto a reembolsar en céntimos | sí |
Response
Campo | Tipo | Descripción | Nullable |
---|---|---|---|
success | Boolean | Indica si el reembolso fue exitoso | no |
Ejemplo de una respuesta exitosa:
{
"data": {
"refundPaymentCheckout": {
"success": true
}
}
}
Errors
El proceso de reembolso puede fallar por varias razones. El resolvedor devuelve diferentes tipos de errores:
Validation Errors
Ocurre cuando la validación de entrada falla.
{
"data": {
"refundPaymentCheckout": {
"validationErrors": [
{
"path": ["amount"],
"validationError": "Amount must be a positive number"
}
]
}
}
}
Functional Errors
Estos errores están relacionados con reglas de negocio y operaciones:
Error Code | Descripción |
---|---|
UNAUTHORIZED | No tienes permiso para realizar esta acción |
FUNCTIONAL_ERROR | Varias violaciones de reglas de negocio, incluyendo: |
- INVALID_AMOUNT: El monto es inválido (debe ser positivo y no exceder el monto original del pago) | |
- INVALID_PAYMENT_CHECKOUT: El pago no existe | |
- DRAFT_PAYMENT_CHECKOUT: No se puede reembolsar un pago en borrador | |
- BA_NOT_FOUND: Cuenta de negocio no encontrada | |
- BA_ONBOARDING_IS_NOT_COMPLETED: El proceso de onboarding de la cuenta de negocio no está completo | |
- BA_BALANCE_INSUFFICIENT: Fondos insuficientes en la cuenta de negocio | |
- BA_CANNOT_TRANSFER_FUNDS: No se pueden transferir fondos desde la cuenta de negocio | |
- AMOUNT_TOO_LOW: El monto del reembolso debe ser de al menos 1 céntimo | |
- AMOUNT_TOO_HIGH: El monto del reembolso excede el monto reembolsable | |
- LEDGER_BALANCE_TOO_LOW: Saldo insuficiente en la cuenta contable | |
- REFUND_IS_FROZEN: El pago está actualmente congelado y no puede ser reembolsado | |
- PAYMENT_NOT_STARTED: No se puede reembolsar un pago que no ha sido iniciado |
Technical Errors
Estos son errores internos del sistema que pueden ocurrir:
Error Code | Descripción |
---|---|
INTERNAL_SERVER_ERROR | Ocurrió un error técnico durante el procesamiento |
CORE_PAYMENT_REFUND_FAILED | Ocurrió un error en el sistema de procesamiento de pagos |
Ejemplo de una respuesta de error:
{
"data": {
"refundPaymentCheckout": {
"errorCode": "FUNCTIONAL_ERROR",
"message": "AMOUNT_TOO_HIGH"
}
}
}