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

Я несколько noob, и не боюсь признать, что я работаю над этим проектом в качестве учебного опыта, чтобы стать лучше с обработкой php и serverside script/ing.

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

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

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

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

все, что я хочу сделать, это чтобы webhook отправил свой запрос POST и поймал его как .XML. Так что я могу читать xml в конце каждого дня и обновлять базу данных соответственно.

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

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

5 ответов


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

затем поместите этот код во что угодно.на 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 опубликует ваш скрипт выше, который должен в включите запись тела webhook в журнал ошибок PHP.


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

PHP пример w / SimpleXML (PHP 5+)

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

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

содержимое некоторого скрипта.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('m-d-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, i.e. 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. Это довольно просто настроить с большинством веб-фреймворков, ему просто нужно обработать запрос post и ответить 200 OK.

Как только у вас есть конечная точка, настроенная на вашем сервере, вы можете создать webhook на shopify с URL-адресом, являющимся конечной точкой на веб-сервере.


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

Предположим, вы создаете webhook для обновления корзины и устанавливаете URLhttp://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
?>