XML 请求格式不正确或请求不完整

Posted

技术标签:

【中文标题】XML 请求格式不正确或请求不完整【英文标题】:XML request is not well-formed or request is incomplete 【发布时间】:2012-08-22 22:38:24 【问题描述】:

我们在我们的应用程序中使用虚拟商户支付网关:

https://www.myvirtualmerchant.com/VirtualMerchant/download/developerGuide.pdf

我正在尝试记录 CCSALE 交易,但我不断收到此错误:

<?xml version="1.0" encoding="UTF-8"?>
<txn><errorCode>6042</errorCode><errorName>Invalid Request Format</errorName><errorMessage>XML request is not well-formed or request is incomplete.</errorMessage></txn>

我在 Fiddler POST 中传入请求的 XML 是:

<txn>
<ssl_merchant_id>my_mer_id</ssl_merchant_id>
<ssl_user_id>my_usr_id</ssl_user_id>
<ssl_pin>my_pin</ssl_pin>
<ssl_test_mode>false</ssl_test_mode>
<ssl_transaction_type>ccsale</ssl_transaction_type>
<ssl_card_number>4111111111111111</ssl_card_number>
<ssl_exp_date>1215</ssl_exp_date>
<ssl_amount>1.00</ssl_amount>
</txn>

我只是删除了我的商家 ID、用户 ID 和 ssl 密码。其余的信息是一样的。我将数据发布到:https://demo.myvirtualmerchant.com/VirtualMerchantDemo/processxml.do

谁能告诉我为什么它说 XML 格式不正确?

【问题讨论】:

当您询问该网站的支持人员时,他们说了什么?他们在日志中看到的细节可能比您看到的更多。 您需要询问他们支持的编码类型。 查看该文档的第 77 页,您似乎不包括滑动所需的标签 ,您可能需要其他标签之一 在键入的条目上。 @Mike:谢谢!但是,如果您查看第 47 页的示例,它不包含此类内容。此外,我不知道如何获得 track_data 等信息。 @Jack 您是否尝试过添加 XML 标头? 【参考方案1】:

首先,经过数小时的挫折后,我发现 php 执行此操作的方式非常迟钝。由于这个 XML 错误非常持久,我想在 Coldfusion 中尝试这个,并且在 2-3 分钟内,整个事情就完成了,没有 XML 错误,也没有从 API 返回 SSL 废话。无论如何,足够的通风!这可能是您防止 XML 格式良好的超级骗子消息所需要的:

curl_setopt($ch, CURLOPT_POSTFIELDS, array("xmldata=" . $fields_string));

假设您正在关注他们的文档并且您将变量保存在 fields_string 中,您需要做的就是键入一些模仿 API 变量的内容。在这种情况下,xmldata 就可以了。

我还没有听到抛出这个的答案:Curl error: SSL read: error:00000000:lib(0):func(0):reason(0), errno 104

这要归功于监听错误,否则在我摆脱 XML 错误后 $result 返回空。所以,就这样吧:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, array("xmldata=" . $fields_string));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);

if(curl_errno($ch))
    echo 'Curl error: ' . curl_error($ch);
else
    echo 'the return is ' . $result;

SSL 尚未设置,那么他们为什么要为 CURLOPT_SSL_VERIFYPEER 和 CURLOPT_SSL_VERIFYHOST 烦恼呢?即使它是错误的,它也不起作用,这整件事变成了查理 Foxtrot!

【讨论】:

【参考方案2】:

我也遇到了这个错误,这是我工作的 curl 函数

    public function send_curl_xml($xml=NULL)

    $data = http_build_query(array("xmldata"=>$xml));

    $headers = array(
        "Accept: application/xml",
        "Content-type: application/x-www-form-urlencoded"
        //,"Content-length: " . strlen($data)
    );

    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

    $response = curl_exec($ch);

    //echo $response;

    if(curl_errno($ch))
        print curl_error($ch);
        return false;
     else 
        curl_close($ch);
        return $data;
    

$xml 变量是 DOCDocument 对象,如果要动态生成 xml,请务必使用 $xml->savehtml() (这里的关键是删除 xml 字符串中的 "" 行。)

【讨论】:

以上是关于XML 请求格式不正确或请求不完整的主要内容,如果未能解决你的问题,请参考以下文章

Java:以 XML 或 JSON 格式请求正文而不使用字符串

使用 RestKit 以 XML 格式发送 post 请求

PHP/SOAP/XML 文档中根元素之前的标记必须格式正确

requestImageDataForAsset 结果处理程序格式不正确

Ajax POST 请求 - 400 错误请求 - 格式不正确的语法

未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。