Как настроить периодические платежи в Authorize.net
Мы написали статью «Принять оплату кредитной картой с помощью платежного шлюза Authorize.net». В этой статье мы обсудили, как можно получить оплату кредитной картой через Authorize.net. Кроме того, эта статья в основном посвящена единовременному платежу.
Но что, если кто-то захочет интегрировать регулярные платежи в свое приложение? В этой статье мы покажем вам, как настроить регулярные платежи с помощью Authorize.net.
Что такое периодический платеж?
Регулярная оплата или оплата по подписке означает автоматическое снятие фиксированной суммы с кредитной карты через определенный интервал и в течение определенного периода времени.
Например, предположим, что вы запускаете свой веб-сайт на хостинге Bluehost и заплатили определенную сумму за первый год. Когда срок действия вашего плана истечет, Bluehost автоматически снимет оплату с вашей кредитной карты за следующий год (если вы выбрали вариант повторяющихся платежей).
Преимущество использования плана подписки заключается в том, что вам не нужно помнить дату истечения срока службы, которую вы используете. Поставщик услуг хранит это как автоматизированную систему. По истечении срока действия вашего плана они возобновляют вашу услугу, принимая платежи с вашей кредитной карты в фоновом режиме.
Сказав это, давайте посмотрим, как настроить регулярные платежи с помощью Authorize.net.
Сначала вам следует прочитать нашу статью Принимать платежи по кредитным картам с помощью платежного шлюза Authorize.net. В этой статье мы обсудили установку и настройку библиотек Authorize.net SDK.
В нашем руководстве мы используем учетную запись песочницы. Итак, сначала вы должны создать свою учетную запись Sandbox и получить ключи API. Вы можете найти свои ключи API в разделе «Учетная запись» -> «Учетные данные и ключи API».
Монтаж
Для начала нам нужно установить библиотеку PHP SDK. Мы рекомендуем Composer для установки библиотеки.
Создайте composer.json
файл в корневом каталоге вашего проекта и добавьте в него приведенный ниже код.
composer.json
{
"require": {
"php": ">=5.6",
"authorizenet/authorizenet": "~1.9.6"
}
}
Откройте терминал в корневом каталоге вашего проекта и выполните composer install
команду. Эта команда загрузит зависимость библиотеки.
Настройте среду
Мы установили библиотеку PHP SDK. Теперь создайте два файла с именами constants.php
и subscriptionpayment.php
. В файле constants.php мы храним ключи API следующим образом.
constants.php
<?php
define('ANET_LOGIN_ID', 'YOUR_LOGIN_ID');
define('ANET_TRANSACTION_KEY', 'YOUR_TRANSACTION_KEY');
?>
Убедитесь, что вы заменили заполнители YOUR_LOGIN_ID и YOUR_TRANSACTION_KEY на фактические значения.
subscriptionpayment.php
это файл, в котором мы будем писать код для оплаты подписки кредитной карты. Для этого сначала нам нужно включить файлы ядра из библиотеки.
subscriptionpayment.php
<?php
require_once "vendor/autoload.php";
require_once "constants.php";
use netauthorizeapicontractv1 as AnetAPI;
use netauthorizeapicontroller as AnetController;
?>
Актуальный код для периодических платежей в Authorize.net
Authorize.net предоставляет разработчикам библиотеку примеров кода. В нашем руководстве мы используем ссылку на RecurringBilling.
Немного модифицируем createSubscription
метод из справочного кода и пишем его следующим образом.
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;
}
Обратите внимание на строку $response = $controller->executeWithApiResponse(netauthorizeapiconstantsANetEnvironment::SANDBOX);
из приведенного выше метода. Когда мы переходим к производству, мы должны изменить SANDBOX на ПРОИЗВОДСТВО в этой строке. Также нам нужно изменить наш логин и ключи транзакции, чтобы они соответствовали нашей реальной учетной записи.
Наш метод createSubscription
принимает параметр массива, который мы должны построить ниже.
$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'
];
Мы используем номера тестовых кредитных карт, указанные в Руководстве по тестированию.
Передавая вышеуказанный массив функции createSubscription
, она будет создавать платеж по подписке в размере 1,00 доллара США через каждые 7 дней до 10 циклов выставления счетов.
Окончательный код
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;
}
?>
Надеемся, вы понимаете, как настроить регулярные платежи в Authorize.net. Пожалуйста, поделитесь своими мыслями в разделе комментариев ниже.