Як налаштувати періодичні платежі на Authorize.net
Ми написали статтю Прийняти оплату кредитною карткою за допомогою Authorize.net Payment Gateway. У цій статті ми обговорили, як можна отримати оплату кредитною карткою через Authorize.net. Крім того, ця стаття в основному зосереджена на одноразовій оплаті.
Але що, якщо хтось хоче інтегрувати періодичні платежі у свою програму? У цій статті ми покажемо вам, як налаштувати періодичні платежі за допомогою Authorize.net.
Що таке періодичний платіж?
Періодичний або передплатний платіж означає автоматичне стягнення з кредитної картки фіксованої суми через певний інтервал і протягом певного періоду часу.
Наприклад, припустимо, ви працюєте на своєму веб-сайті на хостингу Bluehost, і ви заплатили суму за перший рік. Коли термін дії вашого плану закінчується, Bluehost автоматично стягуватиме плату з вашої кредитної картки на наступний рік (якщо ви вибрали варіант періодичного платежу).
Перевага дозволу на план передплати полягає в тому, що вам не потрібно пам’ятати дату закінчення терміну дії послуги, якою ви користуєтесь. Постачальник послуг зберігає його як автоматизовану систему. Після закінчення терміну дії вашого плану вони поновлюють вашу послугу, беручи платежі з вашої кредитної картки у фоновому режимі.
Сказавши це, давайте подивимось, як налаштувати періодичні платежі за допомогою Authorize.net.
Спочатку слід прочитати нашу статтю Прийняти оплату кредитною карткою за допомогою Authorize.net Payment Gateway. У цій статті ми обговорили питання встановлення та налаштування бібліотек Authorize.net SDK.
Для нашого підручника ми використовуємо обліковий запис пісочниці. Тому спочатку слід створити свій обліковий запис Sandbox і отримати ключі API. Ключі API можна знайти в обліковому записі-> Повноваження та ключі API.
Встановлення
Для початку нам потрібно встановити PHP SDK Library. Ми рекомендуємо 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 наступним чином.
константи.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);
із наведеного вище методу. Коли ми переходимо до виробництва, нам слід змінити ПІСКОВОК на ВИРОБНИЦТВО в цій лінії. Також нам потрібно змінити ідентифікаційний номер і ключі транзакції, щоб вони відповідали нашому реальному рахунку.
Наш метод 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 USD через кожні 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. Будь ласка, поділіться своїми думками в розділі коментарів нижче.