Взаимодействие с модулем платёжной системы через curl

Иззет

Новичок
Здравтствуйте, кто имеет опыт с подобными задачами, просвятите, что делаю неправильно. Прошу строго не судить.

PHP:
// Константные переменные

// Certificate Authority Банка

$ca = 'security/psroot.pem';

// Приватный ключ Торговца

$key = 'security/key.pem';

// PKCS#12 кейстор с подписанным сертификатом Торговца

$p12_file = 'security/keystore.p12';

// Пароль от PKCS#12 кейстора

$p12_password = '*****';

// URL MerchantHandler Банка. По этому адресу Торговец делает запрос в

// банк с деталями платежа а так же деталями карты

$merchant_handler = 'https://someurl';

// URL ClientHandler Банка. По этому адресу Торговец редиректит Клиента

// на модуль

$client_handler = 'https://url';

// Название страницы приведено в качестве примера

$system_malfunction_page = 'system_malfunction.html';

$amount = $_POST['amount'];

$currency = $_POST['currency'];

$description = $_POST['description'];

$language = $_POST['language'];

$params['command'] = 'V';

$params['amount'] = $amount;

$params['currency'] = $currency;

$params['description'] = $description;

$params['language'] = $language;

$params['msg_type'] = 'SMS';

// IP адрес Клиента

if (isset($_SERVER['REMOTE_ADDR'])) {

$params['client_ip_addr'] = $_SERVER['REMOTE_ADDR'];

} elseif (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {

$params['client_ip_addr'] = $_SERVER['HTTP_X_FORWARDED_FOR'];

} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {

$params['client_ip_addr'] = $_SERVER['HTTP_CLIENT_IP'];

} else {

// should never happen

$params['client_ip_addr'] = '10.10.10.10';

}

qstring = http_build_query($params);

$ch = curl_init($url);

curl_setopt($ch, CURLOPT_URL, $merchant_handler);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch, CURLOPT_POSTFIELDS, $qstring);

curl_setopt($ch, CURLOPT_SSLCERT, $p12_file);

curl_setopt($ch, CURLOPT_SSLKEY, $key);

curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM');

curl_setopt($ch, CURLOPT_SSLKEYPASSWD, 'keypass');

curl_setopt($ch, CURLOPT_CAPATH, $ca);

curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'P12');

curl_setopt($ch, CURLOPT_SSL_CIPHER_LIST, 'TLSv1');

$result = curl_exec($ch);

// пример вернувшегося результата

// TRANSACTION_ID: TwXcbhBgrIsMY0A7s982nx/pSzE=

// for debug reasons only!

//if (curl_error($ch)) {

// echo curl_error($ch) . '<br>';

// echo 'Error code: ' . curl_errno($ch);

// curl_close($ch);

// exit;

//}

if (curl_error($ch)) {

header('Location: ' . $system_malfunction_page);

}

curl_close($ch);
при формировании запроса curl выдаёт ошибку:
Couldn`t open PKCS12 file from 'security/keystore.p12'
Error 58.
 

AnrDaemon

Продвинутый новичок
Что вы делаете неправильно? Дайте подумать… похоже, что всё.
1. Относительные пути к критически важным элементам системы.
2. Выполнение транзакции одним реквестом.
3. Слепое доверие заголовкам реквеста.
 

antson

Новичок
Партнер клуба
код из примера ? Могу предположить, что это была очень упрощенная демонстрация регистрация запроса на оплату в мерчанте.

Обычно передаваемая при подключении документация идет с грифом ДСП.

Сколько должен заплатить человек должно браться из модели заказы магазина.
при выборе конкретного способа оплаты формируется заявка на оплату.
в момент ее формирования в вашем случае требуется зарегистрировать оплату в мерчанте. т.е. получить TRANSACTION_ID
после сформировать страницу перехода к оплате методом пост (или просто сделать редирект, если мерчант принимает запросы гетом)

сам мерчант будет предъявлять этот TRANSACTION_ID при запросе чек и авизо урлов на вашем сайте.
или нужно будет по крону отслеживать статус .

Системы разные бывают.
 
Сверху