Pull to refresh

Интеграция с сервисом Яндекс.Деньги методом PKCS#7/XML

Судя по многочисленным вопросам без ответа во всемирной паутине, многие из тех кто пытался установить к себе на сайт форму для оплаты Яндекс-деньгами выбирали наиболее безопасный метод подключения «PCKS#7/XML», однако я полагаю мало кому действительно удалось завершить подключение этим методом. Техподдержка яндекс-денег, не дает полных рекомендаций по интеграции и вместо этого предлагает перейти на более простой и менее безопасный метод подключения «NVP/MD5».

Немного теории


Метод подключения NVP/MD5 (по умолчанию)

Данные передаются посредством вызова по протоколу HTTP/1.1, методом POST. Параметры сообщения (данные платежа) упаковываются как набор параметров POST-запроса в виде пар «имя=значение». MIME-тип: application/x-www-form-urlencoded.
Один из параметров (md5) содержит хэш данных платежной формы вместе с секретным словом. Секретное слово предоставляется магазином.

Метод подключения XML/PKCS#7

Данные передаются посредством вызова по протоколу HTTP/1.1, методом POST. Параметры сообщения (данные платежа) представляются в виде XML-документа, вложенного в криптоконтейнер PKCS#7. MIME-тип: application/pkcs7-mime. Данные подписываются SSL-сертификатом оператора системы.
Магазин должен проверять подпись криптоконтейнера и отвечать отказом в случае несовпадения данных документа сообщения и данных подписи.
ИС может хранить это криптосообщение, чтобы предъявить в случае разногласий.
Документ формируется согласно стандарту XML 1.0 (Fifth Edition), опубликованному по адресу: www.w3.org/TR/xml.
Сформированный документ помещается в криптоконтейнер формата PKCS#7 согласно стандарту www.ietf.org/rfc/rfc5652.txt. Криптоконтейнер содержит АСП (цифровую подпись, аналог собтвенноручной подписи). Криптоконтейнер содержит конечный сертификат оператора системы. Криптоконтейнер не содержит цепочки центров сертификации. Компрессия данных не используется. Шифрование не используется. Криптопакет закодирован в формате PEM (OpenSSL). Сертификат, используемый при изготовлении криптопакета, соответствует стандарту X.509 Version 3 (http://www.ietf.org/rfc/rfc2459.txt).

Схема рекомендуется как альтернатива NVP/MD5, обладающая высоким уровнем безопасности.

Немного практики


На практике все просто: нам требуется расшифровывать запросы от сервиса Яндекс.Деньги в виде XML-документа зашифрованные в PKCS#7 с помощью сертификата (выдается сотрудниками Яндекс.Денег). Для работы нам потребуется установленная библиотека Openssl.

Расшифровка будет производиться с помощью следующего скрипта:
function verify(){
$descriptorspec = array(0 => array("pipe", "r"),1 => array("pipe", "w"),2 => array("pipe", "w"));
$certificate='здесь путь к вашему сертификату относительно данного скрипта';
$process = proc_open('openssl smime -verify -inform PEM -nointern -certfile ' . $certificate . ' -CAfile ' . $certificate,
$descriptorspec, $pipes);
if (is_resource($process)) {
$data = file_get_contents("php://input"); //Используется альтернатива массиву $_POST, поскольку XML-документ не получится получить с помощью данного массива
fwrite($pipes[0], $data);
fclose($pipes[0]);
$content = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$resCode = proc_close($process);
if ($resCode != 0)
return false;
else
return $content;
}
}

$post=file_get_contents("php://input");
if (!empty($post))
$xml=verify();
if (!empty($xml))
$sm=simplexml_load_string($xml);
//Дальше идет парсинг xml-документа (переменная $sm)


При вызове функции, получаем либо false, либо расшифрованный xml-документ. Далее используем обычный парсинг XML, мануалов по которому множество и выдаем системе яндекс-деньги ответы в виде незашифрованного xml-документа, согласно инструкции Яндекс.Деньги.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.