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. Tokenización de la tarjeta de crédito o débito usando la librería Openpay.js
  3. Crear cliente
  4. Asosiación token de tarjeta con cliente
  5. 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 = Openpay::getInstance('mzdtln0bmtms6o3kck8f', 'sk_e568c42a6c384b7ab02cd47d2e407cab');

$planDataRequest = array(
    'amount' => 150.00,
    'status_after_retry' => 'cancelled',
    'retry_times' => 2,
    'name' => 'Plan Curso Verano',
    'repeat_unit' => 'month',
    'trial_days' => '30',
    'repeat_every' => '1',
    'currency' => 'MXN');

$plan = $openpay->plans->add($planDataRequest);
?>
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":"MXN",
     "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:
Agregar plan

Tokenización de la tarjeta

Para tokenizar una tarjeta del cliente utilizando la librería Openpay.js. Primero agregamos al head el archivo de Openpay.js y el archivo de JQuery:
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" src="https://js.openpay.mx/openpay.v1.min.js"></script>
​Luego asignamos a la librería de Openpay nuestro merchant-id y nuestra llave pública (public-key):
<script type="text/javascript">
     $(document).ready(function() {
            OpenPay.setId('mzdtln0bmtms6o3kck8f');
            OpenPay.setApiKey('pk_f0660ad5a39f4912872e24a7a660370c');
            OpenPay.setSandboxMode(true);
    });
</script>

Creación del token de tarjeta

Una vez que instalaste y configuraste la librería, para crear un token es necesario llamar al método OpenPay.token.create()
OpenPay.token.create(CREATE_PARAMETERS_OBJECT, SUCCESS_CALLBACK, ERROR_CALLBACK);
Los parámetros que recibe el método son:
  • El parámetro CREATE_PARAMETERS_OBJECT es un objeto Javascript que contiene la información de la tarjeta.
  • El parámetro SUCCESS_CALLBACK define la función que se llamará en caso de que la operación haya sido exitosa.
  • El parámetro ERROR_CALLBACK define la función que se llamará en caso de que la operación haya fallado.
Ejemplo de creación de token:
OpenPay.token.create({
      "card_number":"4111111111111111",
      "holder_name":"Juan Perez Ramirez",
      "expiration_year":"20",
      "expiration_month":"12",
      "cvv2":"110",
      "address":{
         "city":"Querétaro",
         "line3":"Queretaro",
         "postal_code":"76900",
         "line1":"Av 5 de Febrero",
         "line2":"Roble 207",
         "state":"Queretaro",
         "country_code":"MX"
      }
}, onSuccess, onError);
El método regresa un objeto tipo token del cual necesitaras posteriormente el id del token. La definición del objeto token la encontrarás aquí.
Para mayor referencia del uso de la librería ver la página de Openpay.js

Crear cliente

Bien, ahora crearemos al cliente que vamos a suscribir.
<?
$openpay = Openpay::getInstance('mzdtln0bmtms6o3kck8f', 'sk_e568c42a6c384b7ab02cd47d2e407cab');
$customerData = array(
     'name' => 'Mi cliente uno',
     'email' => 'micliente@gmail.com'
      )
   );

$customer = $openpay->customers->add($customerData);
?>
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"
}

Asociación del token de tarjeta al cliente

Ahora sólo resta usar el token_id que viene en la petición para guardar y asignar la tarjeta al cliente.
<? 
$cardData = array(
  'token_id' => $_POST["token_id"]
  'device_session_id' => $_POST["device_session_id"]
  );

$card = $customer->cards->add($cardData);
?>
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. Ejemplo de respuesta
{
   "type":"credit",
   "brand":"visa",
   "id":"kso4st83wxaibffyt6su",
   "card_number":"424242XXXXXX4242",
   "holder_name":"Juan Perez Ramirez",
   "expiration_year":"15",
   "expiration_month":"12",
   "allows_charges":true,
   "allows_payouts":false,
   "creation_date":"2014-02-12T10:57:09-06:00",
   "bank_name":"BANCOMER",
   "bank_code":"012",
   "customer_id":"a2b79p8xmzeyvmolqfja"
}
Notas: Puedes simular diferentes resultados usando las tarjetas de Pruebas

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 = Openpay::getInstance('mzdtln0bmtms6o3kck8f', 'sk_e568c42a6c384b7ab02cd47d2e407cab');

$subscriptionDataRequest = array(
    "trial_end_date" => "2014-01-01",
    'plan_id' => 'psjubnktzpofhakixfkp',
    'card_id' => 'kokzmiiwephcdmq1h2qr');

$customer = $openpay->customers->get('axapgwwolofnckfui2wx');
$subscription = $customer->subscriptions->add($subscriptionDataRequest);
?>
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