Задать вопрос
  • Как правильно подключиться через PHP SOAP к API booking-manager?

    @Hanneman
    Выношу в ответ: ошибки технической нет, так как, применяя ваши реальные параметры авторизации, все работает. Что касается ошибки 102, то это функциональная логическая ошибка со стороны сервера - ему не нравится значение компании 635, так как элементарно подставляя компанию с идентификатором 634, все работает на техническом уровне и ответ возвращается корректный (проверьте, что не так с компанией 635):

    P.S. Уберите реальные данные авторизации из темы и из вашего ответа кода (на всякий случай).

    Запрос:
    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:cbm="http://cbm.mmk.com">
        <soapenv:Header/>
        <soapenv:Body>
            <cbm:getAvailabilityInfo>
                <cbm:in0>2547</cbm:in0>
                <cbm:in1>info@xxxx-xxxxxxx.de</cbm:in1>
                <cbm:in2>yourPassword</cbm:in2>
                <cbm:in3>634</cbm:in3>
                <cbm:in4>2019</cbm:in4>
                <cbm:in5>false</cbm:in5>
                <cbm:in6>1970-01-01T03:00:00</cbm:in6>
            </cbm:getAvailabilityInfo>
        </soapenv:Body>
    </soapenv:Envelope>


    Ответ:
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Body>
            <ns1:getAvailabilityInfoResponse xmlns:ns1="http://cbm.mmk.com">
                <ns1:out><![CDATA[<root company_id="634" checktime="1566366427662">
    <reservation id="1806870766300634" resourceid="279865120000100634" status="Reservation" blocksavailability="1" datefrom="2018-12-31" dateto="2019-01-14" basefrom="85" baseto="85" optionexpirydate="2018-08-22" created="2018-08-15" lastmodified="2018-08-15" companyid="634" />
    <reservation id="2090990766300634" resourceid="1684801290000100634" status="Reservation" blocksavailability="1" datefrom="2019-02-04" dateto="2019-02-07" basefrom="85" baseto="85" optionexpirydate="2019-02-05" created="2019-02-04" lastmodified="2019-02-04" companyid="634" />
    <reservation id="2206700766300634" resourceid="1684387260000100634" status="Canceled" blocksavailability="0" datefrom="2019-12-13" dateto="2019-12-25" basefrom="85" baseto="85" optionexpirydate="2019-06-05" created="2019-05-28" lastmodified="2019-06-06" companyid="634" />
    <reservation id="1818390766300634" resourceid="279866040000100634" status="Reservation" blocksavailability="1" datefrom="2019-03-16" dateto="2019-03-26" basefrom="85" baseto="85" optionexpirydate="2018-08-23" created="2018-08-16" lastmodified="2018-08-16" companyid="634" />
    <reservation id="2198150766300634" resourceid="2178580766300634" status="Canceled" blocksavailability="0" datefrom="2019-08-17" dateto="2019-08-24" basefrom="85" baseto="85" optionexpirydate="2019-05-26" created="2019-05-20" lastmodified="2019-05-27" companyid="634" />
    </root>]]></ns1:out>
            </ns1:getAvailabilityInfoResponse>
        </soap:Body>
    </soap:Envelope>
    Ответ написан
    Комментировать
  • Как сделать такую переадресацию вызова?

    @Hanneman
    Если речь о мобильной (сотовой) связи, то тогда можете обратиться с оператору: у каждого оператора есть сервис, зачастую именуемый как MVPN (под таким именем позиционируют, хотя реализация схемы очень динамична и может быть имплементирована у оператора на разных уровнях сети, строя логику в том же самом CAMEL Gateway, в котором как раз и происходит логическая обработка и маршрутизация звонков по признакам и условиям). Суть такова - обработка входящих и исходящих звонков ведется на уровне Intelligent Network с использованием протоколов INAP/CAMEL, с помощью которых легко настраивается то, о чем вы пишете. Единственное условие: как правило, сервисы подобного типа не предоставляются физическим лицам - уточните у оператора.
    Ответ написан
  • Как отправить json файл?

    @Hanneman
    Endpoint работает, но токен устарел:
    POST /core/latest/api/devices/343438357237630F/downlinkMessages HTTP/1.1
    Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw
    Content-type: application/json
    Accept: application/json
    Content-Length: 44
    Host: dx-api-ru1.thingpark.com
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
    
    {"payloadHex": "030100", "targetPorts": "2"}


    Ответ от сервера:
    HTTP/1.1 400 Bad Request
    Server=nginx
    Date=Mon, 05 Aug 2019 14:25:40 GMT
    Content-Length=103
    Connection=keep-alive
    {
      "code" : 400,
      "message" : "Bad request: Invalid token or token has expired",
      "errorId" : null
    }


    Вот сам CURL:
    curl -s -X POST -H "Content-type: application/json" -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw' -d '{"payloadHex": "030100", "targetPorts": "2"}' https://dx-api-ru1.thingpark.com/core/latest/api/devices/343438357237630F/downlinkMessages


    Ну и разжеванный код на PHP:
    <?php
        $url = 'https://dx-api-ru1.thingpark.com/core/latest/api/devices/343438357237630F/downlinkMessages';
        $ch = curl_init($url);
        $data = array(
            'payloadHex' => '030100',
            'targetPorts' => '2'
        );
        $payload = json_encode($data);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json', 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJTVUJTQ1JJQkVSOjEwMDAwMDA3NSJdLCJleHAiOjM2NzIxNDY2NTEsImp0aSI6ImY4MDFkODcyLWNlYjMtNDY0MS1iNmZiLWU2N2NlZmM0MGMzYiIsImNsaWVudF9pZCI6ImVydGVsZWNvbS1hcGkvdmFydmFyYS5ydWRlbmtvMUBkb21ydS5ydSJ9.kdQqIHpVdTE-1N5K9cTC872TkzhCKMIH0uU2FGWHW3n3nSGiDlP5pG5rs4jb_4xRmvZ4hJ20IsgXNj5-hcmuw'));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        echo $result = curl_exec($ch);
        curl_close($ch);
    ?>
    Ответ написан
    Комментировать
  • Почему не работает код?

    @Hanneman
    Потому что надо экранировать
    while($row = mysqli_fetch_assoc($query)) echo "<h1><div class=\"film-card\">".$row['name']."</h1></div><p>".$row['year']."</p><br>";
    Ответ написан
    1 комментарий
  • Как подключить сервис бронирования по SOAP XML API к сайту на wordpress?

    @Hanneman
    Здесь проблема в том, что ваше понимание сути того, что необходимо сделать, расходится с реальным положением дел.

    Скажем так: вам «подключение сервиса бронирования» кажется задачей на раз-два: есть некий WSDL у них, а у вас WordPress, – так что бы такое в WordPress включить, чтобы вся та информация с того сайта красиво отобразилась бы у вас на странице.

    SOAP API – это интерфейс, позволяющий получать данные или их логические порции. Порядком вызова методов SOAP API, обработкой информации, построением логики вызовов и сборкой этих данных должны заниматься вы, а не WordPress – то есть необходимо написать некий серверный сценарий, который будет общаться с SOAP API, вызывая методы в нужном вам, и в какой-то мере определенной логикой сервиса, порядке.

    Т.е. SOAP API не дает вам за один присест получить какой-то правильный набор данных вместе с логикой – это интеракция, которая основана на сборе данных их формы, расположенной на вашем сайте, компоновке запроса в формате SOAP, получении данных в ответе, при необходимости, вызове следующего метода (или методов) SOAP API, обработке ответа, и подстановка структурированных данных из ответа в тот же самый HTML вашей страницы.

    Допустим, ваш посетитель сайта хочет получить список свободных яхт, удовлетворяющих условиям (указанным им же в форме поиска на сайте) - клиент ищет яхту на Кипре, на 15-е июля, на 4-х человек, цена 500-800$, с рулевым, плюс какие-то дополнительные параметры. После нажатия символической кнопки «Искать» данные из формы передаются в некий серверный скрипт, в котором описана логика взаимодействия с SOAP API.

    Далее будет приблизительное и возможное описание логики (за подробной в документацию) – как это может выглядеть.

    Скрипт:
    1. Берет параметры из формы
    2. Вызывает, к примеру, метод «getBases», передавая код страны аргументом
    3. Получает список портов
    4. Вызывает, к примеру, метод «getResources», передавая код порта (или коды портов) аргументом
    5. Получает список яхт
    6. Вызывает, к примеру, методы «isResourceAvailable» и «getReservations», передавая желаемые даты
    7. Получает ответы
    8. Отображает на странице
    9. Пользователь нажимает «Подробно» на конкретном варианте
    10. Скрипт вызывает, к примеру, методы «getResourceDetails», «getResourceDiscount» и «getActiveReservation»
    11. Отображает подробное описание яхты с параметрами скидок, графика, цены
    12. Пользователь нажимает «Заказать»
    13. Заполняет форму с данными пасажиров
    14. Скрипт заносит данные, вызывая методы «insertCrewMember» и «confirmReservation»
    15. Пользователь нажимает «Оплатить»
    16. Скрипт заносит данные, вызывая метод «insertPayment» и производит все, связанное с оплатой, вызывает «getInvoices» и отправляет его на почту пользователю.

    Все выше – это приблизительный сценарий, само собой. Если вы внимательно посмотрите на доступные методы (они все описаны в документации), то вынесете идею из всего этого – методы представляют собой логически завершенные единицы получения/занесения информации. Это логические блоки, которые вы вызываете в том порядке, который подходит вашей логике – в этом смысл такого рода API: есть страна – смотрим, есть ли такая в базе, если есть страна в списке обслуживаемых – то какие порты, есть порты – то какие яхты есть вообще там, если есть яхты – то смотрим, удовлетворяют ли заданным пользователем характеристикам, отображаем на странице списком, пользователь выбирает детальную информацию – берем детальную, отображаем, пользователь начинает процесс – вызываем методы резервации и оплаты и т.д. Все зависит от вашей бизнес-логики. Да, конечно, могут быть у них и веб-сервисы, которые за раз (за один запрос) могут принимать на вход все параметры, указанные пользователем в форме (зависит от разработчика на стороне того сервиса яхт - но стоит помнить, что в программировании приветствуется принцип "один метод - одна задача") - страна, порт, количество людей, время, ценовой диапазон и пр., но это опять же не меняет суть - поиск осуществляться будет посредством вызова одного метода, резервация - вызовом другого, оплата - вызовом третьего и т.д.

    Так что здесь нет какой-то простой интеграции API с WordPress - чтобы «одним нажатием» бизнес-логику наворотить. Это не только вёрстка, а программная логика многошаговой интеракции с пользователем плюс отображение на странице.

    Ну а сам XML-SOAP запрос-ответ выглядит так

    Запрос:
    POST /cbm_web_service2/services/CBM HTTP/1.1
    Accept-Encoding: gzip,deflate
    Content-Type: text/xml;charset=UTF-8
    SOAPAction: ""
    Content-Length: 352
    Host: www.booking-manager.com
    Connection: Keep-Alive
    User-Agent: Apache-HttpClient/4.1.1 (java 1.5)

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:cbm="http://cbm.mmk.com">
       <soapenv:Header/>
       <soapenv:Body>
          <cbm:getCompanies>
             <cbm:in0>1000</cbm:in0>
             <cbm:in1>username</cbm:in1>
             <cbm:in2>password</cbm:in2>
          </cbm:getCompanies>
       </soapenv:Body>
    </soapenv:Envelope>


    Ответ (здесь код 500, так как у меня же нет реальных username/password - но это не суть важно)
    HTTP/1.1 500 Internal Server Error
    Date: Mon, 01 Jul 2019 06:58:23 GMT
    Server: Apache/2.4.25 (Debian)
    Content-Type: text/xml;charset=UTF-8
    Connection: close
    Transfer-Encoding: chunked

    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Body>
            <soap:Fault>
                <faultcode>soap:Server</faultcode>
                <faultstring>XML disabled for company 1000</faultstring>
                <detail>
                    <errorcode>-1</errorcode>
                    <errormessage>XML disabled for company 1000</errormessage>
                </detail>
            </soap:Fault>
        </soap:Body>
    </soap:Envelope>
    Ответ написан
  • MS SQL Server 2017, что устанавливать?

    @Hanneman
    Скачайте MS SQL Server Express Edition одним файлом и установите, как делает это 100% населения планеты.

    Для работы с сервером скачайте MS SQL Management Studio и установите.

    Если есть ошибки, то их обычно указывают в теле вопроса, чтобы остальным не приходилось бы гадать.
    Ответ написан
  • Какой офисный продукт эффективно работает с большими таблицами и поддерживает разные форматы?

    @Hanneman
    MS Access. Свободно импортируете туда ваш csv-файл, каждое поле которого заносится в соответствующее поле таблицы базы данных.
    Далее уже - дело техники, так как MS Access и предназначен как раз для работы с табличными данными, и данные большого объема он умеет обрабатывать.
    Если же хотите более "навороченный" вариант, то установите MS SQL Server Express Edition (он бесплатен), импортируйте csv в таблицу его базы, а потом работайте через MS SQL Management Studio (тоже бесплатный продукт).
    Ответ написан
    Комментировать
  • Что за стиль у этого дизайна сайта?

    @Hanneman
    Обычный Bootstrap.
    Ответ написан
    Комментировать
  • Есть софт сохраняющий лог, как удалять старые логи из папки?

    @Hanneman
    Используйте штатный logrotate.
    Ответ написан
    Комментировать
  • Как в консоли SSH следить за работой PHP?

    @Hanneman
    Запустите от пользователя root (ну или через sudo) и наблюдайте за трафиком:

    tcpdump -vvv -i any port 80

    Это самый банальный пример для tcpdump с минимальным количеством опций. Если нужно что-то добавить или изменить (порт, например) - в сети масса примеров.
    Ответ написан
    2 комментария
  • Что такое основы ООП?

    @Hanneman
    Статья на Wikipedia. Для ознакомления. Здесь вряд ли кто-то будет вам писать отсебятину, которая превысит объем этой статьи.
    Ответ написан
    Комментировать
  • Существует ли в мире бесплатное дистанционное образование?

    @Hanneman
    Ответ написан
    Комментировать
  • Как скачать форум phpBB через wget?

    @Hanneman
    Защита стоит на User Agent. Обманите элементарно, выдав wget за браузер с помощью:
    wget -U "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)" "http://hummerxclub.com/forum/viewtopic.php?f=22&t=8129"
    Ответ написан
    2 комментария
  • Видят ли поисковые системы PHP код?

    @Hanneman
    Не видят. Ваш вопрос говорит о непонимании структуры клиент-серверных приложений (это не камень в ваш огород, а просто совет куда копать).

    Поисковик, по сути, делает то же самое, что и любой пользователь, который посещает ваш сайт - поисковик запрашивает URL страницы, сервер обрабатывает запрос (как если бы этот же URL запросил через браузер обычный пользователь) и отдает содержимое в ответ. У обычного пользователя ответ обрабатывается браузером, в результате чего компонуется страница, а у поисковика этот ответ обрабатывается своим приложением, которое представляет собой сложнейшую аналитическую программу (если так можно назвать).

    Как правило, поисковики (для самоидентификации) при посещении страницы используют свой собственный User Agent в заголовке, когда обращаются на URL - это, во-первых, этично, во-вторых - чтобы статистику не накручивать, в третьих (самое главное) - дать возможность автору сайта скрыть страницы или каталоги от индексации их поисковиков (директива прописывается в robots.txt).

    Ну и, если интересно, то поисковики также (для "облегчения" слепого поиска по ссылкам) могут читать файлы карт сайта (так называемый sitemap). За создание таких файлов ответственен сам автор сайта - либо создается вручную (ручками или своим скриптом), либо их генерирует какой-нибудь плагин. Файл представляет собой XML-структуру, в которой перечислены адреса (URL) страниц сайта. Как правило, такой файл называется sitemap.xml (с таким названием поисковик ищет в корне сайта по умолчанию), но можно задавать любое другое имя (об этом необходимо извещать поисковик, регистрируя свой сайт в соответствующем приложении типа webmaster каждого поисковика) и указывая имя такого файла-карты в профиле сайта.
    Ответ написан
    Комментировать
  • Где искать удаленку за бугром?

    @Hanneman
    xing.com
    glassdoor.com
    Всё зависит от вашей квалификации, потому что ваш вопрос с такими "подробностями" - это если вы как бы спросили бы меня готов ли я взять вас на работу и платить вам на руки 3000$, не имея представления о вас и ваших навыках.
    Размещаете свое резюме и портфолио, а потом шлите свой профиль на вакансии. Здесь писать нечего, так как "универсального" метода по теме "как проходить интервью" с вами не существует.
    Ответ написан
  • Как реализовать смс валидацию номера перед регистрацией в форме?

    @Hanneman
    Схема предельно проста:
    1. Заключаете договор с компанией, занимающейся рассылкой СМС, например CMC Аэро
    2. Получаете доступ к их API
    3. При регистрации пользователя генерируете код, например 234567, сохраняете в базе
    4. Отправляете через API СМС пользователю
    5. Пользователь вводит код в форму
    6. Сверяете с тем, что в базе

    Ну вот и всё.
    Ответ написан
    Комментировать
  • Как государство мониторит "запрещенный" контент?

    @Hanneman
    Не понимаю, почему вы задаете этот вопрос. А как работают поисковики? Как поисковики знают, где продают электроудочки, а где надувных женщин? Что мешает ФСБ индексировать сайты и их контент? Что им мешает получать данные индексации от того же самого Яндекса? Забрали информацию о сайтах - передали провайдеру для блокировки. Аналогично, на основании "письма АБВГД-123456 за 25 Марта сего года" обязали Яндекс в неделю раз присылать обновленный индекс. Опять же, провайдеру для блокировки. И так далее. Я уже не говорю про банальную прозрачность HTTP и про Deep Packet Inspection вместе с подменами сертификатов в стиле Man-in-the-middle. Но если это и уже о чём-то, то с тем, о чем я в начале текста написал, какие проблемы с индексацией этой информации у ФСБ и прочих органов?
    Ответ написан
    3 комментария
  • MySQL+PHP: Почему не могу записать данные в структуру?

    @Hanneman
    В коде принято выводить и обрабатывать ошибки - возьмите за правило.

    В коде хотя бы сейчас:
    1. Выведите сформированный запрос на экран с помощью print.
    2. Его же и с консоли в базу напрямую запустите.

    Если не сработает, смотрите соответствия типа данных с полями таблицы.

    Ну а далее сюда скиньте, так как без ошибок и конфигурации полей мало кто вам чем поможет.
    Ответ написан
    1 комментарий
  • Как подключиться к mysql серверу с другого сервера?

    @Hanneman
    Тот факт, что внешний доступ открыт в настройках базы, не отменяет того, что в настройках firewall на том самом сервере открыт порт.
    Порт может быть и отличным от стандартного 3306.
    В настройках базы внешний доступ может быть открыт не для всех IP.
    Для таких целей, если не имеется доступа прямого на тот сервер (чтобы проверить настройки), берете типичный анализатор пакетов, например, Wireshark, запускаете локально и смотрите, что там у вас на уровне TCP в момент подключения. Ну или, если Linux локально, то можно и tcpdump-ом смотреть.
    Пока что эти шаги выполните, напишите что и как, а дальше посмотрим.
    Ответ написан
    1 комментарий