Cómo configurar pagos recurrentes en Authorize.net
Hemos escrito un artículo Aceptar pago con tarjeta de crédito mediante la pasarela de pago Authorize.net. En ese artículo, discutimos cómo se puede recibir un pago con tarjeta de crédito a través de Authorize.net. Además, ese artículo se centra básicamente en el pago único.
Pero, ¿qué pasa si alguien quiere integrar pagos recurrentes en su aplicación? En este artículo, le mostramos cómo configurar pagos recurrentes utilizando Authorize.net.
¿Qué es el pago recurrente?
El pago recurrente o de suscripción significa cargar automáticamente a la tarjeta de crédito una cantidad fija después de un intervalo específico y durante un período de tiempo específico.
Por ejemplo, digamos que está ejecutando su sitio web en el alojamiento Bluehost y ha pagado una cantidad durante el primer año. Cuando su plan expire, Bluehost cargará automáticamente el pago de su tarjeta de crédito para el próximo año (si ha elegido la opción de pago recurrente).
El beneficio de permitir el plan de suscripción es que no necesita recordar la fecha de vencimiento del servicio que está utilizando. El proveedor de servicios lo mantiene como un sistema automatizado. Una vez que su plan expiró, renuevan su servicio tomando pagos de su tarjeta de crédito en segundo plano.
Habiendo dicho eso, veamos cómo configurar pagos recurrentes usando Authorize.net.
Primero debe leer nuestro artículo Aceptar pago con tarjeta de crédito mediante la pasarela de pago Authorize.net. En ese artículo, hablamos sobre la instalación y configuración de las bibliotecas del SDK de Authorize.net.
Para nuestro tutorial, estamos usando la cuenta de sandbox. Por lo tanto, primero debe crear su cuenta de Sandbox y obtener sus claves API. Puede encontrar sus claves de API en Cuenta-> Credenciales y claves de API.
Instalación
Para comenzar, necesitamos instalar PHP SDK Library. Recomendamos Composer para instalar la biblioteca.
Cree un composer.json
archivo en el directorio raíz de su proyecto y agregue el siguiente código en él.
composer.json
{
"require": {
"php": ">=5.6",
"authorizenet/authorizenet": "~1.9.6"
}
}
Abra la terminal en el directorio raíz de su proyecto y ejecute el composer install
comando. Este comando descargará la dependencia de una biblioteca.
Configurar el entorno
Hemos instalado la biblioteca PHP SDK. Ahora cree dos archivos llamados constants.php
y subscriptionpayment.php
. En el archivo constants.php almacenamos nuestras claves API de la siguiente manera.
constants.php
<?php
define('ANET_LOGIN_ID', 'YOUR_LOGIN_ID');
define('ANET_TRANSACTION_KEY', 'YOUR_TRANSACTION_KEY');
?>
Asegúrese de haber reemplazado los marcadores de posición YOUR_LOGIN_ID y YOUR_TRANSACTION_KEY con valores reales.
subscriptionpayment.php
es el archivo donde escribiremos un código para los pagos de suscripción de una tarjeta de crédito. Para hacerlo primero, necesitamos incluir archivos centrales de la biblioteca.
subscriptionpayment.php
<?php
require_once "vendor/autoload.php";
require_once "constants.php";
use netauthorizeapicontractv1 as AnetAPI;
use netauthorizeapicontroller as AnetController;
?>
Código real para pagos recurrentes en Authorize.net
Authorize.net proporciona una biblioteca de código de muestra para referencia de los desarrolladores. Para nuestro tutorial, usamos la referencia de RecurringBilling.
Modificamos ligeramente el createSubscription
método del código de referencia y lo escribimos de la siguiente manera.
function createSubscription($arr_data = [])
{
extract($arr_data);
/* Create a merchantAuthenticationType object with authentication details
retrieved from the constants file */
$merchantAuthentication = new AnetAPIMerchantAuthenticationType();
$merchantAuthentication->setName(ANET_LOGIN_ID);
$merchantAuthentication->setTransactionKey(ANET_TRANSACTION_KEY);
// Set the transaction's refId
$refId = 'ref'. time();
// Subscription Type Info
$subscription = new AnetAPIARBSubscriptionType();
$subscription->setName("Sample Subscription");
$interval = new AnetAPIPaymentScheduleTypeIntervalAType();
$interval->setLength($intervalLength);
$interval->setUnit("days");
$paymentSchedule = new AnetAPIPaymentScheduleType();
$paymentSchedule->setInterval($interval);
$paymentSchedule->setStartDate(new DateTime($start_date));
$paymentSchedule->setTotalOccurrences($totalcycles);
//$paymentSchedule->setTrialOccurrences("1");
$subscription->setPaymentSchedule($paymentSchedule);
$subscription->setAmount($amount);
//$subscription->setTrialAmount("0.00");
$creditCard = new AnetAPICreditCardType();
$creditCard->setCardNumber($card_number);
$creditCard->setExpirationDate($expiry_date);
$payment = new AnetAPIPaymentType();
$payment->setCreditCard($creditCard);
$subscription->setPayment($payment);
$order = new AnetAPIOrderType();
$order->setInvoiceNumber(mt_rand(10000, 99999)); //generate random invoice number
$order->setDescription("Daily Subscription For 1 USD");
$subscription->setOrder($order);
$billTo = new AnetAPINameAndAddressType();
$billTo->setFirstName($first_name);
$billTo->setLastName($last_name);
$subscription->setBillTo($billTo);
$request = new AnetAPIARBCreateSubscriptionRequest();
$request->setmerchantAuthentication($merchantAuthentication);
$request->setRefId($refId);
$request->setSubscription($subscription);
$controller = new AnetControllerARBCreateSubscriptionController($request);
$response = $controller->executeWithApiResponse( netauthorizeapiconstantsANetEnvironment::SANDBOX);
if (($response != null) && ($response->getMessages()->getResultCode() == "Ok")) {
echo "SUCCESS: Subscription ID: ". $response->getSubscriptionId(). "n";
}
else
{
echo "ERROR : Invalid responsen";
$errorMessages = $response->getMessages()->getMessage();
echo "Response: ". $errorMessages[0]->getCode(). " " .$errorMessages[0]->getText(). "n";
}
return $response;
}
Observe la línea $response = $controller->executeWithApiResponse(netauthorizeapiconstantsANetEnvironment::SANDBOX);
del método anterior. Cuando pasamos a producción, debemos cambiar SANDBOX a PRODUCCIÓN en esta línea. También debemos cambiar nuestra identificación de inicio de sesión y las claves de transacción para que coincidan con nuestra cuenta real.
Nuestro método createSubscription
toma un parámetro de matriz que deberíamos construir a continuación.
$arr_subscription = [
'intervalLength' => 7, // Here 7 means recurring payment occurs after each 7 days
'start_date' => date('Y-m-d'),
'totalcycles' => 10, //Billing cycles. Here 10 means 10 transactions
'amount' => 1.00,
'card_number' => '4111111111111111',
'expiry_date' => '2020-12',
'first_name' => 'John',
'last_name' => 'Smith'
];
Estamos utilizando los números de tarjetas de crédito de prueba proporcionados en la Guía de prueba.
Al pasar la matriz anterior a la función createSubscription
, se creará un pago de suscripción de 1,00 USD después de cada 7 días hasta 10 ciclos de facturación.
Código final
subscriptionpaymen.phpt
<?php
require_once "vendor/autoload.php";
require_once "constants.php";
use netauthorizeapicontractv1 as AnetAPI;
use netauthorizeapicontroller as AnetController;
$arr_subscription = [
'intervalLength' => 7,
'start_date' => date('Y-m-d'),
'totalcycles' => 10,
'amount' => 1.00,
'card_number' => '4111111111111111',
'expiry_date' => '2020-12',
'first_name' => 'John',
'last_name' => 'Smith'
];
createSubscription($arr_subscription);
function createSubscription($arr_data = [])
{
extract($arr_data);
/* Create a merchantAuthenticationType object with authentication details
retrieved from the constants file */
$merchantAuthentication = new AnetAPIMerchantAuthenticationType();
$merchantAuthentication->setName(ANET_LOGIN_ID);
$merchantAuthentication->setTransactionKey(ANET_TRANSACTION_KEY);
// Set the transaction's refId
$refId = 'ref'. time();
// Subscription Type Info
$subscription = new AnetAPIARBSubscriptionType();
$subscription->setName("Sample Subscription");
$interval = new AnetAPIPaymentScheduleTypeIntervalAType();
$interval->setLength($intervalLength);
$interval->setUnit("days");
$paymentSchedule = new AnetAPIPaymentScheduleType();
$paymentSchedule->setInterval($interval);
$paymentSchedule->setStartDate(new DateTime($start_date));
$paymentSchedule->setTotalOccurrences($totalcycles);
//$paymentSchedule->setTrialOccurrences("1");
$subscription->setPaymentSchedule($paymentSchedule);
$subscription->setAmount($amount);
//$subscription->setTrialAmount("0.00");
$creditCard = new AnetAPICreditCardType();
$creditCard->setCardNumber($card_number);
$creditCard->setExpirationDate($expiry_date);
$payment = new AnetAPIPaymentType();
$payment->setCreditCard($creditCard);
$subscription->setPayment($payment);
$order = new AnetAPIOrderType();
$order->setInvoiceNumber(mt_rand(10000, 99999)); //generate random invoice number
$order->setDescription("Daily Subscription For 1 USD");
$subscription->setOrder($order);
$billTo = new AnetAPINameAndAddressType();
$billTo->setFirstName($first_name);
$billTo->setLastName($last_name);
$subscription->setBillTo($billTo);
$request = new AnetAPIARBCreateSubscriptionRequest();
$request->setmerchantAuthentication($merchantAuthentication);
$request->setRefId($refId);
$request->setSubscription($subscription);
$controller = new AnetControllerARBCreateSubscriptionController($request);
$response = $controller->executeWithApiResponse( netauthorizeapiconstantsANetEnvironment::SANDBOX);
if (($response != null) && ($response->getMessages()->getResultCode() == "Ok")) {
echo "SUCCESS: Subscription ID: ". $response->getSubscriptionId(). "n";
}
else
{
echo "ERROR : Invalid responsen";
$errorMessages = $response->getMessages()->getMessage();
echo "Response: ". $errorMessages[0]->getCode(). " " .$errorMessages[0]->getText(). "n";
}
return $response;
}
?>
Esperamos que comprenda cómo configurar pagos recurrentes en Authorize.net. Comparta sus pensamientos en la sección de comentarios a continuación.