私は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.");
}
あなたのオリジナルのコードを見て、私はあなたが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
)
) );