2012-02-22 25 views
1

プロキシを使用するためのfopen()POST要求を書き直そうとしています。プロキシを介したPOSTの実行(Paypal Adaptive payments)

コードはPaypalサイト(https://www.x.com/developers/PayPal/documentation-tools/code-sample/216632)の例に基づいています。

fopen()とfile_get_contents()およびcURL libのデフォルトの回避策は、比較的複雑な投稿のヘッダーと内容に対しては機能しません。 (どちらのプロキシ経由で行くか、または無効な要求を取得に失敗:{0}、なしプロキシが設定されている場合でも):

$url = trim('https://svcs.sandbox.paypal.com/AdaptiveAccounts/AddBankAccount'); 
$API_UserName = "sbapi_1287090601_biz_api1.paypal.com"; //TODO 
$API_Password = "1287090610"; //TODO 
$API_Signature = "ANFgtzcGWolmjcm5vfrf07xVQ6B9AsoDvVryVxEQqezY85hChCfdBMvY"; //TODO 
$API_SANDBOX_EMAIL_ADDRESS = "[email protected]"; //TODO 
$API_DEVICE_IPADDRESS = "127.0.0.1"; //TODO 
$API_AppID = "APP-80W284485P519543T"; 
$API_RequestFormat = "XML"; 
$API_ResponseFormat = "XML"; 

$xml = simplexml_load_string($xml_str); 
$contents = $xml->asXML(); 

try 
{ 
    $params = array("http" => array(
            "method" => 'POST', 
            "content" => $contents, 
            'header' => 'X-PAYPAL-SECURITY-USERID: ' . $API_UserName ."\r\n" . 
              'X-PAYPAL-SECURITY-PASSWORD: ' . $API_Password . "\r\n" . 
              'X-PAYPAL-SECURITY-SIGNATURE: ' . $API_Signature . "\r\n" . 
              'X-PAYPAL-REQUEST-DATA-FORMAT: ' . $API_RequestFormat . "\r\n" . 
              'X-PAYPAL-RESPONSE-DATA-FORMAT: ' . $API_ResponseFormat . "\r\n" . 
              'X-PAYPAL-APPLICATION-ID: ' . $API_AppID . "\r\n" . 
              'X-PAYPAL-SANDBOX-EMAIL-ADDRESS: ' . $API_SANDBOX_EMAIL_ADDRESS . "\r\n" . 
              'X-PAYPAL-DEVICE-IPADDRESS: ' . $API_DEVICE_IPADDRESS . "\r\n")); 

    $ctx = stream_context_create($params); 

    $fp = @fopen($url, 'r', false, $ctx); // PROXIFY! 
    $response = stream_get_contents($fp); 
    if ($response === false) { 
     throw new Exception("php error message = " . "$php_errormsg"); 
    } 
    fclose($fp); 

    // ... handle the response content ... 
} 
catch(Exception $e) 
{ 
    echo 'Message: ||' .$e->getMessage().'||'; 
} 

?> 

マイプロキシのfile_get_contents():

は、ここに投稿(簡体字)のコード例です
 if (!empty($_context_params)) { 
      $http_arr = $_context_params['http']; 
      $http_arr['proxy'] = $proxy_path; 
      $http_arr['request_fulluri'] = true; 
      $_context_params['http'] = $http_arr; 
     } 
     else 
     { 
      $_context_params = array('http' => array('proxy' => $proxy_path, 'request_fulluri' => true)); 
     } 
     return file_get_contents($_url, false, stream_context_create($_context_params)); 

私は、関数fopenをプロキシ:

 $parsed_proxy_path = parse_url($proxy_path); 
     $_proxy_name = $parsed_proxy_path['host']; 
     $_proxy_port = $parsed_proxy_path['port']; 
     $proxy_fp = fsockopen($_proxy_name, $_proxy_port); 
     if (!$proxy_fp) 
      return false; 
     $parsed_url = parse_url($_url); 
     $host = $parsed_url['host']; 

     $request = "GET $_url HTTP/1.0\r\nHost:$host\r\n\r\n"; 

     fputs($proxy_fp, $request); 

     return $proxy_fp; 

私のcURLの実験:(CodeIgniterのカールlibには、私のためのプロキシの面倒を見る)

$http_params = $params['http']; 
$this->curl->create($this->cfg->paypal_req_url); 
$this->curl->option('header', true);$this->curl->option('verbose', true); 
$this->curl->option('useragent', 'cURL/PHP'); 

$this->curl->http_header($http_params['header']); 
$this->curl->http_header("Content-length: ".strlen($contents)); 
$this->curl->post(array("content"=> $contents)); 
$res = $this->curl->execute(); 

ここからどこへ行くのですか?私はちょっと立ち往生しました..

cURLからのリクエストをデバッグするにはどうしたらいいですか? cURLでリクエストを再現することもできますか? POSTではなくGETで動作しますか? XMLRPCはオプションですか?

注:このコード例は、プロキシの背後にないときに機能します。

事前のおかげで、

アレックス

答えて

0

ここで私はそれがのcURLで動作するように取得するために使用されるコードです。

注:Phil Sturgeonによってcodeigniter cURL libが使用されています。

注:XMLからコンテンツのクエリ文字列に切り替えることを決めました。 PHP4で立ち往生したものについては

$contents = array(
         "actionType"=>"PAY", 
         "cancelUrl"=>$cancel_url, 
         "returnUrl"=>$return_url, 
         "currencyCode"=>$currency, 
         "sender"=>$sendingmail, 
         "memo"=>$memo, 
         "requestEnvelope.errorLanguage"=>$error_lang, 
         "receiverList.receiver.amount"=>$amount, 
         "receiverList.receiver.email"=>$receivingmail, 
    ); 
    if (isset($notification_url)) { $contents["ipnNotificationUrl"]=$notification_url; } 
    if ($receivingmail == $this->cfg->paypal_email) { $contents["feesPayer"]="SENDER"; } 
    if ($sendingmail == $this->cfg->paypal_email) { $contents["senderEmail"]=$sendingmail; } 

    // ------------------------------ 
    // create request and add headers 
    // ------------------------------ 
    $options = array("useragent" => "cURL/PHP"); 
    $this->curl->create($this->cfg->paypal_req_url); 
    $this->curl->http_header("Content-type", "application/x-www-form-urlencoded"); 
    $this->curl->http_header("X-PAYPAL-SECURITY-USERID", $this->cfg->paypal_user_name); 
    $this->curl->http_header("X-PAYPAL-SECURITY-SIGNATURE", $this->cfg->paypal_signature); 
    $this->curl->http_header("X-PAYPAL-SECURITY-PASSWORD", $this->cfg->paypal_password); 
    $this->curl->http_header("X-PAYPAL-APPLICATION-ID", $this->cfg->paypal_app_id); 
    $this->curl->http_header("X-PAYPAL-REQUEST-DATA-FORMAT", "NV"); 
    $this->curl->http_header("X-PAYPAL-RESPONSE-DATA-FORMAT", "XML"); 
    $this->curl->post($contents, $options); 
    $response = $this->curl->execute(); 

それはfopenをしてプロキシ経由で動作するようになって、元の質問に答える役に立つかもしれませんか?

乾杯、

アレックス

関連する問題