Как поймать HTTP-запрос POST, отправленный Shopify Webhook

Я немного нуб, и не боюсь признаться, что я работаю над этим проектом в качестве учебного опыта, чтобы поправиться с обработкой скриптов php и serveride.

Я пытаюсь придумать способ использования Shopify и одновременно обновлять базу данных без сервера каждый раз, когда заказ выполняется из моей корзины Shopify. Так, например, кто-то покупает что-то из моего интернет-магазина, я хочу, чтобы он обновил инвентарь домашних баз данных, чтобы показать, что теперь у него есть еще один элемент.

Я пришел к выводу, что лучший способ сделать это – настроить уведомление о веб-хостинге, которое отправит HTTP-запрос POST на мой сервер, а затем я попрошу сервер поймать POST и проанализировать его в XML. Затем я прочитаю XML через php-скрипт, который обновит мою базу данных.

У меня нет проблем с php, но я не могу понять, как поймать webhook на моем сервере. Webhook запрашивает у меня URL-адрес для отправки запроса POST, мой вопрос вам; что такое URL?

Я провел некоторое исследование и обнаружил, что вы можете поймать POST-запрос несколькими способами: через html, php, Access-Control-Allow-Origin и т. Д. Однако, поскольку я еще новичок в этом, я не действительно понять, как это сделать. Я пробовал с HTML скрытой формой действия, но не мог заставить его поймать XML.

Все, что я хочу сделать, это заставить веб-хост отправить свой запрос POST и поймать его как .xml. Чтобы я мог прочитать xml в конце каждого дня и соответствующим образом обновить базу данных.

Если вы можете подумать о лучшем или более простом способе сделать это, непременно предложите свои предложения. Я бы хотел, чтобы это было безопасно, поэтому такие методы, как Access-Control-Allow-Origin, не могут быть и речи.

tl; dr: Что мне нужно сделать на моем сервере, чтобы поймать уведомление о веб-узле? Какой сценарий должен иметь на моем сервере, чтобы передать веб-сайт? Как написать сценарий обратного вызова?

Создайте общедоступный URL-адрес по адресу http://example.com/whatever.php , где example.com – ваше доменное имя, а what.php – это файл PHP, который вы можете редактировать.

Затем поместите этот код в what.php:

<?php $webhookContent = ""; $webhook = fopen('php://input' , 'rb'); while (!feof($webhook)) { $webhookContent .= fread($webhook, 4096); } fclose($webhook); error_log($webhookContent); ?> 

Затем в администраторе Shopify вы можете создать новый webhook и указать его по адресу http://example.com/whatever.php , а когда вы нажмете кнопку «test webhook» в администраторе Shopify, Shopify отправит POST на ваш сценарий выше, который должен, в свою очередь, написать тело webhook в ваш журнал ошибок PHP.

Извините, у меня недостаточно репутации, чтобы публиковать комментарии, но вот содержание мертвой ссылки из ответа Эдварда Окампо-Гудинга:

Пример PHP с SimpleXML (PHP 5+)

В приведенном ниже сценарии показано, как получить данные XML из Shopify в свой скрипт, архивировать файл и отправить соответствующие заголовки …

Учитывая, что новая настройка подписки заказа в admin для веб-камеры: http://example.com/some-script.php?key=123456789

Содержание some-script.php на http://example.com/ :

 <? // Protect URL from rogue attacks/exploits/spiders // Grab from GET variable as given in Shopify admin URL // for the webhook // // NOTE: This is not necessary, just a simple verification // // A digital signature is also passed along from Shopify, // as is the shop's domain name, so you can use one or both of those // to ensure a random person isn't jacking with your script (or some // spider just randomly hitting it to see what's there). // // If $key doesn't matched what should be passed in from the // webhook url, the script simply exits $key = $_GET['key']; if ($key != '123456789') { header('HTTP/1.0 403 Forbidden'); exit(); } // Variables used for processing/saving $xmlString = ; // Used to get data from Shopify into script $name = ; // Saves the billing address name to be used for later ... $email = ; // Save the email address of the user to be used for later ... $productTitles = array(); // Saves all titles of products purchased to be used for later ... // Get XML data and read it into a string for use with SimpleXML // Thanks to David Oxley (http://www.numeriq.co.uk) for help with this $xmlData = fopen('php://input' , 'rb'); while (!feof($xmlData)) { $xmlString .= fread($xmlData, 4096); } fclose($xmlData); // Save order XML in file in orders directory // This creates a file, write the xml for archival purposes, and closes the file ... // If the file already exists, it appends the data ... this should create a separate // file for every order but if two orders are processed the same second, they'll both // be in the same file file_put_contents('orders/order' . date('md-y') . '-' . time() . '.xml', $xmlString, FILE_APPEND); // Use SimpleXML to get name, email, and product titles // SimpleXML allows you to use the $xml object to easily // retrieve the data ... // Please note, if hyphens are used in the xml node, you must // surround the call to that member with {'member-name'} as is // shown below when getting the billing-address name & the // line items $xml = new SimpleXMLElement($xmlString); $name = trim($xml->{'billing-address'}->name); $email = trim($xml->email); // Create productTitles array with titles from products foreach ($xml->{'line-items'}->{'line-item'} as $lineItem) { array_push($productTitles, trim($lineItem->title)); } // You would then go on using $name, $email, $productTitles in your script // to do whatever the heck you please ... // Once you are done doing what you need to do, let Shopify know you have // the data and all is well! header('HTTP/1.0 200 OK'); exit(); // If you want to tell Shopify to try sending the data again, ie something // failed with your processing and you want to try again later header('HTTP/1.0 400 Bad request'); exit(); ?> 

Похоже, вы больше всего знакомы с PHP, поэтому я отвечу на это.

Вам нужен PHP-скрипт / страница, доступная как общедоступный URL-адрес, который может принимать данные, отправленные в HTTP POST Shopify, и отправляет вас в форму, которую хочет ваша база данных.

Вот пример того, как выглядел бы этот PHP-скрипт: http://wiki.shopify.com/WebHook#PHP_Example_w.2F_SimpleXML_.28PHP_5.2B.29

Чтобы ответить на ваш вопрос об URL-адресе, это конечная точка на вашем сервере, которая будет обрабатывать получение webhook. Это довольно просто настроить большинство веб-фреймворков, просто нужно обработать почтовый запрос и ответить на 200 OK.

После того, как у вас есть конечная точка, настроенная на вашем сервере, вы можете создать веб-хостинг на сайте, чтобы URL-адрес был конечной точкой на веб-сервере.

Shopify webhook не передает данные с использованием общего метода запроса GET или POST. Вы можете использовать метод fopen () в PHP и передать входной поток php: //.

Предположим, вы создали webhook для обновления корзины и установили URL http://example.com/cart_update_hook.php, а затем поместите следующий код в cart_update_hook.php, чтобы получить данные, отправленные shopify webhook.

 <?php $webhookContent = ""; $webhook = fopen('php://input' , 'rb'); while (!feof($webhook)) { $webhookContent .= fread($webhook, 4096); } fclose($webhook); $data = json_decode($webhookContent, true); //do whatever you want with the data ?>