Laravel LiqPay 客户端

1.0.1 2021-06-17 12:05 UTC

This package is auto-updated.

Last update: 2024-09-17 19:52:31 UTC


README

Code Coverage License Code Coverage

安装

运行 composer require digital-threads/liqpay

配置

LiqPay 客户端需要在您的环境中设置以下配置

或者您也可以发布包配置并指定自己的边界

php artisan vendor:publish --provider='DigitalThreads\LiqPay\LiqPayServiceProvider' --tag='config'

使用

在指定了包配置之后,您可以使用 DigitalThreads\LiqPay\LiqPay 门面对象进行支付操作。

检查

为了渲染 LiqPay 表单,您可能需要从后端 API 安全地接收以下 Checkout 编码表单参数,如下所示

PaymentController.php

<?php

namespace App\Http\Controllers\Api;

use App\Models\Order;
use DigitalThreads\LiqPay\LiqPay;
use App\Http\Controllers\Controller;

class PaymentController extends Controller
{
    public function checkout($orderId)
    {
        $order = Order::findOrFail($orderId);

        $prerequisites = LiqPay::getCheckoutFormPrerequisites([
            'amount' => $order->amount,
            'description' => $order->description,
            'order_id' => $order->id,
            'result_url' => route('web.checkout'),
            'server_url' => route('api.liqpay_callback'), // The url that wil be used for order webhook notification
            'currency' => $order->currency, // Optional. If not set - default currency will be used.
        ]);

        return new JsonResponse([
            'action' => $prerequisites->getAction(),
            'data' => $prerequisites->getData(),
            'signature' => $prerequisites->getSignature(),
        ]);
    }
}

api.php

<?php

use Illuminate\Support\Facades\Route;
use  App\Http\Controllers\Api\PaymentController;

Route::get('{order}/checkout', [PaymentController::class, 'checkout']);

然后您可以使用您喜欢的前端框架(如 VueJS)渲染表单

<template>
  <form method="POST" action="{{ form.action }}" accept-charset="utf-8">
    <input type="hidden" name="data" value="{{ form.data }}" />
    <input type="hidden" name="signature" value="{{ form.signature }}" />
    <input
      type="image"
      src="//static.liqpay.ua/buttons/p1en.radius.png"
      name="btn_text"
    />
  </form>
</template>

<script>
  export default {
    data() {
      return {
        orderId: 1,
        form: {
          action: null,
          data: null,
          signature: null,
        },
      };
    },
    async mounted() {
      const response = await fetch(`{your-api-url}/${this.orderId}/checkout`);
      this.form = response.json();
    },
  };
</script>

回调验证

在支付处理过程中,您的 API 将接收到一个 回调 POST 请求,其 URL 已在 PaymentController 中的 server_url 中指定。您需要注册回调处理路由,以便根据请求中的数据更新订单状态。

PaymentController.php

<?php

namespace App\Http\Controllers\Api;

use App\Models\Order;
use Illuminate\Http\Request;
use DigitalThreads\LiqPay\LiqPay;
use App\Http\Controllers\Controller;
use DigitalThreads\LiqPay\Exceptions\InvalidCallbackRequestException;

class PaymentController extends Controller
{
    public function checkout($orderId)
    {
        $order = Order::findOrFail($orderId);

        $prerequisites = LiqPay::getCheckoutFormPrerequisites([
            'amount' => $order->amount,
            'description' => $order->description,
            'order_id' => $order->id,
            'result_url' => route('web.checkout'),
            'server_url' => route('api.liqpay_callback'), // The url that wil be used for order webhook notification
            'currency' => $order->currency, // Optional. If not set - default currency will be used.
        ]);

        return new JsonResponse([
            'action' => $prerequisites->getAction(),
            'data' => $prerequisites->getData(),
            'signature' => $prerequisites->getSignature(),
        ]);
    }

    public function callback(Request $request)
    {
        try {
            $payload = LiqPay::validateCallback($request);
            $order = Order::findOrFail($payload->get('order_id'));

            $order->update(['status' => $payload->get('status')]);
        } catch (InvalidCallbackRequestException $e) {
            return new JsonResponse(['error' => $e->getMessage()], 400);
        }
    }
}

api.php

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\PaymentController;

Route::get('{order}/checkout', [PaymentController::class, 'checkout']);
Route::post('callback', [PaymentController::class, 'callback'])->name('liqpay_callback');

LiqPay::validateCallback 方法将负责请求验证和签名检查,并返回一个 LiqPayPaymentDetailsInterface 实例,使用它来提取订单详情数据以满足您的需求。

致谢