15

我有点像个菜鸟,并且不怕承认这一点,我正在从事这个项目作为学习经验,以便更好地使用 php 和服务器端脚本/ing 处理。

我试图想出一种方法来使用 Shopify 并在每次从我的 Shopify 购物车中完成订单时同时更新服务器外数据库。例如,有人从我的在线商店购买了东西,我希望它更新我的家庭数据库库存以显示它现在少了一件商品。

我得出的结论是,最好的方法是设置一个webhook 通知,将 HTTP POST 请求发送到我的服务器,然后让我的服务器捕获 POST 并将其解析为 XML。然后,我将通过一个 php 脚本读取 XML,该脚本将更新我的数据库。

我的 php 没有问题,但我似乎无法弄清楚如何在我的服务器上捕获 webhook。Webhook 向我询问发送 POST 请求的 URL,我的问题是;网址是什么?

我做了一些研究,发现您可以通过 html、php、Access-Control-Allow-Origin 等多种方式捕获 POST 请求。但是,由于我还是新手,所以我不真正了解如何做到这些。我尝试过使用 HTML 隐藏操作表单,但似乎无法让它捕获 XML。

我想做的就是让 webhook 发送它的 POST 请求,并将它作为 .xml 捕获。这样我就可以在每天结束时读取 xml,并相应地更新数据库。

如果您能想到更好或更简单的方法来做到这一点,请务必给我您的建议。我希望这是安全的,所以像 Access-Control-Allow-Origin 这样的方法是不可能的。

tl;dr:我必须在服务器上做什么才能捕获 webhook 通知?我的服务器上应该有什么脚本来提供给 webhook?如何编写回调脚本?

4

5 回答 5

31

在http://example.com/whatever.php创建一个公共 URL ,其中 example.com 是您的域名,whatever.php 是您可以编辑的 PHP 文件。

然后把这段代码放到whatever.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,当您单击 Shopify 管理员中的“测试 webhook”按钮时,Shopify 将发布到您上面的脚本,这应该反过来将 webhook 的主体写入您的 PHP 错误日志。

于 2012-06-11T18:31:26.890 回答
4

抱歉,我没有足够的声誉发表评论,但这里是 Edward Ocampo-Gooding 的回答中的死链接的内容:

PHP 示例 w/ SimpleXML (PHP 5+)

下面的脚本向您展示了如何将 XML 数据从 Shopify 获取到您的脚本中、归档文件并发送正确的标题...

鉴于 webhook 管理员中的新订单订阅设置为:http ://example.com/some-script.php?key=123456789

http://example.com/上 some-script.php 的内容:

<?     
// 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();
?>
于 2015-04-21T15:11:13.267 回答
3

听起来你对PHP最熟悉,所以我会根据它来回答。

您需要一个可作为公共 URL 访问的 PHP 脚本/页面,该 URL 可以获取 Shopify 发送给您的 HTTP POST 中发送的数据并将其转换为您的数据库所需的形式。

这是 PHP 脚本的示例:http ://wiki.shopify.com/WebHook#PHP_Example_w.2F_SimpleXML_.28PHP_5.2B.29

于 2012-06-07T19:17:52.050 回答
1

要回答有关 URL 的问题,这是您服务器上将处理接收 webhook 的端点。这对于大多数 Web 框架来说设置起来非常简单,它只需要处理 post 请求并以 200 OK 响应。

一旦您在服务器上设置了端点,您就可以在 shopify 上创建 webhook,其中 URL 是网络服务器上的端点。

于 2012-06-10T22:06:05.717 回答
-1

Shopify webhook 不使用常见的 GET 或 POST 请求方法传递数据。您可以在 PHP 中使用 fopen() 方法并传入 php://input 流。

假设您为购物车更新创建了一个 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
?>
于 2016-03-30T09:12:10.073 回答