2011-07-26 6 views
1

J'utilise un formulaire pour envoyer la item_name du don et le montant à un script PHP local sur la page, cependant, le script me envoie juste paypal.com et non la page des dons. Je ne vois rien de mal, tout vérifie, mais ne fait pas son travail. Voici le script local:cURL et Paypal ne fonctionne pas

<?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&[email protected]&notify_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&currency_code=USD&item_name=".$_POST['item_name']."&amount=".$_POST['amount']."&bn=PP-DonationsBF:btn_donate_LG.gif:NonHostedGuest"); 
    ?> 

Et la forme qui l'envoie:

<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> 

Il n'envoie au script sinon il ne serait pas en mesure d'aller à paypal.com parce que cela est non déclaré n'importe où ailleurs. Je ne comprends pas pourquoi ça ne marche pas, des idées?

+0

Personne? Pas une personne ?! – Harry

Répondre

0

Je ne sais pas si vous rencontrez toujours ce problème, nous avons constaté que, dans certains scénarios CURLOPT_FOLLOWLOCATION ne fonctionne pas comme prévu. C'est généralement un problème de configuration du serveur et parfois pas quelque chose que vous pouvez facilement changer.

Pour contourner ce problème, nous avons écrit les fonctions (ci-dessous) qui, combiné à un appel CURL nous a donné la solution dont nous avions besoin:

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))); 
} 

Avec l'appel complet CURL qui ressemble à ceci:

$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"); 

J'espère que cela vous sera utile.