web-dev-qa-db-ja.com

paypal nvp apiでWP_Httpを使用する際の問題

私はCurlの代わりにwp_httpを使うように書いたプラグインを変換しようとしているので(カールのないサーバーでも動作するでしょう)、プラグインをPaypalのnvp apiに投稿して、暗号化されたボタンを返します。

wP_Httpクラスを使用しようとすると、 "POSTに対する無効なHTTP応答"が表示されます。

私はこのプラグインを一般的なものにし、可能な限り標準に準拠させるようにしたいので、このヘルプを考え出すための手助けをいただければ幸いです。

これはphp Curlを使った投稿部分の元のプラグインコードです(そして作業中)

    $API_UserName  = urlencode($username);
$API_Password  = urlencode($password);
$API_Signature = urlencode($signature);


//the curl part - maybe we should change this into wp post functions

// setting the curl parameters.
$ch = curl_init(); //calling curl phplib inside $CH
curl_setopt($ch, CURLOPT_URL, $API_Endpoint);//setting the endpoint
curl_setopt($ch, CURLOPT_VERBOSE, 1); //should check this, i don't really know

// turning off the server and peer verification(TrustManager Concept).
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);

// NVPRequest for submitting to server- including endpoint,credentials,the button data
$nvpreq = "METHOD=$methodName_&VERSION=$version&PWD=$API_Password&USER=$API_UserName&SIGNATURE=$API_Signature&$nvpStr_";

// setting the nvpreq as POST FIELD to curl
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);

// getting response from server
$httpResponse = curl_exec($ch);
$httpResponse =  $request->request($API_Endpoint,array('method'=>'post', 'body'=>$nvpreq));


if(!$httpResponse) {
    exit("$methodName_ failed: "/*.curl_error($ch).'('.curl_errno($ch).')'*/);
}

// Extract the button response details
$httpResponseAr = explode("&", $httpResponse->body);

$httpParsedResponseAr = array();
foreach ($httpResponseAr as $i => $value) {
    $tmpAr = explode("=", $value);
    if(sizeof($tmpAr) > 1) {
        $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
    }
}

if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
    exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
}

return $httpParsedResponseAr;// an array we'll parse back in the calling function - currently using only websitecode. but in the future maybe also the email code

そして、これはwordpress http apiのコードです(これは正しく動作しません):

if (!class_exists('WP_Http')) {

    include_once ('c:/wamp/www/wp/wp-includes/class-http.php');
}

$request = new WP_Http;
$httpResponse =  $request->request($API_Endpoint,array('method'=>'post', 'body'=>$nvpreq));


if(!$httpResponse) {
    exit("$methodName_ failed: "/*.curl_error($ch).'('.curl_errno($ch).')'*/);
}

// Extract the button response details
$httpResponseAr = explode("&", $httpResponse->body);

$httpParsedResponseAr = array();
foreach ($httpResponseAr as $i => $value) {
    $tmpAr = explode("=", $value);
    if(sizeof($tmpAr) > 1) {
        $httpParsedResponseAr[$tmpAr[0]] = $tmpAr[1];
    }
}

if((0 == sizeof($httpParsedResponseAr)) || !array_key_exists('ACK', $httpParsedResponseAr)) {
    exit("Invalid HTTP Response for POST request($nvpreq) to $API_Endpoint.");
}
2
alonisser

あなたのオリジナルのコードを見て、私はあなたがsslverify引数を追加する必要があると思います。

ちなみに、自分でクラスをインスタンス化するのではなく、利用可能なHTTP関数を使用してください(手動でクラスをロードする必要はありません)。

wp_remote_post( $url, array(
    'sslverify' => false, // this is true by default!
    'body' => array( 
        'METHOD'    => $methodName, // if you're using an array, no need to URL encode
        'VERSION'   => $version,
        'PWD'       => $API_Password,
        'USER'      => $API_UserName,
        'SIGNATURE' => $API_Signature
    )
) );
2
TheDeadMedic