Платіжна система — критично важливий компонент інтернет-магазину. У цій статті розглянемо інтеграцію популярних платіжних провайдерів в OpenCart.
Загальна архітектура платіжного модуля
Кожен платіжний модуль в OpenCart 4 складається з:
- Admin Controller — налаштування модуля
- Catalog Controller — обробка платежу
- Model — взаємодія з БД
- Twig шаблони — форма оплати
LiqPay інтеграція
LiqPay — популярна платіжна система в Україні:
<?php
// catalog/controller/extension/payment/liqpay.php
namespace Opencart\Catalog\Controller\Extension\Payment;
class Liqpay extends \Opencart\System\Engine\Controller {
public function index(): string {
$this->load->language('extension/payment/liqpay');
$order_id = $this->session->data['order_id'];
$this->load->model('checkout/order');
$order = $this->model_checkout_order->getOrder($order_id);
$data = base64_encode(json_encode([
'version' => 3,
'public_key' => $this->config->get('payment_liqpay_public_key'),
'action' => 'pay',
'amount' => $order['total'],
'currency' => $order['currency_code'],
'description' => 'Order #' . $order_id,
'order_id' => $order_id,
'result_url' => $this->url->link('checkout/success'),
'server_url' => $this->url->link('extension/payment/liqpay|callback')
]));
$signature = base64_encode(sha1(
$this->config->get('payment_liqpay_private_key') .
$data .
$this->config->get('payment_liqpay_private_key'),
true
));
return $this->load->view('extension/payment/liqpay', [
'data' => $data,
'signature' => $signature
]);
}
public function callback(): void {
$data = json_decode(base64_decode($_POST['data']), true);
// Верифікація підпису
$signature = base64_encode(sha1(
$this->config->get('payment_liqpay_private_key') .
$_POST['data'] .
$this->config->get('payment_liqpay_private_key'),
true
));
if ($signature !== $_POST['signature']) {
die('Invalid signature');
}
if ($data['status'] === 'success') {
$this->load->model('checkout/order');
$this->model_checkout_order->addHistory(
$data['order_id'],
$this->config->get('payment_liqpay_order_status_id'),
'LiqPay payment successful'
);
}
}
}
Stripe інтеграція
// Використання Stripe PHP SDK
require_once DIR_SYSTEM . 'library/stripe/autoload.php';
\Stripe\Stripe::setApiKey($this->config->get('payment_stripe_secret_key'));
$paymentIntent = \Stripe\PaymentIntent::create([
'amount' => $order['total'] * 100, // в центах
'currency' => strtolower($order['currency_code']),
'metadata' => [
'order_id' => $order_id
]
]);
// Webhook обробка
$payload = file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_STRIPE_SIGNATURE'];
$event = \Stripe\Webhook::constructEvent(
$payload,
$sig_header,
$this->config->get('payment_stripe_webhook_secret')
);
if ($event->type === 'payment_intent.succeeded') {
$order_id = $event->data->object->metadata->order_id;
// Оновити статус замовлення
}
Використовуйте webhooks для підтвердження платежів замість redirect. Клієнт може закрити браузер до редіректу.
— Best Practice
PayPal Checkout
// Frontend: PayPal JavaScript SDK
paypal.Buttons({
createOrder: function(data, actions) {
return fetch('/index.php?route=extension/payment/paypal|createOrder', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({order_id: orderId})
})
.then(res => res.json())
.then(data => data.paypal_order_id);
},
onApprove: function(data, actions) {
return fetch('/index.php?route=extension/payment/paypal|captureOrder', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({paypal_order_id: data.orderID})
})
.then(res => res.json())
.then(data => {
if (data.success) {
window.location.href = '/checkout/success';
}
});
}
}).render('#paypal-button-container');
Тестування платежів
- LiqPay: sandbox режим в налаштуваннях
- Stripe: тестові ключі + карта 4242424242424242
- PayPal: sandbox акаунти
Логування та моніторинг
// Логування платежів
$this->log->write('Payment: Order #' . $order_id . ' - Status: ' . $status);
// Структура логу
[
'timestamp' => date('Y-m-d H:i:s'),
'order_id' => $order_id,
'payment_method' => 'liqpay',
'amount' => $amount,
'status' => $status,
'transaction_id' => $transaction_id
]
Висновок
Правильна інтеграція платіжної системи забезпечує безпеку та зручність для клієнтів. Не забувайте про webhook підтвердження, логування та тестування всіх сценаріїв.