2012-06-07 11 views
12

Jestem trochę noobem, i nie boję się przyznać, że pracuję nad tym projektem jako doświadczeniem do nauki, aby lepiej z php i serveride script/obsługa ing.Jak złapać żądanie HTTP POST wysłane przez Shopify Webhook

Próbuję wymyślić sposób użycia Shopify i jednoczesnej aktualizacji bazy danych poza serwerem za każdym razem, gdy zamówienie jest realizowane z mojego koszyka Shopify. Na przykład ktoś kupuje coś ze swojego sklepu internetowego, chcę, aby aktualizował moje domowe bazy danych, aby wykazać, że ma teraz o jedną pozycję mniej.

Doszedłem do wniosku, że najlepszym sposobem na zrobienie tego byłoby ustawienie webhook notification, które wysyła żądanie HTTP POST do mojego serwera, wtedy mój serwer złapałby POST i przetworzył go na XML . Następnie odczytam XML za pomocą skryptu php, który zaktualizuje moją bazę danych.

Nie mam problemu z php, ale nie mogę się domyślić, jak złapać webhook na moim serwerze. Webhook prosi mnie o adres URL do wysłania żądania POST, moje pytanie do ciebie; jaki jest adres URL?

Zrobiłem kilka badań i okazało się, że można złapać wniosek POST na wiele sposobów, przez html, php, Access-Control-Allow-Origin, itp. Jednak, ponieważ wciąż jestem nowy w tym, Nie bardzo rozumiem, jak to zrobić. Próbowałem już z ukrytą formą działania HTML, ale nie mogłem go złapać za XML.

Wszystko, co chcę zrobić, to to, że webhook wysyła swoje żądanie POST i ma zostać przechwycony jako .xml. Tak, że mogę przeczytać xml na koniec każdego dnia i odpowiednio zaktualizować bazę danych.

Jeśli możesz wymyślić lepszy lub prostszy sposób na zrobienie tego, proszę o wszelkie sugestie. Chciałbym, żeby to było bezpieczne, więc metody takie jak Access-Control-Allow-Origin nie wchodzą w grę.

tl; dr: Co muszę zrobić na moim serwerze, aby wykryć powiadomienie z webhook? Jaki skrypt powinienem umieścić na moim serwerze, aby udostępnić webhook? Jak napisać skrypt wywołania zwrotnego?

+0

Z jakim środowiskiem/ramami współpracujesz? Wspominałeś o PHP, ale nie ma żadnych szczegółów na temat frameworka webapp (Cake, Zend itp.) –

+0

Shopify (który jest Ruby on Rails) i MySQL, dosłownie chcę tylko skryptu, aby utworzyć xml, który mogę odczytać za pomocą php. –

Odpowiedz

25

Utwórz publiczny adres URL pod adresem http://example.com/whatever.php, gdzie example.com to nazwa Twojej domeny, a whatever.php to plik PHP, który możesz edytować.

Następnie wprowadź ten kod w cokolwiek.php:

<?php 
$webhookContent = ""; 

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

error_log($webhookContent); 
?> 

Następnie w admin Shopify można utworzyć nowy webhook i skierować go na http://example.com/whatever.php, a po kliknięciu przycisku „Test webhook” w admin Shopify, Shopify będzie POST do skryptu powyżej, który powinien z kolei napisać treść webhooka do swojego logu błędów PHP.

+1

jeśli ktoś nie ma działającego pliku dziennika błędów, możemy napisać całą treść w pliku tekstowym również $ content = "tekst tutaj" $ webhookContent; $ fp = fopen ($ _ SERVER ['DOCUMENT_ROOT']. "/myText.txt", "wb"); fwrite ($ fp, $ content); fclose ($ fp); – Rash

+0

file_get_contents ('php: // input') powinno działać równie dobrze. – ColinM

+2

Jak rozwiązać problemy związane z bezpieczeństwem za pomocą adresu URL http, który jest publicznie dostępny? Chodzi mi o to, czy istnieje sposób na zezwalanie Webhookom na publikowanie tego adresu URL, a wszelkie inne trafienia w tych adresach URL powinny być ignorowane? –

3

Wygląda na to, że znasz PHP, więc odpowiem na to.

Potrzebujesz skryptu/strony PHP, który jest dostępny jako publiczny URL, który może pobrać dane wysłane w HTTP POST. Shopify wysyła cię i przekształca w formę, jakiej oczekuje twoja baza danych.

Oto przykład, co to skrypt PHP może wyglądać tak: http://wiki.shopify.com/WebHook#PHP_Example_w.2F_SimpleXML_.28PHP_5.2B.29

+0

Prawdę mówiąc, jestem najbardziej zaznajomiony z Javą i C#, nigdy nie zajmowałem się tworzeniem stron internetowych, zawsze trzymałem się oprogramowania. To jest moja pierwsza prawdziwa przygoda z * oprogramowania * i do * web * –

+0

Nadal nie rozumiem, jak faktycznie utworzyć .xml, nigdy nie wydaje się działać. –

+0

Czy jesteś w punkcie swojej wiedzy o web/PHP, gdzie możesz stworzyć stronę "Hello, world" pod publicznym adresem URL? –

1

Aby odpowiedzieć na pytanie o zawartość, to jest punkt końcowy na serwerze, który ma obsługiwać otrzymaniu webhook. Jest to dość proste do skonfigurowania w większości frameworków internetowych, wystarczy obsłużyć żądanie postu i odpowiedzieć 200 OK.

Po skonfigurowaniu punktu końcowego na serwerze można utworzyć webhook w usłudze shopify z adresem URL będącym punktem końcowym na serwerze internetowym.

4

Niestety, nie mam wystarczająco dużo reputacji, aby dodawać komentarze, ale tutaj jest zawartość martwy link od Edwarda Ocampo-Gooding za odpowiedź:

PHP przykładu w/SimpleXML (PHP 5+)

poniższy skrypt pokazuje, jak uzyskać dane XML z Shopify do skryptu, zarchiwizować plik i przesłać odpowiednie nagłówki ...

Biorąc pod uwagę, że nowa konfiguracja subskrypcji porządek w admin dla webhook to: http://example.com/some-script.php?key=123456789

Zawartość jakiegoś-script.php na 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(); 
?> 
-1

Shopify webhook nie przeszły danych przy użyciu wspólnej metody GET lub żądania POST. Możesz użyć metody fopen() w PHP i przekazać strumień wejściowy php: //.

Załóżmy, że utworzysz webhook do aktualizacji koszyka i ustaw URL http://example.com/cart_update_hook.php, a następnie wpisz następujący kod w cart_update_hook.php, aby uzyskać dane wysłane przez shophook.

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