В чём заключается ошибка?
Использую для тестового приема платежей на сайте библиотеку Omnipay и драйвер для работы с Liqpay. Для этого использую test api keys от liqpay. При нажатии на кнопку "Send" выдается ошибка: Uncaught TypeError: Argument 1 passed to Symfony\Component\HttpFoundation\ParameterBag::get() must be of the type string, array given
Я понимаю что где-то код не может с массива в строку перейти, но что именно мне нужно изменить в коде, ведь в документации (а точнее комментариях) к драйверу описан именно такой способ обращения к методу purchase
Вот index.php код:
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Test Page</title>
</head>
<body>
<form id="card">
<input id="num" type="text" placeholder="Number">
<input id="cvv" type="text" placeholder="Cvv">
<input id="date" type="date" placeholder="Experience date">
<input id="btn" type="submit" value="Send data">
</form>
<div id="result"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
$("#btn").click((e) => {
e.preventDefault();
$.ajax({
type: 'POST',
url: 'process.php',
data: {
number: $("#num").val(),
cvv: $("#cvv").val(),
date: $("#date").val()
},
success: function(response) {
$('#result').html(response);
}
});
});
</script>
</body>
</html>
А это process.php код (проблемная строчка: $response = $this->gateway->purchase(...)->send()):
<?php
require 'vendor/autoload.php';
use Omnipay\Omnipay;
use Omnipay\Common\CreditCard;
class OmnipayClass extends Omnipay {
private string $cardNumber = "";
private string $cvv = "";
private string $expDate = "";
private $card = null;
protected $gateway = null;
public function __construct($params = array()) {
if($this->checkCorrect($params)) {
$this->cardNumber = htmlspecialchars($params["number"]);
$this->cvv = htmlspecialchars($params["cvv"]);
$this->expDate = htmlspecialchars($params["date"]);
} else { exit("Something bad with params"); }
}
public function initialize($set_gateway = 'LiqPay', $arr = array()) {
if(isset($arr)) {
try {
// Create a gateway for the LiqPay
$this->gateway = Omnipay::create($set_gateway);
// Initialise the gateway
$this->gateway->initialize(array(
'publicKey' => $arr["public"],
'privateKey' => $arr["private"],
'testMode' => true
));
} catch (Exception $exception) {
exit($exception->getMessage());
}
// Create card class
if(isset($this->gateway)) {
if (($timestamp = strtotime($this->expDate)) !== false) {
$year = date("Y", $timestamp) . " ";
$month = date("m", $timestamp) . " ";
} else { exit('Invalid timestamp!'); }
$this->card = new CreditCard(array(
'number' => $this->cardNumber,
'expiryMonth' => $month,
'expiryYear' => $year,
'cvv' => $this->cvv
));
try { $this->card->validate(); }
catch (Exception $exception) { exit($exception->getMessage()); }
} else {
exit("Something wrong with gateway");
}
}
}
public function sendPurchase():string {
if(isset($this->card) && isset($this->gateway)) {
// Test
$response = $this->gateway->purchase(array(
'amount' => '10.00',
'currency' => 'USD', // USD | EUR | RUB | UAH'
'transactionId' => '1',
'description' => 'Payment description',
'clientIp' => '127.0.0.1',
'returnUrl' => 'success.php',
'notifyUrl' => 'index.php',
'card' => $this->card
))->send();
// echo "<pre>";
// var_dump($response);
// echo "</pre>";
if ($response->isSuccessful()) {
return "Purchase transaction was successful!\n";
//return $response->getData();
} else if ($response->isRedirect()) {
return "Redirect";
//return $response->getRedirectData();
} else {
return "Error";
//return $response->getMessage();
}
}
return "";
}
private function checkCorrect($arr = array()):bool {
if(isset($arr) && isset($arr["number"]) && isset($arr["cvv"]) && isset($arr["date"])) {
if(strlen($arr["number"]) > 0 && strlen($arr["cvv"]) > 0 && strlen($arr["date"]) > 0) {
return true;
}
}
return false;
}
}
$testOmnipayClass = new OmnipayClass($_POST);
$testOmnipayClass->initialize("LiqPay", array(
"public" => "sandbox_XXXXXXX",
"private" => "sandbox_YYYYYY"
));
var_dump($testOmnipayClass->sendPurchase());