2012-02-22 108 views
1

我想重寫一個fopen()POST請求與代理一起使用。fopen通過代理POST(支付寶適應性付款)

該代碼基於貝寶網站上的示例(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; 

我捲曲實驗:(笨捲曲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重現? 它可以使用GET而不是POST嗎? XMLRPC是一個選項嗎?

注意:示例代碼適用於不在代理之後的代碼。

由於提前,

亞歷

回答

0

這是我用來獲取它與捲曲工作的代碼。

注意:它使用Phil Sturgeon的codeigniter cURL lib。

注:我決定從XML切換到查詢字符串的內容。

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

對於那些堅持PHP4它回答得到它通過代理與FOPEN工作的原來的問題可能是有用的?

乾杯,

亞歷