- XF-Kompatibilität
- 2.3.x
- Kurzbeschreibung
- 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 navigates to Logs → Payment Provider →[specific=payment entry]Klickt auf "Reversaleinzug" (nur für Anbieter sichtbar, die Rückgäbe unterstützen)
Gibt den Rückgabegrundsumme ein (vorerst mit der verbleibenden Rückgängigmachungsbilanz vfillt)
Für Benutzeraufstiege: Option, das Kauf zu rückgäben (Absteigen des Benutzers)
Für andere erwerbbarer Typen: Die Rückgäbe wird vom Anbieter bearbeitet und der beherrschende Add-On verarbeitet die Rückerstattung über den Payment_refund_complete Code-Ereignis
Der Add-On ruft das Anbieters Rückgäve-API auf, führt die Ergebnisse ein und verfolgt die Gesamtsumme der zurückgegebenen Beträge
Initiieren Sie einen Zahlungsanforderungen vom Anbieter:
Initiatieren Sie eine Zahlungsanforderung vom Anbieter:
Wenn die Verkauf wurde für eine Benutzer-Upgrade behandelt durch XenForo kannst du den Rückerstattungsbetrag und die gewünschte Aktion für die Ugrade angeben.
Wenn die Verkaufsanfrage innerhalb eines anderen Add-ons erstellt wurde, wirst du um eine Rückerstattung gebeten:
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
Additionally, add a `refund()` method in your provider class
```php
public function refund($paymentId)
{
// Logic for processing refunds goes here
}
```
For Stripe and PayPal, also override getPaymentResult() to detect partial vs full refunds on incoming webhooks.
```php
public function getPaymentResult($resultData)
{
if ($this->supportsRefunds()) {
$payment = $this->getPaymentById($resultData['paymentId']);
if (isset($resultData['amount']) && isset($resultData['currency'])) {
$payment->setAmount($resultData['amount'], $resultData['currency']);
}
}
return parent::getPaymentResult($resultData);
}
```
Schritt 2: Verwenden Sie die Methode refund() mit dieser genauen Signatur:
Abgeltümer
Sie müssen diesen Hörer auch im Ihre Add-Ons _data/code_event_listeners.xml-Datei registrieren:
Wichtliche Anweisungen
1. Nur die übersetzte Textausgabe geben.
2. Erkläuter, Erläuterungen oder vordefinierte Phrasen hinzufügen nicht.
3. Übersetzte Texte in Klammern oder mit anderen Formate nicht umschließen.
4. Wenn angemessene Proper Nouns vorhanden sind, diese beibehalten.
Gibt den Rückgabegrundsumme ein (vorerst mit der verbleibenden Rückgängigmachungsbilanz vfillt)
Für Benutzeraufstiege: Option, das Kauf zu rückgäben (Absteigen des Benutzers)
Für andere erwerbbarer Typen: Die Rückgäbe wird vom Anbieter bearbeitet und der beherrschende Add-On verarbeitet die Rückerstattung über den Payment_refund_complete Code-Ereignis
Der Add-On ruft das Anbieters Rückgäve-API auf, führt die Ergebnisse ein und verfolgt die Gesamtsumme der zurückgegebenen Beträge
Initiieren Sie einen Zahlungsanforderungen vom Anbieter:
Initiatieren Sie eine Zahlungsanforderung vom Anbieter:
Wenn die Verkauf wurde für eine Benutzer-Upgrade behandelt durch XenForo kannst du den Rückerstattungsbetrag und die gewünschte Aktion für die Ugrade angeben.
Wenn die Verkaufsanfrage innerhalb eines anderen Add-ons erstellt wurde, wirst du um eine Rückerstattung gebeten:
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
Additionally, add a `refund()` method in your provider class
```php
public function refund($paymentId)
{
// Logic for processing refunds goes here
}
```
For Stripe and PayPal, also override getPaymentResult() to detect partial vs full refunds on incoming webhooks.
```php
public function getPaymentResult($resultData)
{
if ($this->supportsRefunds()) {
$payment = $this->getPaymentById($resultData['paymentId']);
if (isset($resultData['amount']) && isset($resultData['currency'])) {
$payment->setAmount($resultData['amount'], $resultData['currency']);
}
}
return parent::getPaymentResult($resultData);
}
```
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>
1. Nur die übersetzte Textausgabe geben.
2. Erkläuter, Erläuterungen oder vordefinierte Phrasen hinzufügen nicht.
3. Übersetzte Texte in Klammern oder mit anderen Formate nicht umschließen.
4. Wenn angemessene Proper Nouns vorhanden sind, diese beibehalten.