【问题标题】:Catch CXML-Urlencoded with PHP. Not POST or GET用 PHP 捕获 CXML-Urlencoded。不是 POST 或 GET
【发布时间】:2019-12-14 17:54:55
【问题描述】:

除了 POST、GET、COOKIE、SESSION 和 RAW 之外,还有其他方式接收表单吗?

我解释一下:我正在尝试使用 PHP 实现 cXML Punchout,但似乎我没有收到通常发送的信息。我尝试用 PHP、GET、POST 甚至原始数据来捕捉它:

file_get_contents('php://input')

但我没有捕捉到任何变量。

我找到了一个向我的程序发送虚拟请求的 URL:https://punchoutcommerce.com/tools/cxml-punchout-tester

如果我向我的程序 (https://serlimax.com/api) 发送请求,它不会在我的日志中注册任何内容,但我看到使用浏览器工具发送了 CXML-Urlencoded。

如何捕捉我看到的信息?

pS:如果您想在浏览器中自己查看,您可以发送除现有 URL 以外的任何信息,否则会发送 404 错误。

PS2:如果您想知道我怎么知道我没有收到任何东西,这就是我记录收到的信息的方式:

ob_flush();
ob_start();
echo "User: - ". $_SERVER['HTTP_USER_AGENT']. ' - IP:'. $_SERVER['REMOTE_ADDR'].' - METHOD:'.$_SERVER['REQUEST_METHOD'].PHP_EOL;
echo 'POST:---------'.PHP_EOL;
var_dump($_POST);
echo 'GET:---------'.PHP_EOL;
var_dump($_GET);
echo 'RAW:---------'.PHP_EOL;
echo file_get_contents('php://input');
file_put_contents('./punchout_log_'.date("j.n.Y.H.i.s").'.txt', ob_get_flush());

导致空日志:

【问题讨论】:

    标签: php xml request cxml


    【解决方案1】:

    问题是您“记录”您发布的数据不正确。你使用:

    file_get_contents('php://input');
    

    但是,这会返回数据。由于您不回显它,因此它不会在您的日志文件中可见。

    把它改成这样:

    echo file_get_contents('php://input');
    

    更改后,您将看到您需要的 XML:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.041/cXML.dtd">
    <cXML payloadID="1576588580.7783@punchoutcommerce.com" timestamp="2019-12-17T13:16:20+00:00">
      <Header>
        <From>
          <Credential domain="NetworkId">
            <Identity>test</Identity>
          </Credential>
        </From>
        <To>
          <Credential domain="DUNS">
            <Identity>tww</Identity>
          </Credential>
        </To>
        <Sender>
          <Credential domain="NetworkId">
            <Identity>ewe</Identity>
            <SharedSecret>wew</SharedSecret>
          </Credential>
          <UserAgent>PunchOutCommerce PunchOut Tester</UserAgent>
        </Sender>
      </Header>
      <Request deploymentMode="production">
        <PunchOutSetupRequest operation="create">
          <BuyerCookie>76930ae895ac62a2a7e0c9d9350fa5f2</BuyerCookie>
          <Extrinsic name="User">jdoe12345</Extrinsic>
          <Extrinsic name="UniqueUsername">jdoe12345</Extrinsic>
          <Extrinsic name="UserId">12345</Extrinsic>
          <Extrinsic name="UserEmail">jdoe@example.com</Extrinsic>
          <Extrinsic name="UserFullName">John Doe</Extrinsic>
          <Extrinsic name="UserPrintableName">John Doe</Extrinsic>
          <Extrinsic name="FirstName">John</Extrinsic>
          <Extrinsic name="LastName">Doe</Extrinsic>
          <Extrinsic name="PhoneNumber">555-555-5555</Extrinsic>
          <BrowserFormPost>
            <URL>https://punchoutcommerce.com/tools/cxml-punchout-return</URL>
          </BrowserFormPost>
          <SupplierSetup>
            <URL>http://52.211.159.83/test.php?test=1</URL>
          </SupplierSetup>
          <ShipTo>
            <Address addressID="TEST">
              <Name xml:lang="en">TEST</Name>
              <PostalAddress>
                <Street>123 Street Address</Street>
                <City>Rockville</City>
                <State>MD</State>
                <PostalCode>20850</PostalCode>
                <Country isoCountryCode="US">US</Country>
              </PostalAddress>
            </Address>
          </ShipTo>
        </PunchOutSetupRequest>
      </Request>
    </cXML>
    

    【讨论】:

    • 你是对的,我错过了那个回声,但仍然没有得到任何原始内容。我是否需要特殊的服务器配置才能使用 file_get _contents?如果是,是否可以使用 curl 代替?
    • 更新:我验证了 phpinfo 并且 remote_url 已打开,所以 file_get_contents 应该可以工作。你知道为什么我看不到那个原始的吗(我正要奖励你,但我不得不等待。你应得的)
    【解决方案2】:

    好吧,我不知道,但它应该使用https://url/api/,而不是https://url/api/index.php

    “index.php”的缺失导致了重定向,从而避免了 php://input 的捕获

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-30
      • 1970-01-01
      • 2021-01-24
      • 1970-01-01
      相关资源
      最近更新 更多