Php 如何捕获Shopify Webhook发送的HTTP POST请求

Php 如何捕获Shopify Webhook发送的HTTP POST请求,php,ruby-on-rails,shopify,webhooks,Php,Ruby On Rails,Shopify,Webhooks,我有点像一个书呆子,而且我不害怕承认,我在这个项目上工作是为了更好地使用php和服务器端脚本处理 我正试图想出一种方法来使用Shopify,并在每次我的Shopify购物车完成订单时同时更新一个非服务器数据库。例如,有人从我的网上商店买了东西,我想让它更新我的家庭数据库库存,以显示它现在少了一件物品 我得出的结论是,最好的方法是设置一个向我的服务器发送HTTP POST请求的服务器,然后让我的服务器捕获POST并将其解析为XML。然后,我将通过更新数据库的php脚本读取XML 我对php没有问题

我有点像一个书呆子,而且我不害怕承认,我在这个项目上工作是为了更好地使用php和服务器端脚本处理

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

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

我对php没有问题,但我似乎不知道如何在我的服务器上捕获webhook。Webhook要求我提供一个URL来发送帖子请求,我的问题是;什么是url

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

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

如果你能想出一个更好或更简单的方法来做这件事,无论如何请给我你的建议。我希望这是安全的,所以像访问控制允许起源这样的方法是不可能的

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

听起来您对PHP最熟悉,因此我将基于此进行回答

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


下面是一个PHP脚本的示例:

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

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

在创建一个公共URL,其中example.com是您的域名,which.php是您可以编辑的php文件

然后将此代码放入which.php:

<?php
$webhookContent = "";

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

error_log($webhookContent);
?>


然后,在Shopify管理员中,您可以创建一个新的webhook并指向它,当您单击Shopify管理员中的“测试webhook”按钮时,Shopify将发布到上面的脚本中,这将反过来将webhook的主体写入您的PHP错误日志。

对不起,我没有足够的声誉发表评论,但以下是爱德华·奥坎波·古丁(Edward Ocampo Gooding)答案中的死链接内容:

PHP示例w/SimpleXML(php5+)

下面的脚本向您展示了如何将Shopify中的XML数据导入到脚本中,归档文件,并发送正确的标题

假设webhook的管理中的新订单订阅设置为:

关于some-script.php的内容:


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

假设您为cart update创建一个webhook并设置URL,然后将以下代码放入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
?>


您使用的是什么环境/框架?你提到了PHP,但没有提到webapp框架(Cake、Zend等)、Shopify(Ruby on Rails)和MySQL的任何细节,我只是想要一个脚本来创建一个可以使用PHP阅读的xml。说实话,我最熟悉Java和C#,我从来没有处理过web开发,总是坚持使用软件。这是我第一次真正的从软件到网络的冒险。我仍然不知道如何实际创建.xml,它似乎从来都不起作用。你在你的web/PHP知识中是否能够在公共URL上生成一个“Hello,world”页面?哈哈,是的,我的知识非常基础,但不是那么基本。如果某人没有工作错误日志文件,那么我们也可以将所有内容写入文本文件$content=“此处的一些文本”。$webhookContent$fp=fopen($_服务器['DOCUMENT_ROOT'].“/myText.txt”,“wb”);fwrite($fp,$content);fclose($fp);如何利用公开的http url解决安全问题?我的意思是,有没有一种方法只允许Webhook发布到这个url,而对这个url的任何其他点击都应该被忽略?你真是个天才!!几周来,我一直在努力为文莫和德沃拉弄明白这一点,但他们的支持团队没有提供任何帮助。非常感谢。这对Dwolla和Venmo都有效,基本上是即插即用的@罗希特古普塔,经典的方法是。或者,您可以在Shopify中设置webhook时添加一个“secret”URL参数,然后让脚本检查以确保该参数存在并且具有正确的值。
<?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
?>