2012-06-07 5 views
12

Ich bin ein wenig noob und habe keine Angst zuzugeben, dass ich arbeite an diesem Projekt als eine Lernerfahrung, um besser mit PHP und serverseitigen Skript/Handhabung.Wie bekomme ich die HTTP POST Anfrage von einem Shopify Webhook?

Ich versuche, eine Möglichkeit zu finden, Shopify zu verwenden und gleichzeitig eine Off-Server-Datenbank jedes Mal zu aktualisieren, wenn eine Bestellung in meinem Shopify-Einkaufswagen ausgeführt wird. Wenn zum Beispiel jemand etwas aus meinem Online-Shop kauft, möchte ich, dass mein Inventar meiner Home-Datenbanken aktualisiert wird, um anzuzeigen, dass es jetzt einen Artikel weniger hat.

Ich bin zu dem Schluss gekommen, dass der beste Weg, dies zu tun wäre, eine webhook notification, die eine HTTP-POST-Anfrage an meinen Server sendet, dann würde ich meinen Server fangen den POST und parse es in eine XML . Ich werde dann das XML über ein PHP-Skript lesen, das meine Datenbank aktualisiert.

Ich habe kein Problem mit dem PHP, aber was ich nicht herausfinden kann, ist wie man den Webhook auf meinem Server fängt. Webhook fragt mich nach einer URL, an die die POST-Anfrage gesendet werden soll, meine Frage an Sie ist; Was ist die URL?

Ich habe einige Nachforschungen angestellt und festgestellt, dass Sie die POST-Anfrage auf eine Reihe von Wegen abfangen können, durch HTML, PHP, Access-Control-Allow-Origin usw. Da ich aber noch neu darin bin, Ich verstehe nicht wirklich genau, wie man das macht. Ich habe es mit einem versteckten HTML-Aktionsformular versucht, aber es scheint nicht so zu sein, dass es das XML fängt.

Alles, was ich tun möchte, ist der Webhook senden seine POST-Anfrage, und habe es als .xml gefangen. Damit kann ich am Ende jeden Tages das XML lesen und die Datenbank entsprechend aktualisieren.

Wenn Sie eine bessere oder einfachere Möglichkeit finden, dies zu tun, bitte geben Sie mir Ihre Vorschläge. Ich möchte, dass dies sicher ist, daher kommen Methoden wie Access-Control-Allow-Origin nicht in Frage.

tl; dr: Was muss ich auf meinem Server tun, um eine Webhook-Benachrichtigung zu erhalten? Welches Skript sollte ich auf meinem Server haben, um es dem Webhook zu geben? Wie schreibe ich das Callback-Skript?

+0

Mit welcher Umgebung/welchem ​​Framework arbeiten Sie? Sie erwähnen PHP, aber keine Besonderheiten auf dem Webapp-Framework (Cake, Zend, etc.) –

+0

Shopify (was Ruby on Rails ist) und MySQL, ich möchte buchstäblich nur ein Skript erstellen ein XML, das ich mit PHP lesen kann. –

Antwort

25

Erstellen Sie eine öffentliche URL unter http://example.com/whatever.php, wobei example.com Ihr Domainname und whatever.php eine PHP-Datei ist, die Sie bearbeiten können.

Dann setzen Sie diesen Code in was auch immer.php:

<?php 
$webhookContent = ""; 

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

error_log($webhookContent); 
?> 

Dann im Shopify Admin können Sie einen neuen Webhook erstellen und an http://example.com/whatever.php Punkt, und wenn Sie das ‚Test Webhook‘ Button im Admin Shopify klicken, wird Shopify oben zu Ihrem Skript Post, die sollte den Body des Webhooks wiederum in dein PHP-Fehlerprotokoll schreiben.

+1

Wenn jemand keine funktionierende Fehlerprotokolldatei hat, dann können wir den gesamten Inhalt in die Textdatei schreiben, auch $ content = "hier ein Text". $ WebhookContent; $ fp = fopen ($ _ SERVER ['DOCUMENT_ROOT']. "/myText.txt","wb"); fwrite ($ fp, $ content); fclose ($ fp); – Rash

+0

file_get_contents ('php: // input') sollte genauso gut funktionieren. – ColinM

+2

Wie gehen Sie die Sicherheitsbedenken mit der öffentlich verfügbaren http-URL an? Ich meine, gibt es eine Möglichkeit, Webhooks nur auf diese URL zu posten und alle anderen Hits auf diese URLs sollten ignoriert werden? –

3

Es hört sich an, als wären Sie mit PHP bestens vertraut, daher werde ich darauf antworten.

Sie benötigen ein PHP-Skript/eine PHP-Seite, auf die Sie als öffentliche URL zugreifen können, die die in HTTP POST Shopify gesendeten Daten senden und in das Format Ihrer Datenbank konvertieren kann.

Hier ist ein Beispiel dafür, was der PHP-Skript aussehen könnte: http://wiki.shopify.com/WebHook#PHP_Example_w.2F_SimpleXML_.28PHP_5.2B.29

+0

Ehrlich gesagt, ich bin am vertrautesten mit Java und C#, ich habe mich noch nie mit Webentwicklung beschäftigt, immer mit Software. Dies ist mein erstes richtiges Abenteuer aus * Software * und in * web * –

+0

Ich verstehe immer noch nicht, wie man die .xml erstellt, es scheint nie zu funktionieren. –

+0

Sind Sie an dem Punkt in Ihrem Web/PHP Wissen, wo Sie eine "Hello, world" Seite mit einer öffentlichen URL erstellen können? –

1

Ihre Frage über die URL zu beantworten, ist dies der Endpunkt auf dem Server, der die Aufnahme das Webhook zu handhaben wird. Dies ist ziemlich einfach mit den meisten Web-Frameworks einzurichten, es muss nur die Post-Anfrage bearbeiten und mit 200 OK antworten.

Sobald Sie einen Endpunkt auf Ihrem Server eingerichtet haben, können Sie den Webhook auf shopify erstellen, wobei die URL der Endpunkt auf dem Webserver ist.

4

Sorry, ich habe nicht genug Ruf Kommentare zu schreiben, aber hier ist der Inhalt des toten Link von Edward Ocampo-Gooding Antwort:

PHP Beispiel w/SimpleXML (PHP 5 +)

das Skript unten zeigt Ihnen, wie in von Shopify in Ihr Skript, um die XML-Daten zu erhalten, archivieren Sie die Datei und die richtigen Header senden ...

Da der neue Abonnement-Setup, um in der admin der Webhaken ist: http://example.com/some-script.php?key=123456789

Inhalt von some-script.php auf 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 keine Daten mit dem gemeinsamen GET oder POST-Request-Methode übergeben. Sie können die fopen() - Methode in PHP verwenden und den php: // - Eingabestream übergeben.

Angenommen, Sie erstellen einen Webhook für die Aktualisierung des Warenkorbs und legen die URL http://example.com/cart_update_hook.php fest. Geben Sie dann den folgenden Code in die Datei cart_update_hook.php ein, um die Daten von shopify webhook zu erhalten.

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