PHP fosckopen için CURL dönüştürmek

2 Cevap php

Ben canlı bir site için kredi kartı işlem kurma üzerinde çalışıyorum. PHP CURL desteği ile derlenmiş değildi ve ben bu konuda PHP yeniden derlemek için aşağı site almak istemiyorum, bu yüzden sağlanan örnek kod daha farklı bir yöntem kullanmaya çalışıyorum.

Örnek CURL kodu:

function send($packet, $url) {
    $header = array("MIME-Version: 1.0","Content-type: application/x-www-form-urlencoded","Contenttransfer-encoding: text"); 
    $ch = curl_init();

    // set URL and other appropriate options 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_VERBOSE, 1); 
    curl_setopt ($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); 
    // Uncomment for host with proxy server
    // curl_setopt ($ch, CURLOPT_PROXY, "http://proxyaddress:port"); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, $header); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $packet); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt ($ch, CURLOPT_TIMEOUT, 10); 

    // send packet and receive response
    $response = curl_exec($ch); 
    curl_close($ch); 
    return($response);
}

Farklı bir yöntem kullanmak için benim girişimi:

function send($packet, $host, $path) {
    $content = '';
    $flag = false;
    $post_query = urlencode($packet) . "\r\n";
    $fp = fsockopen($host, '80');
    if ($fp) {
        fputs($fp, "POST $path HTTP/1.0\r\n");
        fputs($fp, "Host: $host\r\n");
        fputs($fp, "Content-length: ". strlen($post_query) ."\r\n\r\n");
        fputs($fp, $post_query);

        while (!feof($fp)) {
            $line = fgets($fp, 10240);
            if ($flag) {
                $content .= $line;
            } else {
                $headers .= $line;
                if (strlen(trim($line)) == 0) {
                    $flag = true;
                }
            }
        }
        fclose($fp);
    }

    return $content;
}

Bu aslında bana arıyorum URL'den bir iade yok iken ben hatalı biçimlendirilmiş bir hata söyleyerek geri almak çünkü, o kadar yanlış yapar. Ben CURL veya bu diğer yöntemle ya çok aşina değilim, ben yanlış yapıyorum emin değilim.

2 Cevap

Eğer özellikle istedi olsa fsockopen() siz de denemek isteyebilirsiniz stream api ve context options

function send($packet, $url) {
  $ctx = stream_context_create(
    array(
      'http'=>array(
        'header'=>"Content-type: application/x-www-form-urlencoded",
        'method'=>'POST',
        'content'=>$packet
      )
    )
  );
  return file_get_contents($url, 0, $ctx);
}

Eğer daha fazla hata işleme kullanımını fopen() ve stream_get_meta_data() yerine gerekiyorsa file_get_contents()

Ben senin çözümün değiştirilmiş bir sürümünü denedik - her şey çalışıyor gibi görünüyordu kez, I () aralıklı bir HTTP 505 hata, hedef sunucudan geri geliyor sonuçlandı birden fputs bulundu.

Bunu düzeltmek için, ben tam isteğini önceden inşa etmek zorunda kaldı ve sadece tek bir fputs böyle diyorsunuz

$post_vars  = "";

$post_vars .= "&somekey=somevalue";

$header = "";

$header .= "POST /my.php HTTP/1.0\r\n";

$header .= "Content-Type: application/x-www-form-urlencoded\r\n";

$header .= "Host: www.myhost.com \r\n";

$header .= "Content-Length: " . strlen($post_vars) . "\r\n\r\n";

$fp = "";

@$fp = fsockopen ('ssl://www.myhost.com', 443, $errno, $errstr,30);

fputs($fp, $header . $post_vars);

while(!feof($fp)) {

    // Read the data returned

    $response .= @fgets($fp, 4096);

}

fclose ($fp);