- Совместимость с XF
- 2.3.x
- Краткое описание
- This add-on provides advanced refund capabilities for XenForo, including admin-initiated refunds and smart partial refund handling. It integrates seamlessly with Stripe and PayPal, offering a robust framework for payment providers and add-ons to manage refunds efficiently. Users can initiate refunds directly from the admin panel or via purchase logs, ensuring smooth user upgrades and seamless transaction management.
Админ переходит в Логи → Платежный провайдер →[specific=payment entry]Кликните "Issue Refund" (только видимо для поставщиков, которые поддерживают возвраты)
Введите сумму возврата (заполнена автоматически остатком суммы, которую можно вернуть)
Для обновления пользователей: возможность отменить покупку (опустошить пользователя)
Для других типов покупок: возврат происходит через поставщика и управление добавочными услугами отслеживает схему возврата через событие payment_refund_complete
Добавочный модуль вызывает API для возврата поставщика, отслеживает результат и отслеживает общую сумму возвращенных средств
Начните процесс платежа от поставщика:
Если покупка была сделана для обновления пользователя, управляемого XenForo, вы можете указать сумму возврата и желаемые действия по отношению к этому обновлению.
Если покупка была сделана в другом дополнительном опене, вы будете пропущены на расторжении только возврат:
In your provider class (which extends XF\Payment\AbstractProvider), add:
```php
public function supportsRefunds()
{
return true;
}
```
And implement the refund() method as needed.
Шаг 2: Реализовать метод возврата ()
Добавьте метод возврата () с этой точной сигнатурой:
Шаг 3: Здесь нет шага 3.
Таковы правила. Добавочный для возврата использует method_exists() для обнаружения этих методов во время выполнения. Если добавочный для возврата установлен, ваш поставщик покажет кнопку "Возвратить деньги" на записях журнала платежей. Если он не установлен, эти методы просто существуют и не используются.
Как мне добавить поддержку возврата к моему добавочному?
Если у вас есть добавочный для покупок (не поставщик платежей) и вы хотите реагировать при обнаружении возвратов — например, отменять доступ к курсу — зарегистрируйте слушателя кодовых событий для события payment_refund_complete:
Вы также должны зарегистрировать этот слушатель в файле _data/code_event_listeners.xml вашего плагина:
Важные замечания
Не требуется зависимость: Не используйте или не требуйте классов из пространства имен Jack\PaymentRefund. Ваш поставщик должен иметь нулевые ссылки на плагин возврата средств.
Решение ID транзакции: Параметр $transactionId берется из столбца transaction_id записи xf_payment_provider_log, которую админ отменяет. В зависимости от того, как ваш поставщик логирует платежи, этот ID может или не быть тем, который вам нужен для API возврата. Если это так, найдите правильный ID в log_details или provider_metadata записи о запросе покупки. Пример метода resolveChargeId() из расширения Stripe.
Обработка валюты: Значение $amount всегда десятичное (например, 10.00). Если API поставщика ожидает значения в наименьшей денежной единице (например, центах), конвертируйте его в методе refund().
Отмена частичного возврата: Плагин для возврата средств автоматически отслеживает накопительный учет. Ваш метод refund() просто должен обрабатывать любое значение, которое ему передается. Плагин гарантирует, что $amount никогда не превышает оставшуюся сумму, которую можно вернуть.
Удаление дубликатов вебхуков: Когда админ выдает отмену, последующий вебхук поставщика (например, от Stripe charge.refunded) обнаруживается как дублированный и записывается как информационный — предотвращая двойные отмены.
Введите сумму возврата (заполнена автоматически остатком суммы, которую можно вернуть)
Для обновления пользователей: возможность отменить покупку (опустошить пользователя)
Для других типов покупок: возврат происходит через поставщика и управление добавочными услугами отслеживает схему возврата через событие payment_refund_complete
Добавочный модуль вызывает API для возврата поставщика, отслеживает результат и отслеживает общую сумму возвращенных средств
Начните процесс платежа от поставщика:
Если покупка была сделана для обновления пользователя, управляемого XenForo, вы можете указать сумму возврата и желаемые действия по отношению к этому обновлению.
Если покупка была сделана в другом дополнительном опене, вы будете пропущены на расторжении только возврат:
In your provider class (which extends XF\Payment\AbstractProvider), add:
```php
public function supportsRefunds()
{
return true;
}
```
And implement the refund() method as needed.
PHP:
public function supportsRefunds(): bool
{
return true;
}
Добавьте метод возврата () с этой точной сигнатурой:
PHP:
public function refund(
\XF\Entity\PaymentProfile $paymentProfile,
\XF\Entity\PurchaseRequest $purchaseRequest,
string $transactionId,
?float $amount = null,
string $currency = 'USD'
): array
{
// $paymentProfile - contains your API credentials in $paymentProfile->options
// $purchaseRequest - the original purchase (has cost_amount, cost_currency, provider_metadata)
// $transactionId - the transaction ID from the payment log entry being refunded
// $amount - refund amount (null means full refund)
// $currency - currency code
// Call your provider's refund API here...
// On success, return:
return [
'success' => true,
'provider_refund_id' => 'your_provider_refund_id',
];
// On failure, return:
return [
'success' => false,
'error' => 'Human-readable error message',
];
}
Таковы правила. Добавочный для возврата использует method_exists() для обнаружения этих методов во время выполнения. Если добавочный для возврата установлен, ваш поставщик покажет кнопку "Возвратить деньги" на записях журнала платежей. Если он не установлен, эти методы просто существуют и не используются.
Как мне добавить поддержку возврата к моему добавочному?
Если у вас есть добавочный для покупок (не поставщик платежей) и вы хотите реагировать при обнаружении возвратов — например, отменять доступ к курсу — зарегистрируйте слушателя кодовых событий для события payment_refund_complete:
PHP:
public static function onPaymentRefundComplete(
\XF\Entity\PaymentProviderLog &$logEntry,
\XF\Entity\PurchaseRequest &$purchaseRequest,
float $amount,
string $currency,
bool $purchaseReversed,
array $providerResult
): void
{
// Check if this refund is for your purchasable type
if ($purchaseRequest->purchasable_type_id !== 'your_purchasable_type')
{
return;
}
// Handle the refund (e.g., revoke access, send notification)
}
XML:
<listeners>
<listener event_id="payment_refund_complete"
execute_order="10"
callback_class="Your\AddOn\Listener"
callback_method="onPaymentRefundComplete"
active="1" />
</listeners>
Не требуется зависимость: Не используйте или не требуйте классов из пространства имен Jack\PaymentRefund. Ваш поставщик должен иметь нулевые ссылки на плагин возврата средств.
Решение ID транзакции: Параметр $transactionId берется из столбца transaction_id записи xf_payment_provider_log, которую админ отменяет. В зависимости от того, как ваш поставщик логирует платежи, этот ID может или не быть тем, который вам нужен для API возврата. Если это так, найдите правильный ID в log_details или provider_metadata записи о запросе покупки. Пример метода resolveChargeId() из расширения Stripe.
Обработка валюты: Значение $amount всегда десятичное (например, 10.00). Если API поставщика ожидает значения в наименьшей денежной единице (например, центах), конвертируйте его в методе refund().
Отмена частичного возврата: Плагин для возврата средств автоматически отслеживает накопительный учет. Ваш метод refund() просто должен обрабатывать любое значение, которое ему передается. Плагин гарантирует, что $amount никогда не превышает оставшуюся сумму, которую можно вернуть.
Удаление дубликатов вебхуков: Когда админ выдает отмену, последующий вебхук поставщика (например, от Stripe charge.refunded) обнаруживается как дублированный и записывается как информационный — предотвращая двойные отмены.