I'm using a form to send the item_name of the donation and the amount to a local PHP script on the page, however, the script just sends me to paypal.com and not the donation page. I see nothing wrong, it all checks out but doesn't do it's job. Here's the local script:
<?php
function datapost($URLServer,$postdata)
{
$agent = "Mozilla/5.0";
$cURL_Session = curl_init();
curl_setopt($cURL_Session, CURLOPT_URL,$URLServer);
curl_setopt($cURL_Session, CURLOPT_USERAGENT, $agent);
curl_setopt($cURL_Session, CURLOPT_POST, 1);
curl_setopt($cURL_Session, CURLOPT_POSTFIELDS,$postdata);
curl_setopt($cURL_Session, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($cURL_Session, CURLOPT_FOLLOWLOCATION, 1);
$result = curl_exec ($cURL_Session);
}
$htmlsource= datapost("https://www.paypal.com/cgi-bin/webscr","cmd=_donations&business=example@msn.com¬ify_url=http://example.net/donate/paypal.php?action=ipn&return=http://example.net/donate/thankyou.php&rm=2&no_note=1&cbt=Back&no_shipping=1&lc=US¤cy_code=USD&item_name=".$_POST['item_name']."&amount=".$_POST['amount']."&bn=PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest");
?&g开发者_高级运维t;
And the form which sends it:
<form action="http://example.net/beta/index.php" method="post" class="payPalForm" id="paypal">
<div>
<div class="formRow">
<div class="hidden" id="error" style="width:100%"><h3> I'm sorry, that STEAM ID you entered was incorrect.</h3></div>
</div>
<div class="formRow">
<label for="field0">
Steam ID<span class="star">*</span>: </label>
<input type="text" name="item_name" id="item_name" class="textField required" />
</div>
<div class="formRow">
<label for="field2">
Amount: </label>
<select name="amount" id="field2" class="select">
<option value="5">$5</option>
<option value="10">$10</option>
<option value="15">$15</option>
<option value="20">$20</option>
<option value="25">$25</option>
<option value="30">$30</option>
<option value="35">$35</option>
</select>
</div>
<div class="formRow">
<input type="submit" value="Donate" id="donatebtn" onclick="return verifySteamID()" />
</div>
</form>
It does send to the script otherwise it wouldn't be able to go to paypal.com because that is not stated anywhere else. I don't understand why it's not working, any ideas?
I'm not sure if you are still experiencing this problem, we found that under some scenarios CURLOPT_FOLLOWLOCATION does not perform as expected. This is usually a server configuration issue and sometimes not something you can easily change.
To work around this problem we wrote the functions (below) which combined with a CURL call gave us the solution we required:
function curl_redir_exec($ch,$test = false)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++>= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = array();
preg_match('/Location:(.*?)\n/', $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url){
//couldn't process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url['scheme'])
$url['scheme'] = $last_url['scheme'];
if (!$url['host'])
$url['host'] = $last_url['host'];
if (!$url['path'])
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . ($url['query']?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
return $this->curl_redir_exec($ch);
} else {
$curl_loops=0;
if($test){
return curl_getinfo($ch, CURLINFO_EFFECTIVE_URL).'<br />'.$http_code.'<br />'.$data;
}else{
return curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
}
}
}
function curl_post_fields($array){
foreach ($array as $key=>$value){
$arr_output[] = trim($key).'='.trim($value);
}
return preg_replace('#(\r\n|\r|\n)+#m',"",trim(implode('&', $arr_output)));
}
With the full CURL call looking like this:
$data2 = $fn->curl_post_fields($data1);
$curl_session = curl_init($url);
curl_setopt($curl_session, CURLOPT_URL, $url);
curl_setopt($curl_session, CURLOPT_COOKIESESSION, 1);
curl_setopt($curl_session, CURLOPT_FRESH_CONNECT, 1);
curl_setopt($curl_session, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB;) Firefox/3.6.13");
curl_setopt($curl_session, CURLOPT_HTTPHEADER, array('X-Forwarded-For: '.$_SERVER['REMOTE_ADDR']));
curl_setopt($curl_session, CURLOPT_VERBOSE, 1);
curl_setopt($curl_session, CURLOPT_POST, 1);
curl_setopt($curl_session, CURLOPT_POSTFIELDS, $data2);
curl_setopt($curl_session, CURLOPT_TIMEOUT, 30);
curl_setopt($curl_session, CURLOPT_SSL_VERIFYPEER, FALSE);
$redirect_url = $shop->curl_redir_exec($curl_session);
if(curl_errno($curl_session))
{
echo '<p>An error has occurred, please take note of the information below and contact support.</p>';
echo "<br>Errno : ".curl_errno($curl_session) ."<br>";
echo "<br>Error : ".curl_error($curl_session) ."<br>";
die();
}
curl_close($curl_session);
header("location:$redirect_url");
I hope this is useful to you.
精彩评论