【问题标题】:XML Postback issueXML 回发问题
【发布时间】:2010-06-11 02:35:26
【问题描述】:

我有一个旨在解析来自 Ultracart 的 XML 回发的脚本,现在只需将其转储到 MySQL 表中。如果我将它指向本地主机上的 XML 文件,但使用 'php://input' 它似乎没有抓取任何东西,该脚本工作正常。我的日志显示 apache 在发布后返回 200,所以我不知道可能出了什么问题或如何深入研究问题。这是代码:

  $doc = new DOMDocument();
  $doc->loadXML($page);

  $handle = fopen("test2/".time().".xml", "w+");
  fwrite($handle,trim($page)); // it doesn't save this either :'(
  fclose();

  require_once('includes/database.php');

  $db = new Database('localhost', 'user', 'password', 'db_name');
  $data = array();

   $exports = $doc->getElementsByTagName("export");
   foreach ($exports as $export) {
     $orders = $export->getElementsByTagName("order");
     foreach($orders as $order) {
        $data['order_id'] = $order->getElementsByTagName("order_id")->item(0)->nodeValue;
        $data['payment_status'] = $order->getElementsByTagName("payment_status")->item(0)->nodeValue;
        $date_array = explode(" ",$order->getElementsByTagName("payment_date_time")->item(0)->nodeValue);

            if ($date_array[1] == 'JAN') { $date_array[1] = '01'; }
            if ($date_array[1] == 'FEB') { $date_array[1] = '02'; }
            if ($date_array[1] == 'MAR') { $date_array[1] = '03'; }
            if ($date_array[1] == 'APR') { $date_array[1] = '04'; }
            if ($date_array[1] == 'MAY') { $date_array[1] = '05'; }        // converts Ultracart date to
            if ($date_array[1] == 'JUN') { $date_array[1] = '06'; }        // MySQL date
            if ($date_array[1] == 'JUL') { $date_array[1] = '07'; }
            if ($date_array[1] == 'AUG') { $date_array[1] = '08'; }
            if ($date_array[1] == 'SEP') { $date_array[1] = '09'; }
            if ($date_array[1] == 'OCT') { $date_array[1] = '10'; }
            if ($date_array[1] == 'NOV') { $date_array[1] = '11'; }
            if ($date_array[1] == 'DEC') { $date_array[1] = '12'; }

        $data['payment_date'] = $date_array[2]."-".$date_array[1]."-".$date_array[0];
        $data['payment_time'] = $date_array[3];

        //... we'll skip this, there are 80 some elements

        $data['discount'] = $order->getElementsByTagName("discount")->item(0)->nodeValue;
        $data['distribution_center_code'] = $order->getElementsByTagName("distribution_center_code")->item(0)->nodeValue;
            }
        }
    }
        $db->insert('order_history',$data);
} else die('ERROR: Token Check Failed!');

【问题讨论】:

    标签: php xml postback stdin


    【解决方案1】:

    如果没有看到上面的代码,我建议您直接转储输出,看看您是否真的收到了 XML。我怀疑问题出在您的解析上,但与接收回发有关。查看 Ultracart 文档,在我看来他们没有将 xml 的主体作为 post 参数传递,而可能是作为相当古怪的 HTTP PUT。

    http://php.net/manual/en/features.file-upload.put-method.php

    我会押注大多数共享主机等,PUT 支持非常有限或默认不支持。我先看看那里。

    乔什

    【讨论】:

    • 感谢 Josh,原来 SSL 证书没有正确安装
    【解决方案2】:

    如果我将脚本指向本地主机上的 XML 文件,但使用 'php://input',它似乎没有抓取任何东西。

    为什么你会期望php://input“抓住任何东西”?如果 PHP 正在从命令行运行或获取请求数据(例如 POST 或 PUT HTTP 请求数据),则只能使用 php://input 从标准输入中读取,但多部分 POST 除外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 2023-04-05
      • 2012-04-17
      • 2011-06-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      相关资源
      最近更新 更多