15

私はやや初心者であり、それを認めることを恐れません。私は、phpとサーバーサイドのスクリプト/処理をより良くするための学習体験としてこのプロジェクトに取り組んでいます。

Shopifyを使用し、Shopifyカートから注文が処理されるたびにオフサーバーデータベースを同時に更新する方法を考え出そうとしています。たとえば、誰かが私のオンラインストアから何かを購入した場合、ホームデータベースの在庫を更新して、アイテムが1つ少なくなったことを示します。

これを行う最善の方法は、サーバーにHTTP POSTリクエストを送信するWebhook通知を設定することであり、サーバーにPOSTをキャッチしてXMLに解析させるという結論に達しました。次に、データベースを更新するphpスクリプトを介してXMLを読み取ります。

PHPに問題はありませんが、サーバーでWebhookをキャッチする方法がわかりません。WebhookはPOSTリクエストを送信するためのURLを要求します。あなたへの私の質問は次のとおりです。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は上記のスクリプトにPOSTします。これにより、Webhookの本体がPHPエラーログに書き込まれるはずです。

于 2012-06-11T18:31:26.890 に答える
4

申し訳ありませんが、コメントを投稿するのに十分な評判がありませんが、EdwardOcampo-Goodingの回答からのデッドリンクの内容は次のとおりです。

SimpleXMLを使用したPHPの例(PHP 5以降)

以下のスクリプトは、ShopifyからスクリプトにXMLデータを取り込み、ファイルをアーカイブし、適切なヘッダーを送信する方法を示しています...

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に最も精通しているように思われるので、それに基づいて答えます。

Shopifyが送信するHTTPPOSTで送信されたデータを取得し、データベースが必要とする形式に変換できるパブリックURLとしてアクセス可能なPHPスクリプト/ページが必要です。

その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リクエストを処理し、200OKで応答する必要があります。

サーバーにエンドポイントを設定したら、shopifyでWebhookを作成し、URLをWebサーバーのエンドポイントにします。

于 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に配置して、shopifywebhookによって送信されたデータを取得するとします。

<?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 に答える