退款支付

退款支付 1.0.0

没有下载权限
XF 兼容性
  1. 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]点击“退款”(仅对支持退款的服务提供者可见)
输入退款金额(预填充为可退还余额)
对于用户升级:选项取消购买(降级用户)
对于其他可购类型:退款由服务提供商处理,拥有者的附加组件通过payment_refund_complete代码事件来撤销退款

附加组件调用服务提供商的退款API,记录结果,并跟踪累计退款金额

从服务提供商日志中发起支付
334027-a28eb784f22f6b7021af1809151d0d5b.webp

如果购买是用于XenForo处理的用户升级,可以指定退款金额和所需的行动。
334028-589e1953b887adec70754183603a5709.webp

如果购买是在另一个附加选项中进行的,您将被提示仅发起退款:
334029-29c99ba2dc43409f955e75661e8e314f.webp

如何为支付提供商添加退款支持?

第三方支付提供商可以通过直接在其提供程序类中实现supportsRefunds()和refund()方法来添加退款支持——无需依赖此插件。

第三方可购买的附加组件可以监听payment_refund_complete代码事件以处理触发退款的操作(例如,撤销课程访问权限)。
PHP:
public function supportsRefunds(): bool
{
    return true;
}
步骤 2:实现 refund() 方法,其签名必须与此 exactly 相同:
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',
    ];
}
步骤3:没有步骤3。退款插件使用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)
}
你需要在你的扩展程序的 _data/code_event_listeners.xml 文件中注册这个监听器:
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参数来自要退款的xf_payment_provider_log条目中的transaction_id列。根据您的提供商记录支付的方式,这可能不是您需要用于退款API的ID。如果不是,请从日志条目的log_details或购买请求的provider_metadata中查找正确的ID。参见Stripe扩展中的resolveChargeId()方法示例。

货币处理:$amount始终是一个小数值(例如,10.00)。如果您的提供商API期望金额以最小货币单位(如美分)表示,请在退款()方法中进行转换。

部分退款:退款扩展自动跟踪累积记录。您的退款()方法只需处理它所给的任何金额即可。该附加组件确保$amount不会超过可退还余额剩余的部分。

Webhook去重:当管理员发出退款时,提供商随后发送的后续webhook(例如Stripe的charge.refunded)被检测为重复,并作为信息日志记录——防止双重逆向操作。
作者
axtona
浏览
118
扩展类型
zip
文件大小
22.2 KB
首次发布
上次更新
评分 0.00 星 0 个评分
链接失效了吗? 发送消息 给 NP 团队,我们会尽快为您处理!
支持开发者 如果您对测试满意或项目已成功盈利,可点击「更多信息」按钮,通过购买来支持开发者!

来自 axtona 的更多资源

泰勒杰布 blogs A
让用户在自己的私人空间中以更个性的方式表达自己!
OSDonate Pro / OS Donate Pro A
OSDonate可以让您在您的Joomla网站上显示PayPal捐赠按钮。
浏览
353
已更新
 无限滚动 A
这个插件允许帖子和主题实现无限滚动。
浏览
160
已更新
顶部