Como configurar pagamentos recorrentes em Authorize.net
Escrevemos um artigo Aceitar pagamento com cartão de crédito usando o gateway de pagamento Authorize.net. Nesse artigo, discutimos como se pode receber pagamentos com cartão de crédito por meio do Authorize.net. Além disso, esse artigo concentra-se basicamente no pagamento único.
Mas e se alguém quiser integrar pagamentos recorrentes em seu aplicativo? Neste artigo, mostramos como configurar pagamentos recorrentes usando Authorize.net.
O que é pagamento recorrente?
Pagamento recorrente ou de assinatura significa cobrar automaticamente no cartão de crédito um valor fixo após um intervalo específico e por um período de tempo especificado.
Por exemplo, digamos que você esteja executando o seu site na hospedagem Bluehost e tenha pago uma quantia no primeiro ano. Quando o seu plano expirar, a Bluehost cobrará automaticamente o pagamento do seu cartão de crédito no próximo ano (se você escolheu a opção de pagamento recorrente).
A vantagem de permitir o plano de assinatura é que você não precisa se lembrar da data de expiração do serviço que está usando. O provedor de serviços o mantém como um sistema automatizado. Assim que seu plano expirar, eles renovam seu serviço recebendo pagamentos de seu cartão de crédito em segundo plano.
Dito isso, vamos ver como configurar pagamentos recorrentes usando Authorize.net.
Você deve primeiro ler nosso artigo Aceitar pagamento com cartão de crédito usando o gateway de pagamento Authorize.net. Nesse artigo, discutimos sobre a instalação e configuração das bibliotecas do SDK do Authorize.net.
Para nosso tutorial, estamos usando a conta sandbox. Portanto, você deve primeiro criar sua conta Sandbox e obter suas chaves de API. Você pode encontrar suas chaves de API em Conta-> Credenciais e chaves de API.
Instalação
Para começar, precisamos instalar a biblioteca PHP SDK. Recomendamos o Composer para instalar a biblioteca.
Crie um composer.json
arquivo no diretório raiz do seu projeto e adicione o código abaixo nele.
composer.json
{
"require": {
"php": ">=5.6",
"authorizenet/authorizenet": "~1.9.6"
}
}
Abra o terminal no diretório raiz do seu projeto e execute o composer install
comando. Este comando irá baixar a dependência de uma biblioteca.
Configure o ambiente
Instalamos a biblioteca PHP SDK. Agora crie dois arquivos chamados constants.php
e subscriptionpayment.php
. No arquivo constants.php, armazenamos nossas chaves de API da seguinte maneira.
constants.php
<?php
define('ANET_LOGIN_ID', 'YOUR_LOGIN_ID');
define('ANET_TRANSACTION_KEY', 'YOUR_TRANSACTION_KEY');
?>
Certifique-se de ter substituído os marcadores YOUR_LOGIN_ID e YOUR_TRANSACTION_KEY por valores reais.
subscriptionpayment.php
é o arquivo onde escreveremos um código para pagamentos de assinatura de um cartão de crédito. Para fazer isso primeiro, precisamos incluir os arquivos principais da 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 pagamentos recorrentes em Authorize.net
Authorize.net fornece uma biblioteca de código de amostra para referência dos desenvolvedores. Para nosso tutorial, estamos usando a referência de RecurringBilling.
Modificamos ligeiramente o createSubscription
método do código de referência e o escrevemos da seguinte maneira.
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 a linha $response = $controller->executeWithApiResponse(netauthorizeapiconstantsANetEnvironment::SANDBOX);
do método acima. Quando mudamos para a produção, devemos mudar SANDBOX para PRODUÇÃO nesta linha. Além disso, precisamos alterar nosso id de login e chaves de transação para combinar com nossa conta ao vivo.
Nosso método createSubscription
usa um parâmetro de matriz que devemos construir da maneira abaixo.
$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 usando números de cartão de crédito de teste fornecidos no Guia de teste.
Ao passar a matriz acima para a função createSubscription
, ele criará um pagamento de assinatura de 1,00 USD a cada 7 dias até 10 ciclos de faturamento.
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 você entenda como configurar pagamentos recorrentes em Authorize.net. Por favor, compartilhe suas idéias na seção de comentários abaixo.