Подтвердить что ты не робот

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

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

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

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

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

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

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

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

TL;DR: Что мне нужно делать на моем сервере, чтобы поймать уведомление в Интернете? Что script должен ли я иметь на своем сервере, чтобы дать веб-качку? Как написать обратный вызов script?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

Содержание некоторого script.php on 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 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 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();
?>

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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
?>