- Compatibilidad con XF
- 2.3.x
- Descripción breve
- 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.
Admin navega a Logs → Proveedor de Pago →[specific=payment entry]Haz clic en "Reembolso" (visible solo para proveedores que soportan reembolsos)
Ingresa el monto del reembolso (pre-populado con el saldo restante de reembolso posible)
Para actualizaciones de usuarios: opción de revertir la compra (descender al nivel inferior del usuario)
Para otros tipos de compras: el reembolso se procesa con el proveedor y el add-on que administra la reversión maneja la acción mediante el evento payment_refund_complete
El add-on llama a la API de reembolso del proveedor, registra el resultado y rastrea el monto total reembolsado
Inicia una transacción de pago desde los registros del proveedor:
Si la compra fue para una Actualización de Usuario gestionada por XenForo puede especificar el monto del reembolso y el acción deseada para la actualización.
Si la compra fue realizada dentro de otro adicional, usted será prompuido para activar solo un reembolso:
Add supportsRefunds() to your provider
In your provider class (which extends XF\Payment\AbstractProvider), add:
```php
public function supportsRefunds()
{
return true;
}
```
Add refund() method to your provider
Also in your provider class, add the `refund()` method:
```php
public function refund($paymentId)
{
// Implement logic for processing refunds here
}
```
Override getPaymentResult() in AbstractProvider if needed
If you need to override how partial vs full refunds are detected on incoming webhooks, do so in your provider class by overriding the `getPaymentResult()` method:
```php
public function getPaymentResult($paymentId)
{
// Implement logic for detecting partial or full refunds here
}
```
Implement refund() and supportsRefunds() methods directly on your payment provider's class if needed
Third-party payment providers can add refund support by implementing the `supportsRefunds()` and `refund()` methods directly on their provider class, without relying on this add-on.
Implementar método refund() con esta firma exacta:
Reembolsar
También será necesario registrar este escuchador en el archivo _data/code_event_listeners.xml de tu add-on:
Notas importantes
No dependencia requerida: No utilice o requiera ninguna clase del espacio de nombres Jack\PaymentRefund. Su proveedor debe tener cero referencias al add-on de reembolso.
Resolución del ID de transacción: El parámetro $transactionId proviene de la columna transaction_id de la entrada xf_payment_provider_log que el administrador está reembolsando. Dependiendo de cómo su proveedor registra pagos, esto puede o no ser el ID que necesita para su API de reembolso. Si no es así, busque el ID correcto en los detalles de la entrada log o en provider_metadata del pedido de compra. Vea el método resolveChargeId() en la extensión Stripe como un ejemplo.
Manejo de moneda: El $amount siempre es un valor decimal (por ejemplo, 10.00). Si su API de proveedor espera cantidades en el menor unidad monetaria (como centavos), convierta en su método refund().
Reembolso parcial: El add-on de reembolso maneja automáticamente la seguimiento acumulado. Su método refund() solo necesita procesar lo que le dé. El add-on asegura que $amount nunca supere el saldo restante refacturable.
Deducción de duplicados en webhook: Cuando un administrador emite un reembolso, la siguiente webhook del proveedor (por ejemplo, la charge.refunded de Stripe) se detecta como duplicada y se registra informativamente — previniendo doble-reversión.
Ingresa el monto del reembolso (pre-populado con el saldo restante de reembolso posible)
Para actualizaciones de usuarios: opción de revertir la compra (descender al nivel inferior del usuario)
Para otros tipos de compras: el reembolso se procesa con el proveedor y el add-on que administra la reversión maneja la acción mediante el evento payment_refund_complete
El add-on llama a la API de reembolso del proveedor, registra el resultado y rastrea el monto total reembolsado
Inicia una transacción de pago desde los registros del proveedor:
Si la compra fue para una Actualización de Usuario gestionada por XenForo puede especificar el monto del reembolso y el acción deseada para la actualización.
Si la compra fue realizada dentro de otro adicional, usted será prompuido para activar solo un reembolso:
Add supportsRefunds() to your provider
In your provider class (which extends XF\Payment\AbstractProvider), add:
```php
public function supportsRefunds()
{
return true;
}
```
Add refund() method to your provider
Also in your provider class, add the `refund()` method:
```php
public function refund($paymentId)
{
// Implement logic for processing refunds here
}
```
Override getPaymentResult() in AbstractProvider if needed
If you need to override how partial vs full refunds are detected on incoming webhooks, do so in your provider class by overriding the `getPaymentResult()` method:
```php
public function getPaymentResult($paymentId)
{
// Implement logic for detecting partial or full refunds here
}
```
Implement refund() and supportsRefunds() methods directly on your payment provider's class if needed
Third-party payment providers can add refund support by implementing the `supportsRefunds()` and `refund()` methods directly on their provider class, without relying on this add-on.
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',
];
}
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>
No dependencia requerida: No utilice o requiera ninguna clase del espacio de nombres Jack\PaymentRefund. Su proveedor debe tener cero referencias al add-on de reembolso.
Resolución del ID de transacción: El parámetro $transactionId proviene de la columna transaction_id de la entrada xf_payment_provider_log que el administrador está reembolsando. Dependiendo de cómo su proveedor registra pagos, esto puede o no ser el ID que necesita para su API de reembolso. Si no es así, busque el ID correcto en los detalles de la entrada log o en provider_metadata del pedido de compra. Vea el método resolveChargeId() en la extensión Stripe como un ejemplo.
Manejo de moneda: El $amount siempre es un valor decimal (por ejemplo, 10.00). Si su API de proveedor espera cantidades en el menor unidad monetaria (como centavos), convierta en su método refund().
Reembolso parcial: El add-on de reembolso maneja automáticamente la seguimiento acumulado. Su método refund() solo necesita procesar lo que le dé. El add-on asegura que $amount nunca supere el saldo restante refacturable.
Deducción de duplicados en webhook: Cuando un administrador emite un reembolso, la siguiente webhook del proveedor (por ejemplo, la charge.refunded de Stripe) se detecta como duplicada y se registra informativamente — previniendo doble-reversión.