Судя по многочисленным вопросам без ответа во всемирной паутине, многие из тех кто пытался установить к себе на сайт форму для оплаты Яндекс-деньгами выбирали наиболее безопасный метод подключения «PCKS#7/XML», однако я полагаю мало кому действительно удалось завершить подключение этим методом. Техподдержка яндекс-денег, не дает полных рекомендаций по интеграции и вместо этого предлагает перейти на более простой и менее безопасный метод подключения «NVP/MD5».
Данные передаются посредством вызова по протоколу HTTP/1.1, методом POST. Параметры сообщения (данные платежа) упаковываются как набор параметров POST-запроса в виде пар «имя=значение». MIME-тип: application/x-www-form-urlencoded.
Один из параметров (md5) содержит хэш данных платежной формы вместе с секретным словом. Секретное слово предоставляется магазином.
Данные передаются посредством вызова по протоколу 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.
Расшифровка будет производиться с помощью следующего скрипта:
При вызове функции, получаем либо false, либо расшифрованный xml-документ. Далее используем обычный парсинг XML, мануалов по которому множество и выдаем системе яндекс-деньги ответы в виде незашифрованного xml-документа, согласно инструкции Яндекс.Деньги.
Немного теории
Метод подключения 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-документа, согласно инструкции Яндекс.Деньги.