Gravity Forms在xml中提交后将条目数据发送给第三方

时间:2018-03-15 13:44:09

标签: php xml curl gravityforms

我对php / curl和gravity表单挂钩相当新。我有5个表单,我试图设置使用重力形式gform_after_submission挂钩,以便将xml数据发送给第三方(运行sql server的sbs web服务)。

这就是我已经拥有的。

add_action('gform_after_submission_73', 'post_to_third_party', 10, 2);
function post_to_third_party($entry, $form) {

$post_url = 'http://mywebsite.co.uk/customers?clientid=1599999&secret=123';
$body = array(
    'brand' => $entry['20'],
    'product' => $entry['22'],
    'form_id' => $entry['21'],
    'title' => $entry['24'],
    'fname' => $entry['23'],
    'lname' => $entry['17'],
    'postcode' => $entry['14'],
    'address1' => $entry['2.1'],
    'address2' => $entry['2.2'],
    'town' => $entry['2.3'],
    'county' => $entry['2.4']   
    );
$xml = '
   <?xml version="1.0" encoding="WINDOWS-1252"?>
<webform>
        <brand>$brand</brand>
    <product>$product</product>
    <form_id>$form_id</form_id>
    <title>$title</title>
    <fname>$fname</fname>
    <lname>$lname</lname>
    <postcode>$postcode</postcode>
    <address1>$address1</address1>
    <address2>$address2</address2>
    <town>$town</town>
    <county>$county</county>
    </webform>';
var_dump($xml);

$ch = curl_init($url);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: text/xml'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_URL, $post_url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $output = curl_exec($ch);
    echo $output;
    curl_close($ch);
  }

1 个答案:

答案 0 :(得分:0)

您的代码有几个问题,一个体面的IDE会立即向您显示。

  1. function post_to_third_party($entry, $form)

    $form从未使用过,所以请省略它。

  2. $body = array(...);

    您永远不会使用$body,而是直接尝试访问条目&#39;后面。

  3. $xml = '...';

    单引号字符串未进行插值(即,不替换变量),因为var_dump($xml);已经向您显示。 此外,您不会转义值,这些值可能包含XML中不允许的字符。

  4. $ch = curl_init($url);

    $url不存在。您要使用的值位于$post_url

  5. 您正在使用cURL的不安全设置,使您的代码容易受到MITM攻击(SSL服务器欺骗)的攻击。 有关详细信息,请参阅this documentation

  6. 您没有任何形式的错误检查。

  7. 解决问题后,您的代码看起来像这样,现在应该可以正常工作:

    add_action('gform_after_submission_73', 'post_to_third_party', 10, 2);
    
    function post_to_third_party($entry)
    {
        $url      = 'http://mywebsite.co.uk/customers?clientid=1599999&secret=123';
        $encoding = 'WINDOWS-1252';
        $brand    = htmlspecialchars($entry['20'], ENT_XML1, $encoding);
        $product  = htmlspecialchars($entry['22'], ENT_XML1, $encoding);
        $form_id  = htmlspecialchars($entry['21'], ENT_XML1, $encoding);
        $title    = htmlspecialchars($entry['24'], ENT_XML1, $encoding);
        $fname    = htmlspecialchars($entry['23'], ENT_XML1, $encoding);
        $lname    = htmlspecialchars($entry['17'], ENT_XML1, $encoding);
        $postcode = htmlspecialchars($entry['14'], ENT_XML1, $encoding);
        $address1 = htmlspecialchars($entry['2.1'], ENT_XML1, $encoding);
        $address2 = htmlspecialchars($entry['2.2'], ENT_XML1, $encoding);
        $town     = htmlspecialchars($entry['2.3'], ENT_XML1, $encoding);
        $county   = htmlspecialchars($entry['2.4'], ENT_XML1, $encoding);
    
        $xml = "<?xml version=\"1.0\" encoding=\"$encoding\"?>
        <webform>
            <brand>$brand</brand>
            <product>$product</product>
            <form_id>$form_id</form_id>
            <title>$title</title>
            <fname>$fname</fname>
            <lname>$lname</lname>
            <postcode>$postcode</postcode>
            <address1>$address1</address1>
            <address2>$address2</address2>
            <town>$town</town>
            <county>$county</county>
        </webform>";
    
        $ch = curl_init($url);
    
        if ($ch === false) {
            throw new RuntimeException("Unable to initialise a session");
        }
    
        $result = curl_setopt_array($ch, [
            CURLOPT_POST => 1,
            CURLOPT_HTTPHEADER => ['Content-Type: text/xml'],
            CURLOPT_POSTFIELDS => $xml,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_URL => $url,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_SSL_VERIFYHOST => 2,
            CURLOPT_SSL_VERIFYPEER => 1,
        ]);
    
        if ($result === false) {
            throw new RuntimeException("Unable to set session options");
        }
    
        $output = curl_exec($ch);
    
        if ($output === false) {
            throw new RuntimeException("Request failed: " . curl_error($ch));
        }
    
        curl_close($ch);
    
        echo $output;
    }