我对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);
}
答案 0 :(得分:0)
您的代码有几个问题,一个体面的IDE会立即向您显示。
function post_to_third_party($entry, $form)
$form
从未使用过,所以请省略它。
$body = array(...);
您永远不会使用$body
,而是直接尝试访问条目&#39;后面。
$xml = '...';
单引号字符串未进行插值(即,不替换变量),因为var_dump($xml);
已经向您显示。
此外,您不会转义值,这些值可能包含XML中不允许的字符。
$ch = curl_init($url);
$url
不存在。您要使用的值位于$post_url
。
您正在使用cURL
的不安全设置,使您的代码容易受到MITM攻击(SSL服务器欺骗)的攻击。
有关详细信息,请参阅this documentation。
您没有任何形式的错误检查。
解决问题后,您的代码看起来像这样,现在应该可以正常工作:
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;
}