Уведомление о событии Docusign завершается с ошибкой 400 - PullRequest
0 голосов
/ 23 мая 2018

Я использую REST API Docusign для создания и отправки конвертов.Я включил eventNotifications с requireAcknowledgment как true, чтобы получать запросы от Docusign при каждом изменении состояния.Я использовал ngrok при разработке и тестировании, и все работало, как и ожидалось.

Я переместил проект в оперативный режим и отредактировал URL-адрес eventNotification для прямого URL-адреса с помощью https, и тогда все обратные вызовы регистрируются в неудачном разделе вПанель администратора Docusign.

Сообщение об ошибке, отображаемое в панели администратора: -

'https://xxx.xxxxxxx.com/webhook.php :: Ошибка - удаленный сервер возвратил ошибку: (400) ОшибкаЗапрос. '

Я скачал xml тело неудавшегося запроса и попытался отправить запрос через почтальона, и он работал как ожидалось.Iv'e перепробовал все для отладки этой ошибки и не нашел ошибку на моем конце.

Редактировать: Код, который я пробовал, это тот же код со страницы примера DocuSign webhook -

    $data = file_get_contents('php://input');
$xml = simplexml_load_string ($data, "SimpleXMLElement", LIBXML_PARSEHUGE);
$envelope_id = (string)$xml->EnvelopeStatus->EnvelopeID;
$time_generated = (string)$xml->EnvelopeStatus->TimeGenerated;

$files_dir = getcwd() . '/' . $this->xml_file_dir;
if(! is_dir($files_dir)) {mkdir ($files_dir, 0755);}
$envelope_dir = $files_dir . "E" . $envelope_id;
if(! is_dir($envelope_dir)) {mkdir ($envelope_dir, 0755);}

$filename = $envelope_dir . "/T" . 
    str_replace (':' , '_' , $time_generated) . ".xml"; // substitute _ for : for windows-land
$ok = file_put_contents ($filename, $data);

if ($ok === false) {
    error_log ("!!!!!! PROBLEM DocuSign Webhook: Couldn't store $filename !");
    exit (1);
}
// log the event
error_log ("DocuSign Webhook: created $filename");

if ((string)$xml->EnvelopeStatus->Status === "Completed") {
    // Loop through the DocumentPDFs element, storing each document.
    foreach ($xml->DocumentPDFs->DocumentPDF as $pdf) {
        $filename = $this->doc_prefix . (string)$pdf->DocumentID . '.pdf';
        $full_filename = $envelope_dir . "/" . $filename;
        file_put_contents($full_filename, base64_decode ( (string)$pdf->PDFBytes ));
    }
}

Я также пробовал с простым кодом, который просто устанавливает заголовок на 200

http_response_code(200);

1 Ответ

0 голосов
/ 30 мая 2018

Извините, у вас так много проблем с функцией webhook.Надеюсь, этот ответ будет полезным.

1.Попробуйте тестовую программу PHP для проверки подключения и т. Д .:

<?php
header('Content-Type: text/html');
echo "OK!";
$h = fopen('/tmp/listener_access.log', 'a');
if ($h) {
    $now = DateTime::createFromFormat('U.u', microtime(true), new DateTimeZone('UTC'));
    fwrite ($h,  $now->format ("Y-m-d_l.h.i.s.v "));
    fwrite($h, $_SERVER["REMOTE_ADDR"] . " " . $msg . "\n");
    fclose($h);
} else {
    error_log ("### Could not open log file!");
}

Сохраните ее как ok.php в каталоге вашего веб-сервера.Затем попробуйте (из браузера в другой сети) набрать https://yourserver.company.com/ok.php. Вы должны увидеть «ок» в окне браузера.

Затем используйте тот же URL-адрес в разделе eventNotification вашего конверта :: createпозвоните, чтобы увидеть, все ли работает.Вы должны увидеть успех в журнале подключений и т. Д.

2.Пошаговая отладка вашего прослушивателя PHP

Существует ряд проблем, которые нужно исключить (как говорят диагносты) с вашим приложением php listener.

  1. Основные возможности подключения к слушателю.Поскольку DocuSign получает 400 ошибок от вашего приложения, подключение в порядке.
  2. Ошибки платформы с вашим приложением.Это проблема с настройкой стека программного обеспечения PHP, из-за которой стек (а не ваше приложение PHP) отклоняет запрос.

    Обычным показателем для этого является журнал ошибок вашего веб-сервера.Вы смотрели на это?Что находится в строке регистрации, где вы видите ответ 400 от вашего сервера на DocuSign?Если вы не видите ответ 400 на DocuSign, значит, что-то не так с настройкой вашего веб-сервера.

  3. Общая ошибка платформы с PHP и другими стеками при использовании настроек по умолчанию - Maximum_post_size_exceeded.Это происходит, если вы запросили, чтобы DocuSign включил документы вашего конверта в сообщение с уведомлением.

    Хорошим тестом является временное изменение кода создания конверта, чтобы он не включал документы в уведомления.

    Исправления: хорошее исправление - не включает документы конвертав уведомлении.Вместо этого после получения сообщения выполните отдельные вызовы API для получения документов.

    Другое исправление заключается в увеличении максимального размера тела сообщения.Возможно, вам придется увеличить его как в настройках PHP , так и в настройках базового веб-сервера.(Кстати, какой веб-сервер вы используете?)

  4. Вы обрабатываете входящее уведомление в ветке ответов вашего приложения server / php.Это действительно не лучший метод (я буду обновлять страницу примера DocuSign в будущем с этой информацией.)

Лучший метод - использовать следующий шаблон:

1. Receive the incoming notification message from DocuSign
2. Put the message onto a reliable FIFO queue
3. Respond to DocuSign with a 200 response.


Then, in a separate thread of execution, a 
different software application "works off" the 
entries in the queue.

Ваш веб-сервер, например, может отключать вашу PHP-программу.Это, вероятно, не происходит в вашем случае, но другие могут испытать это.

Я думаю, что затем я добавлю больше отладочных операторов в вашу PHP-программу, чтобы попытаться понять, что с ней происходит.Вы можете сделать это с помощью error-log или скопировать метод из моего примера (выше) и записать в файл в / tmp.(Предполагая сервер Linux.)

Другим вариантом является повышение уровня отладки самого стека php или вашего веб-сервера, или обоих.

3,Последние мысли

400 в журналах DocuSign обычно указывают на то, что DocuSign достиг вашего сервера и вернул код состояния 400.Это можно подтвердить, изучив журнал вашего сервера (обычный или с ошибкой), там должна быть соответствующая запись.

Если в журнале вашего сервера нет записи, но программа «ok.php», описанная выше, работает, то пришло время закомментировать большие куски кода из вашей программы PHP, а затемсделать еще один тест от DocuSign.В конце концов, используя метод бинарного поиска (см. Шаг 8 в статье), вы найдете код, который вызывает проблему.

Комментирование кода как часть бинарного поиска длянайти ошибку - очень распространенная и мощная техника отладки.

HTH, Larry

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...