Php 如何在提交html表单后从其他站点读取XML响应

Php 如何在提交html表单后从其他站点读取XML响应,php,jquery,curl,Php,Jquery,Curl,在我的网站上,我正在向一个支付网站(webmasterchecks.com)提交一个html表单,该网站通过XML响应对我进行响应。XML响应显示在外部链接上(https://api.webmasterchecks.com/payments/add)正常表单提交后(单击提交按钮)。我想读取XML响应并更新数据库。我的编码语言是PHP HTML表单: <form name="payment_form" action="https://api.webmasterchecks.com/payme

在我的网站上,我正在向一个支付网站(webmasterchecks.com)提交一个html表单,该网站通过XML响应对我进行响应。XML响应显示在外部链接上(https://api.webmasterchecks.com/payments/add)正常表单提交后(单击提交按钮)。我想读取XML响应并更新数据库。我的编码语言是PHP

HTML表单:

<form name="payment_form" action="https://api.webmasterchecks.com/payments/add" method="post">

<input type="text" name="client_id" value="****"></input>
<input type="text" name="akey" value="**********"></input>
<input type="text" name="method_id" value="2"></input>
<input type="text" name="payee" value="ABCD EFGH"></input>
<input type="text" name="amount" value="1.00"></input>
<input type="text" name="postage_id" value="6"></input>
<input type="text" name="reference" value="Payment"></input>
<input type="text" name="street_addr" value="51 ABCD"></input>
<input type="text" name="city" value="XYZ"></input>
<input type="text" name="state" value="NJ"></input>
<input type="text" name="country" value="United States"></input>
<input type="text" name="zip" value="01544"></input>
<input type="submit" name="submit" value="submit"></input>
</form>
我也尝试使用curl,但没有成功。它显示的API键是无效的,因为使用上面的html表单,我得到了响应。下面给出了CURL代码

   $client_id = "****";
   $api_key = "*****************************";

   $output_url = "https://api.webmasterchecks.com/payments/add";

   $output_transaction  = "client_id=$client_id&";
   $output_transaction .= "akey=$api_key&";
   $output_transaction .= "method_id=2&";
   $output_transaction .= "payee=ABCD EFGH&";
   $output_transaction .= "amount=1.00&";
   $output_transaction .= "postage_id=6&";
   $output_transaction .= "reference=Payment&";
   $output_transaction .= "street_addr=FGHFHGFG&";
   $output_transaction .= "city=JHGJHG&";
   $output_transaction .= "state=NJ&";
   $output_transaction .= "country=United States&";
   $output_transaction .= "zip=54545454";

    ob_start();
    $ch = curl_init ($output_url); 
    curl_setopt ($ch, CURLOPT_VERBOSE, 1);
    curl_setopt ($ch, CURLOPT_POST, 1);
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $output_transaction);
    curl_exec ($ch);
    curl_close ($ch);
    $process_result = ob_get_contents();
    ob_end_clean();
如何使用XML响应更新数据库

提前谢谢

编辑

我的api密钥上几乎没有加号“+”。API密钥的示例格式如下所示

$(function(){
      $("form[name=payment_form]").submit(function(){
        $.post($(this).attr("action"), $(this).serialize(), function(jsonData){
            alert(jsonData);
        }, "json");
        return false;
      });
    });

q5Un5ObLZs2ovY2COW+LVHZEVDU0K3U6DPWH/p+wzlbh80vONBbo+otLpBwPqnvP/VJHGLFFS51SLFDPUHI+6GnVbLtR3ATjSz9trGoKLFgrK/OSTPUG4T9XV1EDS10JZVSCSCIXU2LVMJN9NVPCGAD9NAA

这里需要做的是将数据发送到一个本地脚本,然后将其打包成一个CUL请求,以便通过其API与远程服务器交互

<form name="payment_form" action="local_script.php" method="post">
<input type="text" name="method_id" value="2"></input>
<input type="text" name="payee" value="ABCD EFGH"></input>
<input type="text" name="amount" value="1.00"></input>
<input type="text" name="postage_id" value="6"></input>
<input type="text" name="reference" value="Payment"></input>
<input type="text" name="street_addr" value="51 ABCD"></input>
<input type="text" name="city" value="XYZ"></input>
<input type="text" name="state" value="NJ"></input>
<input type="text" name="country" value="United States"></input>
<input type="text" name="zip" value="01544"></input>
<input type="submit" name="submit" value="submit"></input>
</form>

我就是这样做的,因为我精通DOMDocument来解析和编写xml,您可以使用DOMDocument手册进行解析,也可以使用SIMPLEXML来解析xml以将数据添加到数据库中。

也许您还可以使用ajax向该URL发送数据或从该URL获取数据。 我创建了一个显示地图和标记数据的简单页面。我已经拿到了 数据使用ajax。对我的ajax调用的响应是xml。那以后呢 为了得到响应,我只解析了xml

例如

var url=“mapData.php”; var request=getRequestObj(); 打开(“获取”,url,true); request.onreadystatechange=函数(){ if(request.readyState==4){ var xmlDoc=request.responseXML; //获取标记数组并循环遍历它 var markers=xmlDoc.documentElement.getElementsByTagName(“标记”); 对于(var i=0;i希望这会有所帮助。

在我看来,您设置了错误的表单:操作值,并试图将ajaxsubmit提交到远程服务器(这是不允许的),而不是查询您的php脚本。您是否有问题将请求发送到API或解析来自API的XML响应?@ricabral:使用普通表单提交(通过单击提交按钮),如何解析来自其他网站的XML响应?我正在尝试这样做。@Vprimachenko:form操作是正确的。@Debashis但它将失败,因为
同源策略
我对上述代码感到困惑。使用HTML表单,将所有请求发送到本地_script.php文件。那么,为什么要使用变量“$output\u transaction”收集值并使用curl发送?请注意,我在使用curl方法时遇到了API密钥错误。如果我在HTML表单中使用相同的API键,表单将成功提交。您是对的,这是我的一个错误,因为我认为这就是您的输出事务。我现在已经使用http_build_查询获取$_帖子并将其放回curl。我还将api密钥和客户端id添加到post数组中,并一直添加到数据中。http_build_查询应该正确编码,并且应该可以正常工作
$api_url = "https://api.webmasterchecks.com/payments/add";
 $client_id = "****";
   $api_key = "*****************************";

$_POST['client_id'] = $client_id;
$_POST['akey'] = $api_key;

      $post_data = http_build_query($_POST);

    $xml = new DOMDocument();
    $ch = curl_init ($api_url); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//return xml
    curl_setopt($ch, CURLOPT_HEADER, FALSE);//we only need the body
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    $xml->loadXML(curl_exec($ch));
    curl_close ($ch);
    //for testing echo xml
    echo $xml->saveXML();
    //you need now to parse the xml before adding info to db
    $name = $xml->getElementsByTagName('name')->item(1)->nodeValue;
    $email = $xml->getElementsByTagName('email')->item(1)->nodeValue;
var url="mapData.php"; var request = getRequestObj(); request.open("GET", url, true); request.onreadystatechange = function() { if (request.readyState == 4) { var xmlDoc = request.responseXML; // obtain the array of markers and loop through it var markers = xmlDoc.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { //parsing other xml element... } } } request.send(null);