Тестовый запрос в CloudKassir
В онлайн-кассе CloudKassir есть возможность работы через API. В документации (https://developers.cloudkassir.ru/#testovyy-metod) описан тестовый запрос. Выполняю его в Postman'е - всё работает. А на JavaScript не получается: свойство status = 0, и не понятно, как получить ответ в формате JSON. Свойство responseText не работает. Техподдержка CloudKassir в JavaScript'е не разбирается.
Код такой: var xmlhttp = CreateXmlHttp(); PostRequest(); function PostRequest() { xmlhttp.open("POST", "https://api.cloudpayments.ru/test", true, "<Public ID>", "<Пароль>"); xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=UTF-8'); xmlhttp.responseType = "json"; xmlhttp.addEventListener( "readystatechange", () => { if (xmlhttp.readyState != 4) return; alert( 'readyState = ' + xmlhttp.readyState + '; status = ' + xmlhttp.status + '; statusText = [' + xmlhttp.statusText + ']' ); } ); xmlhttp.send(""); } function CreateXmlHttp() // Данная функция создаёт кроссбраузерный объект XMLHTTP. { var xmlhttp; try { xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlhttp = false; } } if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { xmlhttp = new XMLHttpRequest(); } return xmlhttp; } Кто-нибудь в курсе, как получить ответ от сервера в формате JSON? |
Цитата:
А вот заголовок application/json для пустого тела запроса как бы и без надобности. |
Вложений: 3
Сегодня узнал вот что. Отправка этого запроса в Postman'е возможна только при наличии 2-х заголовков:
1) Content-Length = 0 2) Host = ... Про Host написано, что он нужен для идентификации имени домена, для которого запрос отправляется на сервер. Спрашивается: какого домена? Я попробовал указать домен сайта, с которого запускается этот скрипт, - безрезультатно. |
Цитата:
PS. Глянул кратко я API, во-первых там куча требований к сайтам, а во-вторых авторизация не в xmlhttp.open, а Basic в заголовках (хотя оно то и служит для этого). Вот так попробуйте: xmlhttp.open("POST", "https://api.cloudpayments.ru/test"); xmlhttp.setRequestHeader('Authorization', 'Basic ' + закодированная в base64 строка Public_ID:Пароль); |
Цитата:
Кстати, если написать обработчик события "onerror", то оно срабатывает. xmlhttp.onerror = function() { alert('Запрос не удался.'); }; Как можно узнать, в чем ошибка? xmlhttp.response возвращает пустую строку. |
xmlhttp.onerror = function(e) { alert(e.target.status); }; |
надо смотреть в консоль разработчика, например в хроме, https://developers.google.com/web/tools/chrome-devtools, там в разделе Network (Сеть), можно посмотреть отправленные запросы и полученные на них ответы...
скорее всего там будет на запорос: fetch('https://api.cloudpayments.ru/test').then(r => r.json).then(r => console.log(r)) будет ответ: Access to fetch at 'https://api.cloudpayments.ru/test' from origin 'http://localhost:5000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled. в хроме нельзя отправить запрос на другой домен, если этот домен не разрешил принимать запросы от других доменов что будет значить что либо чужой сервер должен проставить твой сайт в хидер Access-Control-Allow-Origin, либо надо на стороне своего сервера (что и делает постман) выполнять запрос на чужой сервер и потом его оправлять клиенту свой запрос -> свой сервер делает запрос -> на чужой сервер -> получаешь ответ... |
Цитата:
Цитата:
Unchecked runtime.lastError: The message port closed before a response was received. (index):826 Refused to set unsafe header "Content-Length" Test_PostRequest @ (index):826 (index):1 Access to XMLHttpRequest at 'https://api.cloudpayments.ru/test' from origin '<Наш сайт>' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. api.cloudpayments.ru/test:1 Failed to load resource: net::ERR_FAILED Что тоже не особо понятно. Цитата:
Но зато я сам понял, в чем была проблема. (Как говорил М.Задорнов, "Готовы? Готовы? Наберите воздуха в легкие!") После того как я вместо адреса "https://api.cloudpayments.ru/test" указал просто "api.cloudpayments.ru/test" всё пошло-поехало: и status = 200, и statusText = "OK". Как говорится, дурдом - он и в Африке дурдом. ) А сейчас - АНТРАКТ! )) |
И снова здравствуйте!
Осталась непонятной вот какая вещь. Если в браузере я введу: https://<Public ID>:<Пароль>@api.cloudpayments.ru/test То выходит следующее: {"Success":true,"Message":"bd6353c3-0ed6-4a65-946f-083664bf8dbd"} Вопрос: как программно получить эти "Success" и "Message"? Если я пишу так: var xmlhttp = new XMLHttpRequest(); function PostRequest() { xmlhttp.open("POST", "api.cloudpayments.ru/test", true); xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); xmlhttp.setRequestHeader('Authorization', 'Basic <Public ID:Пароль>'); xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState != 4) return; console.log( 'readyState = ' + xmlhttp.readyState + '; ' + 'status = ' + xmlhttp.status + '; ' + 'statusText = [' + xmlhttp.statusText + ']; ' + 'response = [' + xmlhttp.response + ']; ' ); }; xmlhttp.onerror = function(e) { alert(e.target.status); }; xmlhttp.send(); } то в консоли выходит вот что: readyState = 4; status = 200; statusText = [OK]; response = [<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta charset="utf-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0"><script>window.plp = {"page_id":2566432,"content_id":3660355,"lang":"ru","time":1594013128,"screens":"screens-xs-sm-lg","animations":{"section":{"type":"scroll"},"widget":{"type":"scroll"}}};window.plp_page_id = 2566432;window.plp_content_id = 3660355;window.plp_lang = "ru";window.lptag = "5764d9a6b5f0e614e83343b91213b6a1wSH3i/NAWTUih4ifMLkfIQXjMCBp/EVtRsYEfLQ14QFWarYOkubftii+QjKErCcY";window.error_handler = function (e, fn_id) { window.console && console.log && console.log(fn_id); ... Если же я пишу так: var xmlhttp = new XMLHttpRequest(); function PostRequest() { xmlhttp.open("POST", "api.cloudpayments.ru/test", true); xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); xmlhttp.setRequestHeader('Authorization', 'Basic <Public ID:Пароль>'); xmlhttp.responseType = "json"; xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState != 4) return; console.log( 'readyState = ' + xmlhttp.readyState + '; ' + 'status = ' + xmlhttp.status + '; ' + 'statusText = [' + xmlhttp.statusText + ']; ' + 'response = [' + JSON.stringify(xmlhttp.response) + ']; ' ); }; xmlhttp.onerror = function(e) { alert(e.target.status); }; xmlhttp.send(); } то в консоли выходит вот это: readyState = 4; status = 200; statusText = [OK]; response = [null]; |
Часовой пояс GMT +3, время: 14:50. |