Antifraudes

Anti-Fraudes

Preguntas generales

¿Qué es la herramienta antifraudes?

Es la herramienta que Openpay proporcionan para la prevención de fraudes en cargos a tarjetas y se proporciona a todos los comercios registrados en Openpay por medio de la implementación de la librería openpay-data.js sin cargos extra por su uso.

¿Como funciona?

Una vez implementada la librería openpay-data.js en su página web o la librería de android/iOS, en cada transacción de cargo con tarjeta se aplicarán una series de reglas para saber si la transacción es fraudulenta o legítima.​ Todo el proceso se lleva a cabo en cuestión de milisegundos, haciéndolo casi invisible para sus clientes.

El avanzado conjunto de reglas que filtran las transacciones verifican varios factores incluyendo el número de tarjeta de crédito/débito, dirección de la tarjeta, correo electrónico e información del dispositivo de donde se está realizando el cargo.

¿Como la empiezo a usar?

Se tiene que implementar el uso de una librería de JavaScript si las transacciones de cargo son realizadas desde una página web. Si las transacciones son desde un dispositivo movil puede hacer uso de nuestros SDK’s para implementarla.

¿Que me responde el API cuando una transacción es marcada como fraudulenta?

En este caso el API responderá un objeto de error con los siguientes datos.

Respuesta:

{
    "category": "gateway",
    "description": "The card was declined by fraud system",
    "http_code": 402,
    "error_code": 3005,
    "request_id": "4fc452d8-5ddc-4464-ae70-e03569622850"
}    

¿Que puedo hacer si quiero que una transacción marcada como fraudulenta sea aprobada? No hay otra opción mas que decirle al cliente que vuelva a intentar el cargo con información de otra tarjeta.

Implementación con JavaScript

1.- Carga e inicialización

Con el siguiente código se carga la librería y se inicializar el valor para el device_session_id:

<script type='text/javascript' src="https://resources.openpay.co/openpay-data.v1.min.js"></script>
<script type="text/javascript">
  var deviceSessionId = OpenPay.deviceData.setup("formId", "deviceIdHiddenFieldName");
</script>
Nota: openpay-data.js depende de la libreria openpay.js. Cuida ejecutar primero el metodo setSandboxMode() de la libreria openpay.js y despues el metodo setup.

El parámetro formId, recibe el id del formulario que contiene la información del cargo que se enviara a tu servidor. Indica a la librería que en ese formulario es donde se va a agregar un campo oculto con el valor del device_session_id.

El parámetro deviceIdHiddenFieldName, recibe el nombre del campo oculto donde se asignara el device_session_id. Este dato es importante si piensas recuperar el valor del hidden y enviar mediante un submit.

Otra forma de manejar el valor del device_session_id es almacenarlo en una variable y posteriormente adjuntarlo a alguna petición tipo ajax. Este proceso es manual:

<script type='text/javascript' src="https://resources.openpay.co/openpay-data.v1.min.js""></script>
<script type="text/javascript">
  var deviceSessionId = OpenPay.deviceData.setup();
</script> 

2.- Manejo del lado del servidor

Cada vez que alguien entra en tu página o sitio, se recolectaran de forma transparente datos del dispositivo desde donde este accediendo, y se genera el device_session_id. Una vez que tu cliente realiza el cargo con tarjeta, asegurate de enviar a tu servidor, como parte de los datos de la transacción, el device_session_id.

Una vez que los datos hayan llegado a tu servidor, envia el device_session_id como parte de la petición a los servidores de openpay, como se muestra a continuación:

<?php
$openpay = Openpay::getInstance('merchant_id', 'private_key');

$chargeData = array(
    'method' => 'card',
    'source_id' => $_POST["source_id"],
    'amount' => (float)$_POST["amount"],
    'currency' => $_POST["currency"],
    'description' => $_POST["description"],
    'order_id' => 'ORDEN-00071',
    'device_session_id' => $_POST["deviceIdHiddenFieldName"]
);

$charge = $openpay->charges->create($chargeData);
?>    

Para ver un ejemplo completo de como hacer un cargo, revisa el tutorial de cargos.

Implementación en Android

Descarga e instalación de la librería en: https://github.com/open-pay/openpay-android

La libreria openpay-android, permite usar la herramienta anti-fraudes de dos formas diferentes. La primera es usando la implementación que se proporciona por defecto y la segunda es creando una implementación propia. A continuación veremos como.

Antes de usar la herramienta anti-fraude desde tu proyecto android, es necesario que habilites los siguientes permisos en el archivo AndroidManifest.xml:​

<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission>

1.- Carga e inicialización

Usando la implementación del StatusListener por defecto, con el siguiente código se carga la librería y se inicializar el valor para el device_session_id:

Openpay openpay = new Openpay("MERCHANT_ID", "PUBLIC_API_KEY", productionMode);
String deviceSessionId = openpay.getDeviceCollectorDefaultImpl()
    .setup(this.getActivity());
Nota El método setup requiere que se pase el activity desde el que se esta invocando. En caso de que se invoque desde un fragment, se puede recuperar el objeto activity invocando el método fragment.getActivity().

2.- Manejo del lado del servidor

Al momento de procesar el pago desde el dispositivo android, asegúrese de mandar a sus servidores el device_session_id y posteriormente enviarlo como parte de la invocación a nuestra api.

CreateCardChargeParams charge = new CreateCardChargeParams()
                .cardId(this.registeredCard.getId())
                .amount(amount)
		.currency(currency)
                .description(desc)
                .orderId(orderId)
                .capture(false)
                .deviceSessionId(deviceSessionId);
        Charge transaction = this.api.charges().create(charge);    

Parámetros adicionales

a) Configuración de timeout

long millis=300000; //5 min
openpay.getDeviceCollectorDefaultImpl().setCancelSetupTime(millis);

b) Obtener Errores

String errors = openpay.getDeviceCollectorDefaultImpl().getErrorMessage();
Log.d(this.getClass().getName(), errors);

Implementación en iOS

Descarga e instalación de la librería en: https://github.com/open-pay/openpay-ios

1.- Carga e inicialización

Crear una instancia de la clase Openpay y llamar al método createDeviceSessionId

Openpay *openpayAPI = [[Openpay alloc] initWithMerchantId:MERCHANT_ID
                                                   apyKey:API_KEY
                                         isProductionMode:NO];

NSString
*sessionId= [openpayAPI createDeviceSessionId];

Nota Crea la variable de Openpay a nivel de la clase y no a nivel de método.

Errores

Errores

Openpay siempre regresa objetos de JSON en las respuestas del servicio, incluso en caso de errores por lo que cuando exista un error recibirás el siguinte objeto error.

Objeto Error

Campo Tipo Descripción
category string La categoria general del error.
  • request: Indica un error causado por datos enviados por el cliente. Por ejemplo, una petición inválida, un intento de una transacción sin fondos, o una transferencia a una cuenta que no existe.
  • internal: Indica un error del lado de Openpay, y ocurrira muy raramente.
  • gateway: Indica un error durante la transacción de los fondos de una tarjeta a la cuenta de Openpay o de la cuenta hacia un banco o tarjeta.
error_code numeric El código del error de Openpay indicando el problema que ocurrió.
description string El detalle del error.
http_code string Código de error HTTP de la respuesta.
request_id string Identificador de la petición.

Ejemplo:

{
    "category" : "request",
    "description" : "The customer with id 'm4hqp35pswl02mmc567' does not exist",
    "http_code" : 404,
    "error_code" : 1005,
    "request_id" : "1981cdb8-19cb-4bad-8256-e95d58bc035c"
}

Códigos de Error

Generales

Código Error HTTP Mensaje Causa
1000 500 Internal Server Error Internal server error, contact support Ocurrió un error interno en el servidor de Openpay
1001 400 Bad Request Bad Request El formato de la petición no es JSON, los campos no tienen el formato correcto, o la petición no tiene campos que son requeridos.
1002 401 Unauthorized The api key or merchant id are invalid La llamada no esta autenticada o la autenticación es incorrecta.
1003 422 Unprocessable Entity Parameters look valid but request failed La operación no se pudo completar por que el valor de uno o más de los parametros no es correcto.
1004 503 Service Unavailable The resource is unavailable at this moment. Please try again later Un servicio necesario para el procesamiento de la transacción no se encuentra disponible.
1005 404 Not Found The requested resource doesn’t exist Uno de los recursos requeridos no existe.
1006 409 Conflict The order_id has already been processed Ya existe una transacción con el mismo ID de orden.
1007 402 Payment Required Operation rejected by processor La transferencia de fondos entre una cuenta de banco o tarjeta y la cuenta de Openpay no fue aceptada.
1008 423 Locked The account is inactive The account is inactive
1009 413 Request Entity too large The request is too large El cuerpo de la petición es demasiado grande.
1010 403 Forbidden Method not allowed for public API key, use private key instead Se esta utilizando la llave pública para hacer una llamada que requiere la llave privada, o bien, se esta usando la llave privada desde JavaScript.
1011 404 Not Found The resource was previously deleted Se solicita un recurso que esta marcado como eliminado.
1012 412 Precondition failed The transaction amount exceeds your allowed transaction limit El monto transacción esta fuera de los limites permitidos.
1013 412 Precondition failed The operation is not allowed on the resource La operación no esta permitida para el recurso.
1014 401 Unauthorized Your account is inactive, please contact to soporte@openpay.mx for more information La cuenta esta inactiva.
1015 504 Gateway timeout Could not get any response from gateway. Please try again later No se ha obtenido respuesta de la solicitud realizada al servicio.
1016 409 Conflict The merchant email has been already processed El mail del comercio ya ha sido procesada.
1017 502 Bad Gateway The payment gateway is not available at the moment, please try again later El gateway no se encuentra disponible en ese momento.
1018 402 Payment Required The number of retries of charge is greater than allowed El número de intentos de cargo es mayor al permitido.
1020 400 Bad Request The number of decimal digits is not valid for this currency El número de dígitos decimales es inválido para esta moneda

Almacenamiento

Código Error HTTP Mensaje Causa
2001 409 Conflict The bank account already exists La cuenta de banco con esta CLABE ya se encuentra registrada en el cliente.
2003 409 Conflict The external_id already exists El cliente con este identificador externo (External ID) ya existe.
2004 422 Unprocessable Entity The card number verification digit is invalid El dígito verificador del número de tarjeta es inválido de acuerdo al algoritmo Luhn.
2005 400 Bad Request The expiration date has expired La fecha de expiración de la tarjeta es anterior a la fecha actual.
2006 400 Bad Request The CVV2 security code is required El código de seguridad de la tarjeta (CVV2) no fue proporcionado.
2007 412 Precondition Failed The card number is only valid in sandbox El número de tarjeta es de prueba, solamente puede usarse en Sandbox.
2008 412 Precondition Failed The card is not valid for points La tarjeta no es valida para puntos Santander.
2009 412 Precondition Failed The CVV2 security code is invalid El código de seguridad de la tarjeta (CVV2) es inválido.
2010 402 Payment Required 3D Secure authentication failed Autenticación 3D Secure fallida.
2011 422 Unprocessable Entity Card product type not supported Tipo de tarjeta no soportada

Tarjetas

Código Error HTTP Mensaje Causa
3001 402 Payment Required The card was declined by the bank La tarjeta fue declinada por el banco.
3002 402 Payment Required The card has expired La tarjeta ha expirado.
3003 402 Payment Required The card doesn’t have sufficient funds La tarjeta no tiene fondos suficientes.
3004 402 Payment Required The card was reported as stolen La tarjeta ha sido identificada como una tarjeta robada.
3005 402 Payment Required Fraud risk detected by anti-fraud system

Found in blacklist
La tarjeta ha sido rechazada por el sistema antifraude.

Rechazada por coincidir con registros en lista negra.
3006 412 Precondition Failed Request not allowed La operación no esta permitida para este cliente o esta transacción.
3009 402 Payment Required The card was reported as lost La tarjeta fue reportada como perdida.
3010 402 Payment Required The bank has restricted the card El banco ha restringido la tarjeta.
3011 402 Payment Required The bank has requested the card to be retained El banco ha solicitado que la tarjeta sea retenida. Contacte al banco.
3012 412 Precondition Failed Bank authorization is required for this charge Se requiere solicitar al banco autorización para realizar este pago.
3201 Merchant not authorized to use payment plan Merchant not authorized to use payment plan El número de afiliación no soporta pago a meses sin intereses.
3203 Invalid promotion for such card type Invalid promotion for such card type Promoción no válida para este tipo de tarjetas.
3204 Transaction amount is less than minimum for promotion Transaction amount is less than minimum for promotion El monto de la transacción es menor al mínimo permitido para esta promoción.
3205 El monto de la transacción es menor al mínimo permitido para esta promoción. Promotion not allowed Promoción no permitida.

Cuentas

Código Error HTTP Mensaje Causa
4001 412 Preconditon Failed There are not enough funds in the openpay account La cuenta de Openpay no tiene fondos suficientes.
4002 412 Preconditon Failed The operation can’t be completed until pending fees are paid La operación no puede ser completada hasta que sean pagadas las comisiones pendientes.

Webhooks

Código Error HTTP Mensaje Causa
6001 409 Conflict The webhook has already been processed El webhook ya ha sido procesado.
6002 412 Preconditon Failed Could not connect with webhook service, verify URL No se ha podido conectar con el servicio de webhook.
6003 502 Bad Gateway Service responded with an error on this moment. Please try again later El servicio respondio con errores.

Clientes

Clientes

Con la finalidad de cubrir las necesidades de varios de nuestros clientes Openpay cuenta con dos opciones de manejo de clientes, la elección del modo dependerá de las necesidades del negocio pues a partir del tipo de cliente, el manejo de los saldos de los clientes y del comercio se afectan de manera diferente, como se explica a continuación.

Clientes con cuenta

Un cliente con cuenta o saldo significa que si se realiza un cargo desde el cliente, el dinero se almacena en su cuenta y el propio cliente puede disponer de este para realizar transferencias o pagos, este esquema es útil para modelos de negocio donde el cliente final mantiene un saldo y puede realizar operaciones dentro de su sitio o aplicación.

Clientes tipo catálogo

Un cliente tipo catálogo dentro de Openpay únicamente sirve para registrar los datos del cliente que realizo la transacción pero el dinero siempre es enviado a la cuenta del comercio. Este esquema se recomienda para los modelos donde al cliente se realizan cobros y el dinero siempre se administra desde la cuenta del comercio.

Tabla de diferencias

A continuación se muestra una tabla comparativa de las diferencias en las operaciones para clientes con saldo y clientes sin saldo.

FuncionalidadCliente con cuentaCliente tipo catálogo
ConsultaMantiene la información de cliente completa.No contiene información sobre el saldo (balance) ni estado (status)
Tarjetas y cuentas bancariasEl cliente puede tener tarjetas y cuentas bancariasEl cliente puede tener tarjetas y cuentas bancarias
Cargos (tarjeta, tienda y banco)* Afecta el saldo del cliente
* La transacción se liga al cliente
* La transacción puede consultarse sólo desde el cliente
* Afecta al saldo del comercio
* La transacción se liga al comercio y al cliente
* La transacción puede consultarse desde el cliente o comercio
PagosPuede realizar pagos disponiendo del saldo en su cuentaNo se permite debido a que no dispone de saldo
TransferenciasPuede realizar transferencias a otros cliente disponiendo del saldoNo se permite debido a que no dispone de saldo
ComisionesSe pueden cobrar comisiones de su saldoNo se permite debido a que no dispone de saldo
SuscripcionesLas transacciones generadas del cobro por suscripciones solo pueden consultarse desde el comercioLas transacciones generadas del cobro por suscripciones se pueden consultar desde el comercio o desde el cliente

Búsquedas

Búsquedas

Openpay permite filtrar búsquedas de pagos, cargos, clientes, tarjetas, planes, suscripciones, comisiones y webhooks mediante el api, de la manera en la que se muestra en los enlaces.

Adicional a esto existen dos búsquedas especiales que pueden realizarse en base a los identificadores que el comercio generó y asoció en la plataforma de openpay, éstas son:

  • búsqueda de cargos en base al order_id
  • búsqueda de clientes mediante su external_id

Ambas se describen a continuación.

Buscar cargos por order_id

Recordemos que éste atributo fue proporcionado por el comercio cuando creó el cargo en openpay, y es un valor único para dicho comercio. Para este ejemplo vamos a buscar un cargo al cual se identifica como my-oid-984789.

@openpay = OpenpayApi.new("mzdtln3bqtms6o7kck9q","sk_e568c42a6c384b9ab02cd47d2e401cab")
@charges = @openpay.create(:charges)

request_hash = {
     "orderId" => "my-oid-984789"
   }

response_hash = @charges.all(request_hash.to_hash)

Si la llamada es correcta y encuentra dicho cargo, entonces se regresará un respuesta con un objeto transaccion representado de acuerdo al lenguaje de la librería utilizada.

Respuesta:


[
  {
     "id":"tryqihxac3msedn2pqed",
      "amount":100.00,
      "authorization":"801585",
      "method":"card",
      "operation_type":"in",
      "transaction_type":"charge",
      "card":{
         "type":"debit",
         "brand":"visa",
         "address":null,
         "card_number":"411111XXXXXX1111",
         "holder_name":"Juan Perez Ramirez",
         "expiration_year":"20",
         "expiration_month":"12",
         "allows_charges":true,
         "allows_payouts":true,
         "bank_name":"BBVA",
         "bank_code":"002"
      },
      "status":"completed",
      "currency":"COP",
      "creation_date":"2019-05-26T14:00:17-05:00",
      "operation_date":"2019-05-26T14:00:17-05:00",
      "description":"Cargo inicial a mi cuenta",
      "error_message":null,
      "order_id":my-oid-984789,
      "customer_id":"ag8nktpdzebjiye1twzi"
  }
]                    

Buscar clientes por external_id

Recordemos que éste atributo fue proporcionado por el comercio cuando creó al cliente en openpay, y es un valor único para dicho comercio. Para este ejemplo vamos a buscar un cliente al cual se identifica como myClient001.

@openpay = OpenpayApi.new("mzdtln3bqtms6o7kck9q","sk_e568c42a6c384b9ab02cd47d2e401cab")
@customers = @openpay.create(:customers)

request_hash ={
     "externalId" => "myClient001"
   }

response_hash = @customers.all(request_hash.to_hash)  

Si la llamada es correcta y encuentra dicho cliente, entonces se regresará un respuesta con un objeto cliente representado de acuerdo al lenguaje de la librería utilizada.

Respuesta:

[
  {
     "id": "ag8nktpdzebjiye1twzi",
     "name": "customer name",
     "last_name": "customer last name",
     "email":"customer_email@me.co",
     "phone_number": "(385) 937-467",
     "address": {
        "line1": "CARRERA BULNES 3403",
        "line2": "Esq. JIMENEZ",
        "line3": "Entre la calle SERGIO ZEPEDA y JULIO MENESES",
        "state": "Bogotá",
        "city": "Bogotá",
        "postal_code": "110831",
        "country_code": "CO"
     },
     "creation_date": "2019-08-12T14:11:23-05:00",
     "external_id": "myClient001",
     "clabe": null
  }
]

Pagos con PSE

Pagos con PSE

El propósito de esta guía es explicar paso a paso cómo realizar un pago a través de PSE.

Flujo para realizar cargos con PSE

Pasos:

  1. El comercio ingresa al Dashboard e ingresa a la opción Cobrar con Openpay, En esta vista, puede buscar su cliente existente o lo puede registrar por primera vez, posteriormente completa el formulario y confirma el envío.
  2. Openpay genera un Link de cobro que se despliega en Dashboard, el cual si desea lo puede compartir por correo
  3. El cliente navega al Link de cobro
  4. Se mostrará una página Checkouts con las Opciones de Pago
  5. El cliente selecciona el método de Pago PSE y da clíc en botón Completar Pago
  6. Se mostrará formulario de Pago PSE: Ud. debe seleccionar:
    1. Tipo de banco
    2. Tipo de persona
    3. Tipo de documento de identificación
    4. Número de identificación
  7. Posteriormente el cliente le da clíc en botón Pagar y luego en botón Continuar
  8. Con los datos obtenidos, Openpay se comunica con ACH – PSE, Al cliente se le mostrará la página de ACH PSE para que ingrese su usuario, y le da clíc en botón Continuar
  9. ACH – PSE entrega una respuesta a Openpay con el CUS (Código Único de Seguimiento)
  10. Luego se mostrará la página del Recibo / Estatus Actual de la transacción.

En esta guía veremos los pasos relevantes.

Completar Formulario de Cobrar con Openpay (Paso 1)

Para poder recibir un pago a través de un banco es necesario crear un cargo, en el cual se solicitará la información del cliente que desea realizar el Pago.

Posteriormente se confirma la información, y se navega al ‘Link de Cobro’ generado.

Checkouts con Opciones de Pago (Paso 4)

Se muestran las diversas opciones de pago a tu cliente, el debe escoger la opción: PSE (Cuentas de ahorro y corriente).

Transferencia Bancaria PSE (Paso 6)

El cliente debe completar el formulario y dar clic en Pagar, luego Continuar, con el cual continuará el flujo.

Recibo y/o estatus de la transacción (Paso 10)

El cliente sabrá si la transacción es exitosa o podrá consultar su estatus.

Notas:

Una vez que el cliente haya realizado el pago o la transacción se haya cancelado el Link de cobro ya no se mostrará.

  • Implementa las Notificaciones para conocer el estado de los pagos en tiempo real

Pagos en Tiendas

Pagos en Tiendas

El objetivo de esta guía es explicar paso a paso como generar referencias de pago para tiendas, mediante las cuales tus clientes podrán realizar pagos en alguna de las tiendas de conveniencia afiliadas.

Nota: Mediante el uso de este método de pago podrás recibir notificaciones minutos despues que tu cliente realice el pago en la tienda de conveniencia.

Flujo para realizar cargos en tienda:

Pasos:

  1. El cliente confirma la compra en tu sitio web seleccionando como medio de pago tienda
  2. Desde tu servidor se crea una referencia creando un cargo en Openpay
  3. Con los datos obtenidos al crear la referencia se crea un recibo de pago personalizado
  4. El cliente acude a alguna de las tiendas y realiza el pago
  5. Openpay valida y recibe el pago
  6. Openpay notifica la recepción del pago a tu servidor

En esta guía veremos los pasos número 2 y 3, para el paso número 6 consulta la sección de notificaciones

Crear cargo (Paso 2)

Para poder recibir un pago en una tienda es necesario que generes un código de barras que contiene la referencia con la cual tu cliente puede ir a la tienda a pagar.

Para ello debes realizar una llamada a nuestra API de la siguiente manera:

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@charges = @openpay.create(:charges)
request_hash ={
     "method" => "store",
     "amount" => 100.00,
     "currency" => "COP",
     "iva" => "10",
     "description" => "Cargo con tienda"
   }

response_hash = @charges.create(request_hash.to_hash)                    
Nota: El monto máximo que se permite para este tipo de cargos es de $ 9,999.00 COP Si la llamada es correcta recibirás una respuesta con el número de referencia generado y la URL del código de barras para que puedas crear tu recibo.

Respuesta:

{
    "id": "trgklldjutbqv9gqzyn9",
    "authorization": null,
    "operation_type": "in",
    "method": "store",
    "transaction_type": "charge",
    "status": "in_progress",
    "conciliated": false,
    "iva": "16",
    "creation_date": "2019-11-04T11:13:16-06:00",
    "operation_date": "2019-11-04T11:13:16-06:00",
    "description": "Cargo inicial a mi cuenta de store",
    "error_message": null,
    "order_id": "oid-20191104111316",
    "payment_method": {
        "type": "store",
        "reference": "1010101389264548",
        "barcode_url": "https://sandbox-api.openpay.co/barcode/1010101389264548?width=1&height=45&text=false"
    },
    "currency": "COP",
    "amount": 226,
    "customer": {
        "name": "Ambrosio",
        "last_name": "Medina",
        "email": "ambrosio.medina@company.co",
        "phone_number": "571983873734",
        "address": null,
        "creation_date": "2019-11-04T11:13:16-06:00",
        "external_id": null,
        "customer_address": {
            "department": "Medellín",
            "city": "Antioquia",
            "additional": "Avenida 7r bis #144-28 Apartamento 423",
            "country": "CO"
        },
        "clabe": null
    }
}
Sandbox: El pago puedes simularlo desde el dashboard, de esta manera puedes recibir una notificación de pago en tu sistema mediante un Webhook. Producción: La notificación de pago se realiza en tiempo real, es decir en el momento que tu cliente realice el pago en la tienda podrás recibir un Webhook y el saldo en tu cuenta se verá incrementado.

Para mas información consulta la referencia de cargos

Recibo de pago (Paso 3)

Openpay brinda la posibilidad de obtener un recibo de pago con la información necesaria para que tu cliente pueda realizar el pago en tienda, para llegar a él, basta con estructurar una ruta compuesta de la siguiente manera:

{DASHBOARD_PATH}/paynet-pdf/{MERCHANT_ID}/{REFERENCE}

Sandbox: {DASHBOARD_PATH} = https://sandbox-dashboard.openpay.co

Producción: {DASHBOARD_PATH} = https://dashboard.openpay.co

{MERCHANT_ID} = tu id de comerciante

{TRANSACTION_ID} = valor del campo payment_method.reference del objeto transacción regresado al crearse el cargo

Crear Recibo de pago personalizado (Paso 3.1 Opcional)

Si decides no usar el recibo que ofrece Openpay puedes generarlo tu mismo, básicamente puedes crearlo con cualquier diseño y colores, pero debe incluir:

  • Nombre del servicio a pagar
    • Pago en Tienda
  • Referencia:
    • Valor del campo reference
  • Código de barras:
    • Imagen del campo barcode_url
  • Monto a pagar:
    • Valor del campo amount
Notas: Asegúrate que tu integración cumple con los requisitos de compatibilidad de versiones más detalles
  • Implementa las Notificaciones para conocer el estado de los pagos en tiempo real

Suscripciones

Suscripciones

Para esta guía vamos a ver como crear una suscripción para cobrar un servicio a un cliente de manera periódica.

Digamos que tienes un servicio en el cual ofreces 1 mes de prueba y después cobras una renta mensual de $99.99 pesos indefinidamente (o hasta que tu cliente cancele el servicio).

Para ello vamos a hacer lo siguiente:

  1. Crear plan
  2. Crear cliente
  3. Guardar la tarjeta
  4. Suscribir al cliente

Crear plan

Un plan es un plantilla para una suscripción que contiene el costo, frecuencia de cobro, número de días de prueba, etc.

Para crear un plan tenemos dos opciones:

Opción 1.- Creación desde la API

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@plans = @openpay.create(:plans)
request_hash ={
     "name" => "Plan Curso Verano",
     "amount" => 150.00,
     "repeat_every" => "1",
     "repeat_unit" => "month",
     "retry_times" => 2,
     "status_after_retry" => "cancelled",
     "trial_days" => "30"
   }

response_hash = @plans.create(request_hash.to_hash) 

Puedes tener cuantos planes desees. Por ejemplo puedes tener un plan Oro, Platino y Bronce para diferentes niveles de servicio.

Si la llamada es correcta tendremos una respuesta que contiene el id del plan

Respuesta:

{
     "name":"Servicio de TV",
     "status":"active",
     "amount":99.99,
     "currency":"COP",
     "id":"psjubnktzpofhakixfkp",
     "creation_date":"2014-02-14T13:47:55-06:00",
     "repeat_every":1,
     "repeat_unit":"month",
     "retry_times":2,
     "status_after_retry":"cancelled",
     "trial_days":30
  } 

Para más información de los parámetros del plan dirígete a “Agregar Plan”.

Opción 2.- Creacion desde el dashboard

Puedes crear planes también desde el dashboard en Planes -> Agregar:

Crear cliente

Bien, ahora crearemos al cliente que vamos a suscribir.

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@customers = @openpay.create(:customers)
request_hash ={
     "name" => "Mi cliente uno",
     "email" => "micliente@gmail.com"
   }

response_hash = @customers.create(request_hash.to_hash)

Respuesta:

{
   "id":"axapgwwolofnckfui2wx",
   "name":"Mi cliente uno",
   "last_name":null,
   "email":"micliente@gmail.com",
   "phone_number":null,
   "status":"active",
   "balance":0,
   "clabe":"646180109400138692",
   "address":null,
   "creation_date":"2014-02-14T12:30:09-06:00"
}   

Guardar tarjeta

Lo siguiente es guardar la tarjeta que el cliente va a usar para la suscripción. Para ello vamos a ocupar el id del cliente (axapgwwolofnckfui2wx) creado anteriormente.

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@cards = @openpay.create(:cards)
request_hash ={
     "holder_name" => "Mi cliente uno",
     "card_number" => "4111111111111111",
     "cvv2" => "110",
     "expiration_month" => "12",
     "expiration_year" => "20"
   }

response_hash = @cards.create(request_hash.to_hash, "axapgwwolofnckfui2wx")

Respuesta:

{
   "type":"debit",
   "brand":"visa",
   "address":null,
   "id":"kokzmiiwephcdmq1h2qr",
   "card_number":"1111",
   "holder_name":"Mi cliente uno",
   "expiration_year":"20",
   "expiration_month":"12",
   "allows_charges":true,
   "allows_payouts":true,
   "creation_date":"2014-02-14T13:42:25-06:00",
   "bank_name":"Banamex",
   "customer_id":"axapgwwolofnckfui2wx",
   "bank_code":"002"
}  

Suscribir al cliente

Por ultimo crearemos la suscripción con el id de plan (psjubnktzpofhakixfkp), el id del cliente (axapgwwolofnckfui2wx) y el id de tarjeta (kokzmiiwephcdmq1h2qr), con lo cual la petición quedaría así:

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@subscriptions = @openpay.create(:subscriptions)
request_hash ={
     "plan_id" => "psjubnktzpofhakixfkp",
     "trial_end_date" => "2014-01-01",
     "source_id" => "kokzmiiwephcdmq1h2qr"
   }

response_hash = @subscriptions.create(request_hash.to_hash, "axapgwwolofnckfui2wx")

Respuesta:

{
   "status":"trial",
   "card":{
      "type":"debit",
      "brand":"visa",
      "address":null,
      "id":"kokzmiiwephcdmq1h2qr",
      "card_number":"1111",
      "holder_name":"Mi cliente uno",
      "expiration_year":"20",
      "expiration_month":"12",
      "allows_charges":true,
      "allows_payouts":true,
      "creation_date":"2014-02-14T13:42:25-06:00",
      "bank_name":"Banamex",
      "customer_id":"axapgwwolofnckfui2wx",
      "bank_code":"002"
   },
   "id":"sfquvei5ya0lwdrd5blo",
   "cancel_at_period_end":false,
   "charge_date":"2014-03-15",
   "creation_date":"2014-02-14T13:48:59-06:00",
   "current_period_number":0,
   "period_end_date":"2014-03-14",
   "trial_end_date":"2014-03-14",
   "plan_id":"psjubnktzpofhakixfkp",
   "customer_id":"axapgwwolofnckfui2wx"
}

Listo ya tenemos nuestra suscripción creada, la cual se va a cobrar automáticamente cada mes por $99.99 después de que los días de pruebas transcurran.

Notas:

  • Puedes simular diferentes resultados usando las tarjetas de Pruebas
  • Implementa las Notificaciones para conocer el estado de los pagos en tiempo real

OneClick

OneClick

En la guía de cargo con token vimos como realizar un cargo creando primero un token (usando Openpay.js) y luego enviarlo dentro de la petición de cargo.

Esto es muy útil para cuando un cliente llega a nuestro sitio y solo deseamos realizarle el cargo en ese momento, pero cuando deseamos mantener los datos de la tarjeta, para que el cliente la pueda ocupar en múltiples ocasiones sin necesidad de volverla a introducir los datos, lo tenemos que hacer es guardar la tarjeta para posteriormente poder utilizarla sin necesidad de volverla a pedir al cliente.

Los pasos para realizar esto son:

  1. Crear formulario para pedir los datos
  2. Crear un token
  3. Crear un cliente
  4. Guardar la tarjeta al cliente usando el token
  5. Crea un cargo usando el token

Crear formulario para pedir los datos

Primero crearemos el formulario para pedir la información de nuestro cliente (nombre y correo electrónico) y los datos de su tarjeta (número, fecha de expiración, etc).

Es muy importante que los campos en donde se va a introducir la información de la tarjeta tenga el atributo data_openpay_card ​ya que esto permitirá a la librería de Openpay encontrar la información.

Observa que para los datos de la tarjeta no se está ocupando el atributo name esto para que al momento de enviar el formulario a tu servidor los datos de la tarjeta no viajen en la petición ya que sólo los vamos a ocupar para crear el token.

Crear un token

Una vez que tenemos nuestro formulario creado, vamos a programar que en el botón de enviar se cree un token utilizando la librería Openpay.js.

Primero agregamos al head el archivo de Openpay.js y el archivo de JQuery:

​Luego asignamos a la librería de Openpay nuestro merchant-id y nuestra llave pública (public-key):

Y por último atrapamos el evento de clic del botón Save para que en lugar de que haga el submit del formulario realice la función tokenize de la tarjeta:

Como puedes ver estamos pasando como parámetro el nombre del formulario creado, esto para que la librería obtengan los datos de la tarjeta y haga la petición a Openpay.

Si todo sale bien se llamará el método success_callback en el cual asignaremos el valor id del token creado al campo token_id y enviaremos los datos al servidor:

Si existe un problema en la llamada mostramos el error en un alert:

Para mayor referencia del uso de la librería ver la página de Openpay.js

Crear un cliente

Ya en tu servidor en la implementación de la página /save_customer_card realizaremos lo siguiente para crear al cliente:

Nota: Observa que para este ejemplo, creamos el cliente usando la bandera de de requires_account = false​ lo cual significa que la cuenta no manejará saldo propio.

Para mas información acerca de los tipos de clientes consulta la guía de clientes

Guardar la tarjeta al cliente usando el token

Ahora sólo resta usar el token_id que viene en la petición para guardar y asignar la tarjeta al cliente.

El objeto card contiene un id, el cual debes guardar en tu servidor ya con el podrás hacer cargos a esa tarjeta después. Puedes consultar la referencia de Crear Tarjeta con Token para mas información. ​

Notas:

  • Puedes simular diferentes resultados usando las tarjetas de Pruebas

Redireccionamiento

Redireccionamiento

Otra forma de hacer cargos con tarjeta sin la necesidad de implementar un formulario de pago en tu sitio, es mediante la utilización de un formulario que Openpay proporciona.

Resumen de pasos:

  1. Crear un cargo que contenga el atributo confirm en false y una url a la cual direccionar una vez concluido el pago.
  2. En base a la respuesta del cargo creado, redirigir al usuario a la url contenida en el objeto payment_method regresado.
  3. Que el cliente llene la información solicitada y realize el pago en el formulario.
  4. Si el pago fué exitoso dar clic en el botón continuar.
  5. El pago está hecho.

Creación del cargo

Ejemplo de creación de un cargo utilizando el formulario de pago de Openpay.

@openpay = OpenpayApi.new("mzdtln0bmtms6o3kck8f","sk_e568c42a6c384b7ab02cd47d2e407cab")
@charges = @openpay.create(:charges)
customer_hash = {
    "name" => "Mario",
    "last_name" => "Benedetti Farrugia",
    "phone_number" => "1111111111",
    "email" => "mario_benedetti@miempresa.co"
}

request_hash = {
    "method" => "card",
    "amount" => 100.00,
    "description" => "Cargo inicial a mi merchant",
    "order_id" => "oid-00051",
    "customer" => customer_hash,
    "send_email" => false,
    "confirm" => false,
    "redirect_url" => "/index.html"
}

response_hash = @charges.create(request_hash.to_hash)  

Redirigir al formulario de Openpay

Si la llamada es correcta entonces se regresará una respuesta con un objeto transacción. en estado pendiente representado en el lenguaje utilizado.

Respuesta:

{
  "id": "trq7yrthx5vc4gtjdkwg",
  "authorization": null,
  "method": "card",
  "operation_type": "in",
  "transaction_type": "charge",
  "status": "charge_pending",
  "conciliated": false,
  "creation_date": "2016-09-09T18:52:02-05:00",
  "operation_date": "2016-09-09T18:52:02-05:00",
  "description": "Cargo desde terminal virtual de 111",
  "error_message": null,
  "amount": 111,
  "currency": "COP",
  "payment_method": {
    "type": "redirect",
    ***"url": "https://sandbox-api.openpay.co/v1/mexzhpxok3houd5lbvz1/charges/trq7yrthx5vc4gtjdkwg/card_capture"***
  },
  "customer": {
    "name": "Mario",
    "last_name": "Benedetti Farrugia",
    "email": "mario_benedetti@miempresa.co",
    "phone_number": "1111111111",
    "creation_date": "2016-09-09T18:52:02-05:00",
    "clabe": null,
    "external_id": null
  }
}   

Redirigir al usuario a la url contenida en el atributo url que se encuentra dentro del objeto payment_method.

Formulario Openpay

Llenar datos de pago

Que el usuario llene los datos solicitados y de clic en Realizar Pago

Nota: Hay recursos como charges, payouts, cards, bank_accounts que están disponibles para los dos tipos de cuenta, por lo que debes tener cuidado al momento de hacer la llamada cual estás afectando.

Dar clic en Continuar

Si el pago fué exitoso que el usuario de clic en Continuar

Esto redirecciona a la url que se proporcionó al crear el cargo (en el caso del ejemplo la página de Openpay) dando por terminado el flujo del pago.

Notas:

  • Puedes simular diferentes resultados usando las tarjetas de Pruebas
  • Implementa las Notificaciones para conocer el estado de los pagos en tiempo real

Cargo con token

Cargo con tarjeta tokenizada

A todos nos gusta recibir pagos, es por ello empezaremos con un guía para ver la forma de hacerlo.

Esta guía hace uso de la librería de Openpay.js, para enviar la información de la tarjeta directamente a Openpay. Usando esta librería aparte de ser la forma más sencilla de guardar una tarjeta permite minimizar el alcance de una certificación PCI Compliance.

Flujo para realizar cargos a tarjeta:

Pasos:

  1. Implementación del sistema antifraude generando un “device_session_id”
  2. Tokenización de la tarjeta de crédito o débito usando la librería Openpay.js
  3. Toda la información de la compra se envía a tu servidor
  4. Desde tu servidor se crea el cargo en Openpay
  5. Openpay envía la instrucción de cargo al banco emisor y regresa la respuesta

Creación del formulario

Para pedirle al usuario la información de la tarjeta y poder realizar los pasos 1 y 2 es necesario tener un formulario indicándole al cliente las tarjetas soportadas y que el pago será vía Openpay.

Código del formulario.

El HTML completo del formulario lo puedes descargar aquí

Es muy importante que los campos en donde se va a introducir la información de la tarjeta tenga el atributo data_openpay_card ​ya que esto permitirá a la librería de Openpay encontrar la información.

Observa que para los datos de la tarjeta no se está ocupando el atributo name esto para que al momento de enviar el formulario a tu servidor los datos de la tarjeta no viajen en la petición ya que sólo los vamos a ocupar para crear el token.

En el formulario de ejemplo anterior no se incluyen los campos “amount” y “description” pero deberan incluirse al hacer el submit al servidor.

Sistema antifraude (Paso 1)

Con el siguiente código se cargan las librerías necesarios para la generación del id de dispositivo:

Con el siguiente código se inicializa el valor para el device_session_id:

El parámetro payment-form, recibe el id del formulario que contiene la información del cargo que se enviara a tu servidor. Indica a la librería que en ese formulario es donde se va a agregar un campo oculto con el valor del device_session_id.

El parámetro deviceIdHiddenFieldName, recibe el nombre del campo oculto donde se asignara el device_session_id. Este dato es importante si piensas recuperar el valor del hidden y enviar mediante un submit.

Tokenización y envío de datos (Paso 2 y 3)

Una vez que tenemos nuestro formulario creado, vamos a programar que en el botón de enviar se cree un token utilizando la librería Openpay.js.

Primero agregamos al head el archivo de Openpay.js y de JQuery:

​Luego asignamos a la librería de Openpay nuestro merchant-id y nuestra llave pública (public-key):

Y por último atrapamos el evento de clic del botón “Pagar” para que en lugar de que haga el submit del formulario realice la función “tokenize” de la tarjeta:

Como puedes ver estamos pasando como parámetro el nombre del formulario creado, esto para que la librería obtengan los datos de la tarjeta y haga la petición a Openpay.

Si todo sale bien se llamará el método success_callback en el cual asignaremos el valor id del token creado al campo token_id y enviaremos los datos al servidor:

Si existe un problema en la llamada mostramos el error en un alert:

Para mayor referencia del uso de la librería consulta la página de Openpay.js

Crear cargo (Paso 4 y 5)

Ahora sólo resta hacer el cargo desde tu servidor, para esto crearemos una instancia de Openpay con el merchant-id y el private-key y luego con los valores del formulario haremos el cargo:

¡¡Listo!! Ya tenemos un cargo creado con tarjeta.

Si existiera un error recibiríamos una excepción la cual debemos capturar y manejar, para mas información consulta la seccion de errores

Notas:

  • Los campos amount, currency, description, etc.. que no están en el formulario de ejemplo, son datos propios de tu aplicación que deben haberse obtenido antes del formulario de pago.
  • Si deseas ver como realizar el procedimiento en otro lenguaje consulta nuestra sección de integración.
  • El código HTML completo se encuentra aquí. (La página no funciona completamente, deberás descargarla y realizar la implementación del POST en tu servidor).
  • Asegúrate que tu integración cumple con los requisitos de compatibilidad de versiones más detalles
  • Puedes simular diferentes resultados usando las tarjetas de Pruebas
  • Implementa las Notificaciones para conocer el estado de los pagos en tiempo real