使用shopify webhooked订单项的XML解析器

时间:2012-09-19 21:56:27

标签: php xml shopify

我正在使用shopify webhook在订单更新时更新我的​​sql server的'qty'字段,下面是我的php代码

?php
$xmlData = fopen('php://input' , 'rb'); 
while (!feof($xmlData)) { $xmlString .= fread($xmlData, 4096); }
fclose($xmlData);
$xml = new SimplexmlElement($xmlString);


file_put_contents('orders/order' . '.xml', $xmlString);



$dom = new DomDocument();

$dom->load('orders/order.xml');

$itemList = $dom->getElementsByTagName('line-item');
foreach($itemList as $item) {
  $sku='';
  $qty='';
  foreach($item->childNodes as $child) {
    if ($child->localName == 'sku') {
      $sku = $child->textContent;
    }
    if ($child->localName == 'quantity') {
      $qty = $child->textContent;
    }
  }
  mysql_connect ("?????????????????????????");
mysql_select_db("??????????");

$query = "UPDATE xcart_categories SET product_count = product_count - $qty WHERE description='$sku';";

mysql_query($query);
}

以下是我从shopify webhook获得的xml文件

<?xml version="1.0" encoding="UTF-8"?>
<order>
  <buyer-accepts-marketing type="boolean">true</buyer-accepts-marketing>
  <closed-at type="datetime" nil="true"></closed-at>
  <currency>USD</currency>
  <email>yeongju_l@yahoo.com</email>
  <financial-status>pending</financial-status>
  <fulfillment-status>fulfilled</fulfillment-status>
  <gateway>Local Pick-Up</gateway>
  <id type="integer">140303247</id>
  <name>#1012</name>
  <note></note>
  <number type="integer">12</number>
  <subtotal-price type="decimal">0.2</subtotal-price>
  <taxes-included type="boolean">false</taxes-included>
  <total-discounts type="decimal">0.0</total-discounts>
  <total-line-items-price type="decimal">0.2</total-line-items-price>
  <total-price type="decimal">0.2</total-price>
  <total-price-usd type="decimal">0.2</total-price-usd>
  <total-tax type="decimal">0.0</total-tax>
  <total-weight type="integer">0</total-weight>
  <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
  <created-at type="datetime">2012-09-16T21:08:30-04:00</created-at>
  <token>dcf523d93c68159c15a7c8d1fabbee07</token>
  <landing-site>/products/test</landing-site>
  <referring-site></referring-site>
  <cancelled-at type="datetime" nil="true"></cancelled-at>
  <cancel-reason nil="true"></cancel-reason>
  <cart-token>a9a7bc5d8103f6a3bb45e827f0cb8928</cart-token>
  <browser-ip nil="true"></browser-ip>
  <landing-site-ref nil="true"></landing-site-ref>
  <order-number type="integer">1012</order-number>
  <discount-codes type="array"/>
  <note-attributes type="array">
  </note-attributes>
  <processing-method>manual</processing-method>
  <line-items type="array">
    <line-item>
      <id type="integer">228531213</id>
      <requires-shipping type="boolean">false</requires-shipping>
      <fulfillment-service>manual</fulfillment-service>
      <grams type="integer">0</grams>
      <price type="decimal">0.2</price>
      <quantity type="integer">1</quantity>
      <sku>1234567</sku>
      <title>test</title>
      <product-id type="integer">104663831</product-id>
      <variant-id type="integer">240660979</variant-id>
      <vendor>5 Second</vendor>
      <variant-title nil="true"></variant-title>
      <fulfillment-status>fulfilled</fulfillment-status>
      <name>test</name>
      <variant-inventory-management></variant-inventory-management>
      <properties type="array">
      </properties>
    </line-item>
  </line-items>
  <shipping-lines type="array"/>
  <tax-lines type="array">
    <tax-line>
      <title>NY State Tax</title>
      <price type="decimal">0.0</price>
      <rate type="float">0.04</rate>
    </tax-line>
    <tax-line>
      <title>Queens County Tax</title>
      <price type="decimal">0.0</price>
      <rate type="float">0.04875</rate>
    </tax-line>
  </tax-lines>
  <billing-address>
    <first-name>Yeongju</first-name>
    <last-name>Lee</last-name>
    <address1>14809 northern blvd</address1>
    <address2></address2>
    <city>Flushing</city>
    <company></company>
    <country>United States</country>
    <phone></phone>
    <province>New York</province>
    <zip>11354</zip>
    <latitude type="decimal">40.76529</latitude>
    <longitude type="decimal">-73.81831</longitude>
    <name>Yeongju Lee</name>
    <country-code>US</country-code>
    <province-code>NY</province-code>
  </billing-address>
  <fulfillments type="array">
    <fulfillment>
      <id type="integer">67712419</id>
      <order-id type="integer">140303247</order-id>
      <created-at type="datetime">2012-09-16T21:20:07-04:00</created-at>
      <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
      <tracking-number nil="true"></tracking-number>
      <tracking-company nil="true"></tracking-company>
      <status>success</status>
      <service>manual</service>
      <tracking-url>http://www.google.com/search?q=</tracking-url>
      <receipt>
      </receipt>
      <line-items type="array">
        <line-item>
          <id type="integer">228531213</id>
          <requires-shipping type="boolean">false</requires-shipping>
          <fulfillment-service>manual</fulfillment-service>
          <grams type="integer">0</grams>
          <price type="decimal">0.2</price>
          <quantity type="integer">1</quantity>
          <sku>1234567</sku>
          <title>test</title>
          <product-id type="integer">104663831</product-id>
          <variant-id type="integer">240660979</variant-id>
          <vendor>5 Second</vendor>
          <variant-title nil="true"></variant-title>
          <fulfillment-status>fulfilled</fulfillment-status>
          <name>test</name>
          <variant-inventory-management></variant-inventory-management>
          <properties type="array">
          </properties>
        </line-item>
      </line-items>
    </fulfillment>
  </fulfillments>
  <customer>
    <id type="integer">96489088</id>
    <email>yeongju_l@yahoo.com</email>
    <accepts-marketing type="boolean">true</accepts-marketing>
    <first-name>Yeongju</first-name>
    <last-name>Lee</last-name>
    <orders-count type="integer">12</orders-count>
    <total-spent type="decimal">16.26</total-spent>
    <note nil="true"></note>
    <created-at type="datetime">2012-08-17T11:31:50-04:00</created-at>
    <updated-at type="datetime">2012-09-16T21:20:07-04:00</updated-at>
    <state>enabled</state>
    <last-order-id type="integer">140303509</last-order-id>
    <tags>C</tags>
    <last-order-name>#1013</last-order-name>
  </customer>

就像你看到我有两个sku和qty因为重复的行项目所以例如当客户订购一个“产品名称 - 在这种情况下测试我在我的sql server sku测试字段中得到了”-2“数量更新,但是当我使用webhook事件时订单创建它工作我的意思是我只看到一个行项目,但所有其他情况(当订单更新,订单付款时,订单fullfillment ..)显示重复的行项目,即使只有一个项目有序 我想我正在严重解析我的XML 任何人都可以教我正确的代码从第一个项目节点拉“行项目”我将非常感激! Thanks..again

1 个答案:

答案 0 :(得分:2)

您正在执行大量冗余步骤来解析XML。在处理数据之前,您不需要将数据保存到文件中,并且您对未使用的SimpleXML进行了迷路调用。所有你需要的是:

$xmlString = file_get_contents('php://input');
$dom = new DomDocument();
$dom->loadXML($xmlString);

之后,您的解析逻辑看起来很好您只运行一个SQL查询,其中包含一个SKU。

foreach循环中,您可以定义变量$sku$qty,但在循环中不对它们执行任何操作。因此,下次循环时,您将覆盖它们的值,并且什么都不会知道旧值。

有几种方法可以做到这一点:

  • 在循环内运行SQL(效率不高)
  • 构建一系列SKU和数量($sku[] = ...; $qty[] = ...;),然后从这些数组构建SQL
  • 略显整洁,构建一个单独的数组,SKU数量对作为嵌套数组($sku_list[] = array('sku' => ..., 'qty' => ...)
  • 在循环内逐步构建SQL字符串($sql .= '...')并在结束时执行一次