xehub/xepay

1.0.0 2020-04-09 07:32 UTC

This package is not auto-updated.

Last update: 2024-09-19 23:10:14 UTC


README

前置工作

要使用 payment 包,必须在 PaymentManager 中注册一个实现了 Order 接口的订单对象 OrderProvider

use use Xehub\Xepay\OrderProvider;

class CustomOrderProvider implements OrderProvider
{
    ...
}
class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->resolving('xepay', function ($payment, $app) {
           $payment->provider('custom', function () {
               return new CustomOrderProvider();
            });
        });
    }
}

并且指定已注册的 provider 到 config 中。

return [
    'default' => [
        'provider' => 'custom',
    ],
    
    ...
];

要在 config 中指定要使用的 pg,在 enables 项中写入。如果使用 2 个以上的 pg,则使用逗号(,)分隔。

'enables' => env('PAYMENT_ENABLES', 'paypal'),

此外,需要将操作所需的脚本文件发布到 public 目录。

# php artisan vendor:publish --tag=payment   

如果包已更新,请添加 --force 选项来运行。

如果 PaymentServiceProvider 没有自动发现,请将 service provider 注册到 config/app.php 中。

添加支付页面功能

在支付页面底部插入如 @paying($order) 的 blade 指示符。传递的 $order 是订单对象(Order)。

可以使用 1 个以上的支付方式。使用 app('xepay')->getMethods() 可以在页面上显示和处理支付方式。

现在,当用户在支付页面上点击支付按钮(或表单提交)时,应在事件监听器中调用支付操作。

<script>
$('.btn-submit').click(function () {
  xepay.exec(method);
});
</script>

在执行方法时,请传递用户选择的支付方式代码。

如果完成支付时需要其他信息,则将这些值作为第二个参数传递。

xepay.exec(method, params);

在支付功能的 js 中,已嵌入一些事件。如果需要在请求中处理,可以通过这些事件执行任务。例如,为了避免重复请求,在执行 exec() 之前禁用支付按钮的情况,可以在支付表单请求完成后通过 prepare.complete 事件来解除禁用。

xepay.listen('prepare.complete', function () {
  $('.btn-submit').prop('disabled', false);
});

支付后处理

在向订单对象(Order)请求成功处理之前,将调用 Paid 事件。将需要处理的任务注册为事件进行处理。

use Xehub\Xepay\Events\Paid;
Event::listen(Paid::class, function($event) {
    // 필요한 비지니스 로직을 작성합니다.
});

在成功处理订单对象后,通过 OrderProvider::success 处理需要执行的代码。

页面跳转

可以指定支付成功或失败后要跳转到的页面。

app('xepay.redirect')->completing(function ($order) {
    return route('complete', $order->getOrderId());
});

如果需要在跳转时执行额外的操作,如会话处理等,可以直接返回 RedirectResponse 来处理。

app('xepay.redirect')->completing(function ($order) {
    return redirect()->route('complete', $order->getOrderId())
        ->with('message', 'payment complete!');
});

在支付失败时,请使用 failing 方法。